career/qwestly/2026-10-linkedin-vietnamese-scrape-retry.md

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