Multi-Board Jobs — No Duplicates avatar

Multi-Board Jobs — No Duplicates

Pricing

from $1.80 / 1,000 job listings

Go to Apify Store
Multi-Board Jobs — No Duplicates

Multi-Board Jobs — No Duplicates

The same role found on two boards is one row and one charge. Blocked boards, empty searches and merged duplicates are never charged. One keyword across Indeed and any company's own hiring board, merged and de-duplicated into one feed.

Pricing

from $1.80 / 1,000 job listings

Rating

0.0

(0)

Developer

Steadyfetch Team

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

Never pay for a job we didn't deliver. One keyword across Indeed and any company's own hiring board, merged and de-duplicated into one feed. The same role found on two boards is one row — and one charge.

From $1.80/1,000 job listings — all-inclusive pay per event, no start fee, charged only on delivery. One price for the whole feed: no per-source fee, no per-search fee.

Every row carries charged and missReason, so you can reconcile the invoice from the dataset itself without opening the console. Only rows with charged: true were billed.


Output — a merged row

{
"title": "Senior Backend Engineer",
"company": "Acme",
"location": { "raw": "Berlin, Germany", "city": "Berlin", "region": null, "country": "Germany" },
"salary": { "min": 85000, "max": 115000, "currency": "EUR", "period": "year" },
"descriptionText": "…full description from the company's own board…",
"source": "greenhouse",
"sources": [
{ "board": "greenhouse", "jobUrl": "https://job-boards.greenhouse.io/acme/jobs/123", "applyUrl": "…", "postedAt": "2026-08-24T09:00:00.000Z", "salary": null },
{ "board": "indeed", "jobUrl": "https://www.indeed.com/viewjob?jk=…", "applyUrl": null, "postedAt": null, "salary": { "min": 85000, "max": 115000, "currency": "EUR", "period": "year" } }
],
"merged": true,
"duplicateCount": 1,
"dedupeConfidence": "high",
"dedupeKey": "mb:…",
"charged": true,
"missReason": null
}

Plus one coverage row per source and per company board (source, board, status, delivered, resolved, missReason) and one summary row with delivered, uniqueFound, duplicatesMerged, stoppedBy and chargedEvents.

See a real run's full output → — eight live jobs pulled from four different company boards in one run, plus the coverage row for each board and the summary. Every charged row is marked charged: true; nothing else is.

Agent / API paste-block

Actor: steadyfetch/multi-job-board-scraper
Required: query (job title/keyword, or a full Indeed search URL)
Optional: companies (array of company domains / careers URLs / board URLs / names)
sources (array: ["indeed","ats"], default both)
countries (array of ISO-2, default ["US"] — each is its own Indeed search)
location (string, e.g. "Austin, TX")
radiusKm (integer 1-160, needs a location — Indeed only)
dedupe (boolean, default true — merge the same role across boards)
postedWithinDays (integer, 1-30)
sortBy (relevance | date, default relevance — Indeed only)
remoteOnly (boolean, default false — filtered rows are never charged)
maxItems (integer, default 100 — hard cap on UNIQUE jobs)
maxItemsPerCompany (integer, default 200)
maxRunSeconds (integer, default 1200 — clean stop, never a timeout kill)
Charges: job-listing once per UNIQUE job after de-duplication
Note: omit a field to use its default — do NOT send null.
Token: https://console.apify.com/settings/integrations
curl -X POST "https://api.apify.com/v2/acts/steadyfetch~multi-job-board-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"query":"backend engineer","companies":["stripe.com","https://jobs.lever.co/leverdemo"],"countries":["US"],"maxItems":50}'

What it does

You give one keyword and, optionally, the companies you care about. The actor:

  1. searches Indeed for your keyword (across the countries you pick), and
  2. pulls each company's own hiring board — Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Rippling, Personio or Teamtailor — filtered to roles that match your keyword, then
  3. merges the same role found on more than one board into a single row, keeping every source link, and charges you once.

Company boards are how you reach roles that never appear on a job aggregator. About half of companies resolve from a bare domain (mid-market best; large enterprises mostly run their own Workday/Oracle, so paste a board URL for those). You are never charged for a company we cannot resolve.

The de-duplication, in plain terms

A "duplicate" is the same role — same company, same title, in an overlapping location — found on two different sources. When we find one, you get one row with a sources array listing every board it was on, duplicateCount, and a dedupeConfidence of high (matched on a shared city) or medium (matched on a country-wide or remote posting).

We tuned this on a corpus of real jobs to never delete a distinct job. When two roles at one company genuinely can't be told apart from an aggregator's single row, we keep them separate — tagged with a shared dedupeGroupId — rather than merge them and silently drop one. A wrong merge is a job you never see, so we always err on the side of showing you more.

Turn dedupe off and each board's copy is its own row (the identical posting fetched twice is still never charged twice).

Sources

  • Indeed — needs a keyword. United States, United Kingdom and Germany are verified end to end; any listing that comes back outside the country you asked for is reported, never charged.
  • Company boards (ATS) — need company domains. Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Rippling, Personio, Teamtailor — each the company's own documented public board.

Narrow with sources (for example ["ats"] to skip Indeed). Google Jobs is deliberately not a source — its jobs tab returns only ~10 rows per query with no way to page deeper, so it would add cost without adding coverage.

What you are never charged for

situationrun status
A board answered with an access check or rate limitSUCCEEDED — re-runnable, the coverage row says so
A company we could not resolve to a boardSUCCEEDED — uncharged, lists what was tried
A source ran and matched nothingSUCCEEDED — a real answer
A duplicate merged into another rowSUCCEEDED — charged once, not per board
An input we could not readSUCCEEDED — the row names the fix
Your own maxItems / maxRunSeconds / cost capSUCCEEDED — summary row names the knob

We never guess. An access check is reported as an access check, not as "no jobs found" — a temporary problem is never dressed up as a permanent verdict, and it is never charged.

This actor may fail when a board changes things. The two you are most likely to see are a board answering with an access check or rate limit, and a company we could not resolve to a hiring board. Both ship as a coverage row with charged: false, the run still SUCCEEDS, and the row says whether re-running helps.

FAQ

Does {} charge anything? No. With no keyword and no companies the run returns uncharged sample rows that show the exact output shape — including one merged row — and contacts no board.

Can I just scrape a company's whole board? Yes — pass the companies with sources: ["ats"]. For deep, unfiltered board pulls by domain, the sibling Career-Site Jobs — Paste a Domain is purpose-built for exactly that.

Why did a company return nothing? Either it has no live openings matching your keyword, or its board could not be positively identified from the domain — the coverage row tells you which, and neither is charged. Paste the board URL directly if you know it.


Steadyfetch jobs suite

One actor per source, one job each, the same row shape — so a pipeline built on one source takes the next without a rewrite. All-inclusive pay per event, no start fee, charged only on delivery.

SourceActor
IndeedIndeed Jobs — Stops at Your Limit
A company's own career site (paste a domain)Career-Site Jobs — Paste a Domain
Glassdoor, with the employer ratingGlassdoor Jobs + Employer Rating
Several boards at once, de-duplicatedthis actor

The rest of the steadyfetch shelf — same contract everywhere: all-inclusive pay per event, no start fee, charged only on delivery.

FamilyActors
Ad creative intelligenceFacebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR
Trends & keywordsGoogle Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends
YouTube transcriptsYouTube videos · YouTube channels
InstagramReel transcripts · Profile posts
JobsIndeed · Career sites by domain · Glassdoor · Multi-board
AmazonProducts · Search · Bestsellers · Sellers
Any media fileSpeech to Text · any link or file

Unlinked names are publishing shortly on the same account — search steadyfetch on Apify Store.