Remote Jobs Aggregator - 6 Boards, Ghost Job Filter avatar

Remote Jobs Aggregator - 6 Boards, Ghost Job Filter

Pricing

from $2.00 / 1,000 job returneds

Go to Apify Store
Remote Jobs Aggregator - 6 Boards, Ghost Job Filter

Remote Jobs Aggregator - 6 Boards, Ghost Job Filter

A job board aggregator for six remote boards in one call - Himalayas, Remote OK, Remotive, Arbeitnow, We Work Remotely and Jobicy - deduplicated across sources, with parsed salary data, normalised hiring regions and a ghost-job score flagging expired and stale job postings.

Pricing

from $2.00 / 1,000 job returneds

Rating

0.0

(0)

Developer

Dave Fergins

Dave Fergins

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

a day ago

Last modified

Share

Remote Jobs Aggregator

Every open remote job from six public job boards, on one schema, with each posting scored for how likely it is to still be real.

Six boards publish remote jobs in six different shapes. Remote OK calls the role position and dates it with a unix epoch; Remotive calls it title with an ISO string; We Work Remotely ships RSS with the company glued to the front of the title. Before you can search across them you have to reconcile all of that, and then work out which postings are still open.

This Actor does both, and hands you a flat dataset you can query.


What you get

Roughly 600 remote jobs on default settings, or ~1,000 with deeper paging, refreshed on every run. Each row carries:

Identitystable id across runs, source board, original posting URL, direct applyUrl where the board publishes one
The roletitle, company, plain-text description, category, tags, employment type, seniority
Whereremote flag, the board's own location text, normalised regions (worldwide / usa / canada / latam / uk / europe / apac / africa / middle_east), and any timezone restriction
Paymin, max, currency and period — parsed into numbers from whatever prose the board used
Whenposted date, expiry where published, and age in days
Trustfreshness 0–1, ghostRisk low/medium/high, and ghostReason explaining the verdict in plain words

The trust fields are the point

Aggregated job feeds are full of postings that are still published but no longer open: filled roles left up for pipeline, evergreen "talent pool" adverts, and boards that never expire anything. Paying per row for those is annoying.

Every posting gets a risk band and the reasons behind it:

{
"title": "Senior Backend Engineer",
"company": "Acme",
"freshness": 0.71,
"ageDays": 10.4,
"ghostRisk": "low",
"ghostReason": ["recent, and nothing contradicts it"]
}
{
"title": "General Application — Engineering Talent Pool",
"company": "Globex",
"freshness": 0.12,
"ageDays": 64.2,
"ghostRisk": "high",
"ghostReason": [
"posted 64 days ago",
"reads as an open/pipeline advert: talent pool"
]
}

The signals are computed from what the boards actually publish — age, the board's own expiry date, corroboration across boards, missing application links, and evergreen phrasing. Nothing is inferred by a model, and nothing claims certainty. You can set maxGhostRisk to filter, or ignore the field entirely and use the reasons yourself.

Freshness decays on a 21-day half-life. A posting with no date scores 0.5, not 1.0 — absence of evidence is not evidence of freshness.


Example input

Recent, well-paid, US-or-worldwide backend roles, nothing that smells stale:

{
"query": ["golang", "backend", "platform"],
"regions": ["usa"],
"seniority": ["senior", "lead", "principal"],
"maxAgeDays": 21,
"minSalary": 120000,
"salaryOnly": true,
"maxGhostRisk": "low",
"maxItems": 200
}

Everything is optional. Run it with no input at all and you get every remote job the six boards currently publish, best-first.

A few behaviours worth knowing:

  • Search terms are OR-ed. ["go", "rust"] returns jobs mentioning either, which is what a job search means in practice.
  • Worldwide jobs match every region filter, because a job open to everyone is open to you.
  • minSalary is annualised first, so hourly and monthly rates compare correctly against it.
  • maxAgeDays excludes rows whose age is unknown. If you ask for jobs under 14 days old, you should not get rows where nobody published a date.
  • maxItems is your cost ceiling — you are billed per job returned.

Sources

BoardWhat it adds
Remote OKbroad, global, tech-weighted
Remotivecurated, strong salary coverage
Himalayasthe only board publishing explicit expiry dates and numeric timezone restrictions
ArbeitnowEurope-weighted, by far the largest single feed
We Work Remotelylong-running, well-known employers
Jobicycleanest structured salary data

All six are public, documented, unauthenticated APIs or feeds. This Actor does not scrape HTML, defeat a bot check, or touch personal data — these are employer-published job adverts, fetched the way each board asks to be fetched, with a paced, budgeted request pattern and an honest user agent.

Listings from Remote OK are used under their API terms, which require a followed link back — the run report carries the required credit line for every board included.

One thing the data says that you might expect otherwise

These boards barely overlap. Measured across a full live run: 1.7% of employers, and exactly 1 of 1,513 company+title pairs, appear on more than one board.

So this is not a tool that saves you from wading through the same job six times — there is almost no duplication to remove. It is a tool that gets you six boards' worth of distinct jobs in one shape and one query, which is the more useful thing anyway. Duplicates are still folded when they do occur (including repeats within a single board, which are more common), and seenOn tells you every board carrying a row.


Output

One dataset item per job. Two prebuilt views: Jobs (every field) and Shortlist (the columns you scan when shortlisting). Both views show every row the run published — a view picks columns, not rows, so to keep only the postings nothing contradicts, set maxGhostRisk to low on the run itself. Export as JSON, CSV, Excel or via the API like any Apify dataset.

If a board fails, the run does not: the other five still publish, and the failure is named explicitly in the log and the run report rather than quietly reducing your row count.


Common uses

  • One deduplicated remote job dataset instead of six. This is a job board aggregator: six boards fetched, normalised onto one schema, and folded across sources. seenOn lists every board carrying a job, sourceCount counts them and duplicateIds names the copies folded into the row — so you can prove the dedup rather than trust it.
  • Filtering out expired and stale job postings. ghostRisk, ghostReason and freshness say which listings are probably no longer open, so you can drop them before anyone wastes an application.
  • Salary benchmarking and compensation data. salaryMin, salaryMax, salaryCurrency and salaryPeriod are numbers, not strings, and minSalary annualises before comparing — so hourly, monthly and yearly postings line up across boards that state pay differently.
  • Remote job market and hiring data. Run it on a schedule and track how remote hiring, salary ranges, seniority mix and regions move over time, across the whole set rather than one board's slice.
  • Building a job board, job feed or job alerts. id is stable across runs and across sources, so diffing today's dataset against yesterday's gives you genuinely new jobs rather than a board reshuffle.
  • Recruitment and talent research. Company, title, tags, category, seniority, employment type and normalised regions on every row.

Export as JSON, CSV or Excel, or read the dataset straight from the Apify API.

Not included, deliberately

  • No LinkedIn, Indeed or Glassdoor. Those need scraping against active bot defences and, for profile data, raise real GDPR and CCPA questions. Everything here is a published open API.
  • No contact details, no candidate data. Job adverts only.
  • No guess-work in empty fields. A blank seniority means the source never said, not that the job is mid-level. A blank salary means unpublished, not zero.

Running it yourself

The Actor is a single static Go binary with no third-party dependencies, and it runs identically off-platform:

go test ./...
go run ./cmd/actor # reads ./INPUT.json if present, writes NDJSON to stdout
go run ./cmd/probe # per-board health and field coverage
go run ./cmd/probe -overlap # measure how much the boards actually duplicate each other

cmd/probe exists because these are six third-party feeds that change without notice. When a board silently renames a field the Actor does not crash — it quietly publishes rows with an empty company, or a zero date that scores as maximally fresh. The probe reports per-field coverage so that gets caught before a buyer pays for it.