Remote Jobs Aggregator - Remote OK & Jobicy, Ghost Job Filter
Pricing
from $2.00 / 1,000 job returneds
Remote Jobs Aggregator - Remote OK & Jobicy, Ghost Job Filter
Remote jobs aggregator for Remote OK and Jobicy in one run - deduplicated across sources, with parsed salary, normalised hiring regions and a ghost-job score flagging expired and stale postings.
Pricing
from $2.00 / 1,000 job returneds
Rating
0.0
(0)
Developer
Dave Fergins
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
a day ago
Last modified
Categories
Security
Limited permissionsShare
Remote Jobs Aggregator
Remote jobs aggregator for Remote OK and Jobicy in one run - deduplicated across sources, with parsed salary, normalised hiring regions and a ghost-job score flagging expired and stale postings.
Sources changed on 23 October 2026: Remotive, We Work Remotely, Arbeitnow, Himalayas and Dice have been withdrawn, so this Actor now reads Remote OK and Jobicy. A saved input that names a withdrawn board skips it; an input naming only withdrawn boards stops before fetching anything and is not charged.
Remote OK and Jobicy publish remote jobs in two different shapes: different field names for the role and the company, different date formats, and different ways of stating pay and location. 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.
Remote jobs from Remote OK and Jobicy: what you get
Up to about 110 remote jobs a run, refreshed on every run: about 10 from Remote OK once the rows that are not remote work are filtered out, and up to 100 from Jobicy, which caps its feed at 100 per request. Each row carries:
| Identity | stable id across runs, source board, original posting URL, direct applyUrl where the board publishes one |
| The role | title, company, plain-text description, category, tags, employment type, seniority |
| Where | remote flag, the board's own location text, normalised regions (worldwide / usa / canada / latam / uk / europe / apac / africa / middle_east), and any timezone restriction |
| Pay | min, max, currency and period — parsed into numbers from whatever prose the board used |
| When | posted date, expiry where published, and age in days |
| Trust | freshness 0–1, ghostRisk low/medium/high, and ghostReason explaining the verdict in plain words |
Ghost job detection: 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: well-paid senior backend roles from both boards, nothing stale
{"query": ["golang", "backend", "platform"],"regions": ["usa"],"seniority": ["senior", "lead", "principal"],"sources": ["remoteok", "jobicy"],"maxAgeDays": 21,"minSalary": 120000,"salaryOnly": true,"maxGhostRisk": "low","maxItems": 200}
Every field is optional. Run it with no input at all and you get the remote jobs Remote OK and Jobicy 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.
sourcespicks boards. Leave it empty for both; nameremoteokorjobicyalone for one board and a smaller, cheaper run.minSalaryis annualised first, so hourly and monthly rates compare correctly against it.maxAgeDaysexcludes rows whose age is unknown. If you ask for jobs under 14 days old, you should not get rows where nobody published a date.maxItemsis your cost ceiling — you are billed per job returned.
Remote job boards covered: Remote OK and Jobicy
| Board | What it adds |
|---|---|
| Remote OK | broad, global, tech-weighted |
| Jobicy | cleanest structured salary data |
Both are public, documented, unauthenticated JSON feeds. Remotive, Himalayas, Arbeitnow, We Work Remotely and Dice were read by earlier versions and were withdrawn on 23 October 2026; this Actor no longer requests them. 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 its API terms, which require a link back to the original posting and a credit naming the board. Every row keeps its posting's URL on the source board in url and names the board in source, and every run's log prints the credit line for each board included. Read a board's terms before showing its jobs elsewhere.
Remote OK and Jobicy barely overlap: what the data says
These boards barely overlap. Measured across a full live run when this Actor read six boards, Remote OK and Jobicy among them: 1.7% of employers, and exactly 1 of 1,513 company+title pairs, appeared on more than one board.
So this is not a tool that saves you from wading through the same job twice — there is almost no duplication to remove. It is a tool that gets you both boards' 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 remote job
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 still publishes, and the failure is named explicitly in the log and the run report rather than quietly reducing your row count. If every selected board fails or comes back empty, the run fails with a clear status message instead of succeeding with an empty dataset, so a failed-run alert on a schedule catches it. A run whose filters match nothing still succeeds, with an empty dataset; its status line says so and names any boards that failed or were empty.
Remote jobs aggregator pricing: a worked cost example
You pay per job returned, on Apify's pay-per-event model, and nothing for platform usage on top: $0.006 per job on the Free and Bronze plans, $0.003 on Silver, $0.002 on Gold, Platinum and Diamond. Rows dropped by your filters or folded as duplicates are never billed, and a run that returns nothing costs nothing.
| Run | Jobs returned | Free / Bronze | Silver | Gold and above |
|---|---|---|---|---|
| A full default run: both boards, about 110 jobs | 110 | $0.66 | $0.33 | $0.22 |
A run capped with maxItems: 50 (at most) | 50 | $0.30 | $0.15 | $0.10 |
| A run whose filters match nothing | 0 | $0.00 | $0.00 | $0.00 |
maxItems is the hard ceiling: maxItems: 200 can never cost more than $1.20 on the Free plan. Fewer sources and tighter filters bring a run down further, and Apify's free plan includes a monthly usage credit, so a first run costs nothing out of pocket.
Use cases for remote job data from Remote OK and Jobicy
- One deduplicated remote job dataset instead of two. This is a job board aggregator: two boards fetched, normalised onto one schema, and folded across sources.
seenOnlists every board carrying a job,sourceCountcounts them andduplicateIdsnames the copies folded into the row — so you can prove the dedup rather than trust it. - Filtering out expired and stale job postings.
ghostRisk,ghostReasonandfreshnesssay which listings are probably no longer open, so you can drop them before anyone wastes an application. - Salary benchmarking and compensation data.
salaryMin,salaryMax,salaryCurrencyandsalaryPeriodare numbers, not strings, andminSalaryannualises 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.
idis 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.
How to get remote jobs from Remote OK and Jobicy with this Actor
- Open the Actor and press Start. With no input it returns the remote jobs both boards currently publish, best-first: up to about 110 jobs.
- Narrow it when you need to: search terms, hiring regions, seniority, a minimum salary, a maximum ghost-job risk,
sourcesto pick boards, andmaxItemsas a hard cost ceiling. - Export the dataset as JSON, CSV or Excel, read it through the Apify API, or schedule the run and attach a webhook or an integration (Google Sheets, Make, Zapier, Slack) so new remote jobs arrive on their own.
Related Actors: one board at a time
Each board is also published on its own, on the same schema, when you only need one source:
- RemoteOK Remote Jobs Scraper — genuinely remote developer jobs, the on-site leakage filtered out
- Jobicy Remote Jobs Scraper — the cleanest structured salary data for benchmarking
All three share one schema, one ghost-job model and one set of filters, so a query written here runs unchanged against either single board.
FAQ: scraping remote jobs from Remote OK and Jobicy
Which remote job boards does this aggregator cover? Remote OK and Jobicy: two public boards with documented, unauthenticated feeds. Remotive, Himalayas, Arbeitnow, We Work Remotely and Dice were withdrawn on 23 October 2026 and are no longer read. No LinkedIn, Indeed or Glassdoor, deliberately (see below).
How many remote jobs can one run return?
Up to about 110: about 10 from Remote OK once the rows that are not remote work are filtered out, and up to 100 from Jobicy, which caps its feed at 100 per request. maxItems caps the total.
Is it a remote jobs API I can call directly?
Yes. Every Apify Actor runs from the API as well as the Console: start a run, then read the dataset as JSON or CSV. Schedule it and diff runs on the stable id to get only new jobs.
How do I get only fresh, still-open remote jobs?
Set maxGhostRisk to low and maxAgeDays to 14 or 21. Every row also carries ghostReason, the plain-language grounds for its rating, so you can apply your own rule instead.
What is a ghost job?
A posting that is still published but no longer open: a filled role left up for pipeline, an evergreen "talent pool" advert, or a listing on a board that never expires anything. The ghostRisk band and freshness score flag them from what the boards themselves publish — age, expiry dates, corroboration across boards, missing application links, evergreen phrasing — never from a model's guess.
Does it include salary data?
Where a board publishes pay, yes: salaryMin, salaryMax, salaryCurrency and salaryPeriod are parsed into numbers and minSalary annualises before comparing. Jobicy states pay most often; set salaryOnly to keep only rows that carry it.
How much do the two boards overlap?
Barely. Measured across a full live run when this Actor read six boards, 1 of 1,513 company+title pairs appeared on more than one board. The value is both boards' distinct jobs in one shape, and seenOn records every board carrying a row when overlap does occur.
Do I need proxies, a login or an API key? No. Each board is read the way it asks to be read, and Apify runs the Actor for you; nothing to install and no credentials to manage.
Can I export remote jobs to CSV, Excel or Google Sheets? Yes. Every run's dataset downloads as JSON, CSV or Excel from the Apify Console or API, and the Google Sheets integration writes rows straight into a sheet.
Is this a remote job scraper I can run as an API? Yes. Apify runs every Actor from its API as well as the Console: start a run over HTTP with the same JSON input shown above, or put it on a schedule, then read the finished dataset as JSON, CSV or Excel. The dataset is the output; there is no separate query endpoint, so a scheduled run plus a dataset read is the API.
Can an AI agent use this remote jobs aggregator? Yes, through Apify's own MCP server, which exposes Store Actors as tools to Claude and other MCP clients. Nothing here is agent-specific: the agent sends the same JSON input and reads the same dataset.
How do I drop expired job listings?
Set maxGhostRisk to low or medium and they are dropped before they are returned, so you do not pay for them. Every row that is returned carries ghostRisk (low, medium or high), ghostReason (the plain-language grounds, such as "board's own expiry date passed 3 days ago" where a board publishes expiry dates, or "posted 64 days ago") and freshness (0-1, decaying on a 21-day half-life, 0 once a published expiry date has passed), so you can apply your own rule after export instead. maxAgeDays drops anything older than N days, including rows with no posted date.
What does a job row not contain?
No visa-sponsorship flag, no applicant counts, no recruiter emails or any personal data, and no company size — the boards do not publish them in their feeds, so they are not invented here. A blank seniority means the source never said; a blank salary means unpublished, not zero.
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
senioritymeans 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 stdoutgo run ./cmd/probe # per-board health and field coveragego run ./cmd/probe -overlap # measure how much the boards actually duplicate each other
cmd/probe exists because these are third-party feeds that change without notice. When a board silently renames a field the rows still arrive, just with an empty company or no posted date, so the Actor logs a WARNING when fewer than half of a board's rows carry either. A payload whose shape is wrong (a response that is not the JSON list the board documents) fails that board's fetch outright. The probe reports per-field coverage so a change gets caught before a buyer pays for it.