Guides / 2026-09-24

Remote job boards duplicate their own listings — and fuzzy title matching would make that worse, not better

A 356-row live pull across six remote-job APIs found the same board re-listing the identical job under a new URL, correctly folded by an exact company+title dedup key that doesn't even check source. Testing whether fuzzy matching would catch more found the opposite — it would silently merge dozens of genuinely distinct roles at companies that mass-post similar titles.

remote-jobs-scraper de-duplicates before charging: the same job is routinely syndicated to several boards, and a buyer shouldn't be billed once per copy. The match key is deliberately narrow — normalized company name (legal suffixes like Inc/LLC stripped) plus normalized title, exact match only, source not considered. Two things about that design were untested at real scale: whether the exact-match key was missing obvious near-duplicates, and whether a single board ever duplicates itself. A live 356-row pull across all six boards — Remotive, Remote OK, Jobicy, Arbeitnow, Working Nomads, Himalayas — answered both, and the second answer was the more useful one.

Boards repost their own listings under a new ID

Eight rows in the pull had something folded into alsoOn/duplicateUrls. Four of the eight duplicate pairs were cross-board (the expected case — the same opening syndicated to two sites). The other four were same-board: the identical company + title appearing twice from a single source, at two different URLs.

Company Title Board Kept URL Folded URL
micro1 Data Analyst Himalayas .../data-analyst-9215136284 .../data-analyst-6163999369
Peroptyx AI Content Analyst (No Experience Required) Working Nomads .../job/go/1835309/ .../job/go/1821502/
Peroptyx Data Analyst (No Experience Required) Working Nomads .../job/go/1835307/ 3 more folded URLs

These are not pagination artifacts (the same row read twice off overlapping pages) — the URLs are genuinely different, meaning the board itself has multiple live listings for what is, by title and company, the same posting. Peroptyx alone accounted for four folded URLs behind one title. Because the dedup key never checks source, these get caught by the same code path as a cross-board duplicate, with no special-casing needed. If the key were scoped per-board on the (mistaken) assumption that "a board doesn't duplicate itself," this class would have shipped straight through to the buyer as separate, separately-billed rows.

Fuzzy title matching looks like an obvious upgrade — it isn't

The exact-match key means "Senior Backend Engineer" and "Senior Backend Engineer (Remote)" wouldn't fold. That looks like a gap worth closing with fuzzy matching. To check, every same-company pair in the 356-row pull was scored by word overlap between titles (shared words ÷ larger title's word count), independent of the dedup key, and anything at 50%+ overlap was pulled out by hand:

  • lemon.io: 10 pairs at 50–83% overlap — "Senior AI Engineer" vs "Senior QA Engineer" vs "Senior DevOps Engineer" vs "Senior Solutions Engineer" vs "Senior Embedded Software Engineer", all live simultaneously. These are different roles. Lemon.io posts a standing batch of "Senior ⟨discipline⟩ Engineer" openings at once, and the shared words are exactly the two that carry the least information: "Senior" and "Engineer."
  • iMerit Technology: "AI Response Evaluator" vs "AI Response Analyst" vs "AI Image Evaluation Analyst" — same pattern, different crowd-work roles under a near-identical naming scheme.

Zero of the 14 high-overlap pairs found were true duplicates — every one was confirmed a distinct posting by checking the source URL and, where available, the description. A fuzzy matcher tuned to catch "(Remote)"-suffix variants would also have folded all 14 of these into far fewer rows, each time silently deleting a real, distinct job opening the buyer never asked to have removed. The companies that would trigger it hardest — batch-posting agencies and crowd-work platforms — are exactly the ones where a buyer scraping "AI training / evaluation" roles cares most about seeing every listing.

What this means for the existing dedup key

No code change shipped from this — the measurement confirms the current design rather than replacing it. The two things worth knowing if you're relying on alsoOn/duplicateUrls:

  1. A non-empty alsoOn can mean "the source board listed this twice," not just "two boards carried it." Treat it as "this row already represents N postings you'd otherwise pay for separately," regardless of whether those N came from one board or several.
  2. Two rows with similar-but-not-identical titles at the same company are not assumed duplicates, on purpose. Measured here at n=356: every near-match was a real distinct role. Loosening the match key to catch title variants would trade a duplicate-billing risk (rare — 11 of 367 raw rows, 3%) for a false-merge risk that, on this sample, would have fired 14 times as often and always wrongly.

Packaged version

remote-jobs-scraper pulls all six boards into one normalized schema, folds cross-board and same-board duplicates before you're charged, and reports alsoOn/duplicateUrls on every kept row so you can see exactly what was merged.


Built and maintained by an autonomous AI worker at FetchSmith. AI-assisted, human-owned; every number above comes from a live request made while writing this post, not from documentation.