Remote Jobs Scraper — RemoteOK Remotive WWR
Pricing
Pay per usage
Remote Jobs Scraper — RemoteOK Remotive WWR
One scraper, three remote job boards: RemoteOK, Remotive and WeWorkRemotely. Get fresh remote-only openings as clean JSON — title, company, category, salary and apply URL — deduplicated across boards. Perfect for remote job boards, alert bots and hiring research.
Fetch live remote-only job listings from RemoteOK, Remotive and WeWorkRemotely in a single run, merged into one clean dataset.
What remote jobs data does this scraper extract?
Each result is one flat JSON record per job posting:
| Field | Meaning |
|---|---|
source | Board the listing came from — remoteok, remotive or weworkremotely |
id | Stable source-side identifier |
title | Job title as posted |
company | Hiring company / organisation |
location | Location / duty station (may include remote hints) |
url | Direct link to the posting |
postedAt | Posting date where the source provides it; null when absent |
salary | Salary text where the source provides it; null when absent (WeWorkRemotely feeds never include salary) |
snippet | Short description excerpt |
tags | Source-provided tags/skills list (may be empty) |
category | Job category — Remotive only; not present for other sources |
How to scrape remote jobs with this Actor
- Click Try for free / Run — no login to the target site, no cookies, no proxies to configure.
- Adjust the input (
keyword,titleExclude,postedSince, board toggles,maxItems) or keep the defaults. - Run it and export the dataset as JSON, CSV or Excel, or read it over the API.
Run it from your own code:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("nomad-agent/remote-boards-scraper").call(run_input={"maxItems": 50})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], "—", item["company"], item["url"])
Or a single HTTP call that runs the Actor and returns items in one response:
curl -X POST \"https://api.apify.com/v2/acts/nomad-agent~remote-boards-scraper/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"maxItems": 50}'
Input
| Field | Type | Default | Notes |
|---|---|---|---|
keyword | string | "" | Optional case-insensitive substring matched against job title and company name. Leave empty to return all listings. |
titleExclude | array | [] | Skip listings whose title or company contains any of these case-insensitive terms. Exclusion twin of keyword above. |
postedSince | integer | 0 | Only return listings posted within this many days (max 365). Applied client-side after fetch — see note below. Set 0 to disable and return all fetched listings regardless of age. |
enableRemoteOK | boolean | true | Scrape listings from RemoteOK. |
enableRemotive | boolean | true | Scrape listings from Remotive. |
enableWeWorkRemotely | boolean | true | Scrape tech/programming listings from WeWorkRemotely (Full-Stack, Back-End, Front-End, DevOps/SysAdmin). |
maxItemsPerSource | integer | 50 | Maximum number of listings to return from each enabled board (max 500). Each item returned is a billed dataset result. Set 0 for no limit (not recommended). |
maxItems | integer | 150 | Hard cap on the total number of listings returned across all boards (max 1000). Each item returned is a billed dataset result. Set 0 for no limit (not recommended). |
cacheTtlSeconds | integer | 1800 | Advanced. Reuse a fetch from this many seconds ago instead of hitting the source board again on rapid re-runs. Set 0 to always fetch live. |
Billing note:
maxItemsPerSourceandmaxItemsused to default to0(unlimited) — a single run merges three full remote-job-board feeds, so an unbounded run could bill for every listing on all three boards. They now default to50per source /150total. If you're an existing caller who relied on the old unlimited behavior, pass these explicitly (up to the new maximums of500/1000) — nothing changed for callers who already set them.
postedSinceis a client-side filter: none of the three source feeds accept a server-side date parameter, so the actor fetches the live feed and then drops listings older than N days by parsing each source's ownpostedAtformat (RemoteOK/Remotive: ISO 8601; WeWorkRemotely: RSSpublisheddate). A listing with a date the actor can't parse is kept rather than silently dropped.
Output example
{"source": "remotive","id": "1934582","title": "Backend Engineer (Go)","company": "Chili Piper","location": "Worldwide","url": "https://remotive.com/remote-jobs/software-dev/backend-engineer-1934582","postedAt": "2026-06-29T07:00:00","snippet": "Fully remote backend role...","salary": "$90k–$120k","category": "Software Development","tags": ["go", "backend"]}
Integrations
Export the dataset as JSON, CSV or Excel from the Console, pull it over the Apify API (including run-sync-get-dataset-items for a single blocking call), wire it into Make/Zapier/n8n, or drive it from an AI agent via the Apify MCP server.
Pricing
Pay per event: $0.05 per Actor start and $0.004 per job returned.
100 jobs ≈ $0.45. No subscription, no rental — you pay only for what you fetch. Raising maxItemsPerSource / maxItems directly raises how many billed results a run can produce.
Use cases
- Remote-job boards and newsletters
- Job-alert bots for remote-first candidates
- Remote-hiring market research
- Feeding AI matching agents with remote-only supply
FAQ
Is it legal to scrape remote jobs? This Actor reads only publicly available job postings — data any visitor can see without logging in. No personal data behind authentication is touched. Review the target site's terms and your local regulations for your specific use case.
Do I need an account on the target site? No. Postings are fetched from public pages/APIs — no login, cookies or session tokens.
How fresh is the data?
Every run fetches live listings. Results are cached for cacheTtlSeconds (default 30 min, set 0 to always hit the source live). Use postedSince to additionally filter out listings older than N days.
How many jobs can I get?
maxItemsPerSource (default 50, max 500) and maxItems (default 150, max 1000) cap the run. Set either to 0 for no limit — not recommended, since every returned item is a billed dataset result and this Actor merges three full remote-job-board feeds.
Something broken or missing? Open an issue on the Actor's Issues tab — it is monitored and reliability fixes ship fast.