Remote Jobs Scraper $2/1K — RemoteOK, Remotive, WWR, Himalayas
Pricing
from $1.60 / 1,000 job results
Remote Jobs Scraper $2/1K — RemoteOK, Remotive, WWR, Himalayas
4 remote job boards in one run: RemoteOK, Remotive, WeWorkRemotely, Himalayas. $2/1,000 jobs — cheapest multi-board aggregator. Deduplicated JSON with title, company, salary, apply URL. Delta mode bills each posting once; webhook delivery built in. Made for job-alert bots and hiring research.
Pricing
from $1.60 / 1,000 job results
Rating
0.0
(0)
Developer
Nomad.Dev
Maintained by CommunityActor stats
0
Bookmarked
8
Total users
5
Monthly active users
7 hours ago
Last modified
Categories
Share
Fetch live remote-only job listings from 4 remote job boards — RemoteOK, Remotive, WeWorkRemotely and Himalayas — in a single run, merged and deduplicated into one clean dataset.
Two features no other remote-jobs scraper on the Store offers:
- Delta mode (
onlyNewSinceLastRun) — on a schedule, each posting is returned and billed exactly once. Perfect for job-alert bots and newsletters. - Webhook delivery (
webhookUrl) — the run POSTs results straight to your endpoint, no dataset polling needed.
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, weworkremotely or himalayas |
id | Stable source-side identifier |
title | Job title as posted |
company | Hiring company / organisation |
companyLogo | Company logo URL where the source provides one (RemoteOK, Remotive, Himalayas); null for WeWorkRemotely |
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) |
salaryMin / salaryMax | Structured salary range bounds — populated for RemoteOK (API exposes numeric salary_min/salary_max) and Himalayas (API exposes numeric minSalary/maxSalary); null for Remotive (free-text salary field only, no numeric fields to parse) and WeWorkRemotely (no salary data at all) |
salaryCurrency | Currency for salaryMin/salaryMax — "USD" for RemoteOK (submitted as annualized USD-equivalent); Himalayas' reported currency otherwise (may be null); null for Remotive/WeWorkRemotely |
salaryPeriod | Pay period for salaryMin/salaryMax — "year" for RemoteOK, normalized to "year" for Himalayas' annual ranges; null otherwise |
jobType | Employment type where provided — Remotive (job_type) and Himalayas (employmentType); null for RemoteOK/WeWorkRemotely |
snippet | Short description excerpt |
tags | Source-provided tags/skills list (may be empty) |
category | Job category — Remotive and Himalayas; null for RemoteOK/WeWorkRemotely |
scrapedAt | ISO-8601 UTC timestamp of when the run fetched the listing |
Zero-result sentinels: if an enabled board returns nothing (temporarily down, blocked, or empty feed), the run emits one small diagnostic row for that board (_sentinel: true, warning, docs) instead of silently dropping it. Sentinel rows are not billed.
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). |
enableHimalayas | boolean | true | Scrape listings from Himalayas (himalayas.app) — exposes numeric salary ranges, company logo and employment type. |
onlyNewSinceLastRun | boolean | false | Delta mode. Return only listings not emitted by previous runs (identity remembered in a named key-value store). Ideal for scheduled job-alert runs — each posting is returned and billed once. |
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 (values above 2000 are clamped). 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. |
webhookUrl | string | "" | Advanced. Optional HTTPS endpoint. When set, the run POSTs its listings there in batches of 50 as JSON ({items, offset, count, total}) after writing them to the dataset. Best-effort — a webhook failure is logged but never fails the run. |
webhookSecret | string | "" | Advanced. Optional shared secret sent as the X-Webhook-Secret header on each webhook POST so your endpoint can verify the caller. |
Billing note: each returned listing is a billed dataset result. A single run merges four full remote-job-board feeds, so
maxItemsPerSource(default50, max500) andmaxItems(default150, max2000) cap the cost — set either to0for no limit, but expect hundreds of listings per board on an unbounded run.
postedSinceis a client-side filter: none of the four 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","companyLogo": "https://remotive.com/job/1934582/logo","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","salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryPeriod": null,"jobType": "full_time","category": "Software Development","tags": ["go", "backend"],"scrapedAt": "2026-07-06T09:15:00+00:00"}
RemoteOK and Himalayas records carry the numeric salary fields too, since both APIs expose numeric min/max salary directly:
{"source": "himalayas","salary": "$157k–$175k","salaryMin": 157500,"salaryMax": 175000,"salaryCurrency": "USD","salaryPeriod": "year","jobType": "Full Time","companyLogo": "https://cdn-images.himalayas.app/..."}
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.005 per Actor start and $0.002 per job returned ($2 per 1,000 jobs — volume discounts bring it down to $1.60/1,000 on higher Apify plans).
100 jobs ≈ $0.21. No subscription, no rental — you pay only for what you fetch. This is the cheapest 4-board remote-jobs aggregator on the Apify Store — comparable multi-board scrapers charge $3–15 per 1,000 results. Combine with onlyNewSinceLastRun and you never pay for the same posting twice.
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.
Can I get only jobs I haven't seen before?
Yes — enable onlyNewSinceLastRun. The actor remembers every listing it has emitted (by deduplicated identity, persisted in a named key-value store) and returns only postings not seen in earlier runs. Combined with a schedule, each posting is returned and billed exactly once — ideal for feeding a job-alert bot.
Can it push results to my endpoint?
Yes — set webhookUrl (and optionally webhookSecret). After writing to the dataset, the run POSTs listings to your URL in batches of 50. Delivery is best-effort and never fails the run.
How many jobs can I get?
maxItemsPerSource (default 50, max 500) and maxItems (default 150, max 2000) 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 four 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.
Finding this Actor useful? A quick ⭐ review on the Store page helps other remote-job hunters discover it — and tells us what to build next.