career/qwestly/2026-10-linkedin-vietnamese-scrape-retry.md
Table of Contents
Kept Vietnamese-language LinkedIn scrapes out of members' profiles
Situation
From 2026-09-26 our LinkedIn data vendor (RapidAPI) began returning some profiles scraped from a Vietnamese-language LinkedIn page. Durations came back as "4 nฤm", and roles grouped under one employer lost their company. We cached each one for 30 days, and every LinkedIn-based feature read from that cache. A co-founder trying the free LinkedIn writer was told his roles had no company and had "5 nฤm" explained to him. He left after one edit.
What I did
- Traced the session back to the raw scrape, and showed it came from the vendor rather than our parsing: the same username fetched 10 hours later came back clean.
- Sized it in production: 7 of 393 cached profiles affected, all scraped since 2026-09-26. Checked which of the 7 sessions on those profiles exposed it (only one).
- Dropped the three scrape fields that came back localized and that nothing reads (role durations, the current job's duration, education descriptions) (candidate#1218). This took three iterations. The first retried the scrape as a failure. Looking at the affected profiles, I saw most were fine apart from the dates, so the second translated them and refreshed in the background. The third confirmed nothing downstream reads those fields and dropped them: no language word lists, no extra paid credits, no false positives.
- Replayed it over all 393 production profiles: 46 of 52 Vietnamese strings gone, nothing else changed. Flagged the two remaining kinds as separate problems: the localized workplace type in a role's location, which reached one member's profile, and grouped roles losing their company, which got its own ticket.
- Added the scraped data to the conversation trace tool, so the next case like this takes minutes to diagnose.
Result
Pending: released 2026-10-15; re-measure after a month of new scrapes.
Metrics
| Metric | Baseline (2026-10-15) | Target | Latest |
|---|---|---|---|
Cached linkedin_profiles with a Vietnamese duration |
7 / 393 (1.8%) | none served by the API after release | pending |
| Sessions where Vietnamese scrape data reached the agent | 1 of 7 sessions on affected profiles | 0 | pending |
How to measure
Read-only, against production (admin env): count linkedin_profiles rows where
data.experiences.duration matches /nฤm|thรกng/. Split them by updated_at before and after the
release date. After the release a row should only stay Vietnamese if nobody has read it since. The candidate logs show each refresh as [linkedin-profile] refreshed a Vietnamese-locale scrape with stillVietnamese, which gives how often a refresh fixes it. scripts/trace-conversation.sh <id> flags non-English durations for a
single session.
Log
- 2026-10-15: diagnosed from a pre-auth session; baseline taken (7/393); candidate#1218 opened; ticket https://app.asana.com/1/1208967535790507/project/1216663810328535/task/1219549879330067
- 2026-10-15: candidate#1218 (localized fields dropped) and #1219 (workplace type mapped) released to production; migration mapped the 3 stored values. Ticket marked Deployed.