Remote Jobs Scraper - We Work Remotely, RemoteOK, Himalayas avatar

Remote Jobs Scraper - We Work Remotely, RemoteOK, Himalayas

Pricing

from $0.90 / 1,000 jobs

Go to Apify Store
Remote Jobs Scraper - We Work Remotely, RemoteOK, Himalayas

Remote Jobs Scraper - We Work Remotely, RemoteOK, Himalayas

Search remote jobs on We Work Remotely, RemoteOK, Himalayas, Jobicy and Arbeitnow via official APIs/feeds, de-duplicated. Input: keywords, boards, locations, job types, min salary, posted within. Returns per job: title, company, location, salary, date, source, URL. Default: 20 jobs. $0.90/1k.

Pricing

from $0.90 / 1,000 jobs

Rating

0.0

(0)

Developer

Bence Kadi

Bence Kadi

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

18 days ago

Last modified

Share

Remote Jobs Scraper: We Work Remotely, RemoteOK, Himalayas, Jobicy & Arbeitnow jobs in one feed

What is Remote Jobs Scraper?

Remote Jobs Scraper collects remote job listings from five job boards, We Work Remotely, Himalayas, Remote OK, Jobicy and Arbeitnow, and returns them in one clean, de-duplicated dataset. You type keywords such as python or customer support, and you get JSON, CSV or Excel with title, company, where candidates may live, job type, salary range, tags, posted date, job link and description.

It reads each board's official free public API or RSS feed. There is no browser, no login and no proxy, so runs are fast and cheap.

What makes it different

  • 5 remote job boards, 1 schema. The same fields for every board, so you can sort, filter and merge without cleanup.
  • Cross-board de-duplication. The same job (same company and title) on two boards comes back once. The other board's link is kept in alsoListedOn.
  • Salary included. Structured pay where the board publishes it; ranges in Arbeitnow descriptions are parsed from the text.
  • Filters that work across boards: keywords, categories, candidate location or region, job type, posted date, minimum salary.
  • Only new jobs. Monitoring mode outputs, and charges for, only jobs you haven't seen before.
  • Attribution built in. Every job has source, sourceUrl, the original job url and a ready-to-show attribution line, which is what these boards ask for when you reuse their jobs.
  • No personal data. E-mail addresses and phone numbers are removed from descriptions.

Use cases: Generate leads (build B2B prospect lists, lead enrichment & validation) · Research markets & competitors (track competitors, build market datasets, track trends, profile companies & due diligence) · Developer tools (monitor & alert on website changes).

Use cases

  • Remote job boards, newsletters and Slack/Discord job channels: a daily feed of fresh remote jobs with links back to the source.
  • Job alerts for yourself or your community: "remote Python jobs open to Europe paying 80k+", every morning.
  • Recruiting and talent market research: which companies hire remotely, for which roles, in which regions, at what pay.
  • Sales and lead generation (hiring signals): companies hiring remote engineers, marketers or support staff right now.
  • AI agents and automation: structured remote-job data via the API or the Apify MCP server.

Data fields you get

FieldDescriptionExample
titleJob titlePeople Operations Coordinator
companyEmployerAshby
companyUrlCompany profile (Himalayas) or company website (We Work Remotely)https://himalayas.app/companies/ness-usa-inc
locationWhere candidates may live (first value)USA
locationsAll countries or regions the job is open to["USA"]
isWorldwidetrue when the job is open to candidates anywherefalse
workModeremote, or hybrid/onsite (Arbeitnow, remoteOnly off)remote
employmentTypefull-time, part-time, contract, freelance, internship, temporary or volunteerfull-time
seniorityLevel as published by the boardSenior
salaryMin / salaryMaxPay range (numbers)55000 / 80000
salaryCurrencyCurrency codeUSD
salaryPeriodYEAR, MONTH, HOUR, ...YEAR
salaryTextOriginal pay text, when the range was parsed from the description4.000€ - 6.000€
tagsThe board's categories and tags["HR & Recruiting"]
postedDatePosting date-time (ISO, UTC)2026-10-03T14:56:39Z
urlJob page on the source boardhttps://jobicy.com/jobs/154451-people-operations-coordinator
applyUrlApply linkhttps://jobicy.com/jobs/154451-...
descriptionJob description as plain textHi! I’m Hannah and I lead People Operations…
descriptionHtmlDescription as HTML (if you choose HTML or both)<p>…</p>
sourceBoard keyjobicy
sourceNameBoard nameJobicy
sourceUrlBoard home pagehttps://jobicy.com
attributionReady-made credit lineJob listing via Jobicy (https://jobicy.com): https://jobicy.com/jobs/…
jobIdThe board's job ID154451
alsoListedOnOther boards that list the same job (source, name, URL)[{"source": "remoteok", ...}]
isNewSet in monitoring modetrue
scrapedAtWhen the job was scraped (UTC)2026-10-05T04:10:10Z

How to use Remote Jobs Scraper

  1. Type one or more keywords. The prefill (python, 30 jobs) takes about 12 seconds and costs about $0.03. Leave empty for all remote jobs.
  2. Optional: pick the job boards, a candidate location (e.g. United States, Europe), job type, posted within N days or a minimum salary.
  3. Set Max jobs to how many jobs you want in total.
  4. Click Start.
  5. When the run finishes, open the Output tab and download the data as JSON, CSV, Excel or HTML, or connect it to Google Sheets, Zapier, Make, n8n or your own code.
  6. To get only new jobs every day, turn on Only new jobs and create a Schedule (see Integrations and scheduling).

Input guide

Keywords (keywords)

A job is kept if its title contains ANY of the keywords (case-insensitive). Up to 10. Each keyword is also searched on the boards, so more keywords mean more requests.

  • Good: python, data engineer, customer support, react
  • Bad: remote python jobs in Europe (every job here is remote; put Europe in Candidate location)
  • Warning: it is a simple "contains" check, so java also matches "JavaScript". Use a longer phrase when that matters.
  • Tip: Also match keywords in the description gives more, less precise results.

Max jobs (maxResults)

A limit for the whole run, after filters and de-duplication (default 100, prefill 30, maximum 10,000). When more jobs match, they are taken in turn from each board, so even a small run shows several boards.

Categories / tags (categories)

Keeps a job if its board categories or tags contain ANY of these, e.g. Software Engineering, Marketing, devops.

Candidate location / remote region (locations)

Where candidates may live, e.g. United States, Germany, Europe, LATAM, UK. A job is kept if ANY of its locations matches. Common aliases work (US, USA, EU, EMEA, Latin America), and a job open to a whole region also matches a country inside it: Germany matches a job open to "Europe".

  • Include 'work from anywhere' jobs (includeWorldwide), on by default, also keeps jobs open worldwide.

Job type (jobTypes)

full-time, part-time, contract, freelance, internship, temporary, volunteer.

  • Warning: jobs whose board publishes no type are left out when you set this. Remote OK has no job-type field, so most of its jobs are dropped.

Posted within (days) (postedWithinDays)

Only jobs posted in the last N days, e.g. 7. Leave empty for any date.

Minimum salary per year (salaryMin)

Keeps a job if the top of its pay range, converted to a yearly figure (hourly x 2080, monthly x 12), is at least this number.

  • Warning: there is no currency conversion. The number is compared in the job's own currency, so 60000 keeps a USD job paying 60,000 and an INR job paying 60,000. Combine it with a location filter.
  • Jobs without a published salary are left out when this is set.

Remote jobs only (remoteOnly)

On by default. Switch it off to also get Arbeitnow's on-site and hybrid jobs in Germany and the EU.

Jobs removed by any filter are not saved, don't count toward Max jobs and are not charged.

Only new jobs (onlyNewJobs) and Monitor name (monitorName)

See Monitoring mode below.

Output options

  • dedupe (default on): see How does de-duplication work?.
  • descriptionFormat: text (default), html, both or none (smallest output).
  • stripContactInfo (default on): removes e-mails and phone numbers from descriptions. Keep it on to avoid storing personal data.

Advanced

  • proxyConfiguration: off by default and not needed for public APIs.

Example input:

{
"keywords": ["python", "data engineer"],
"sources": ["himalayas", "jobicy", "remoteok", "weworkremotely", "arbeitnow"],
"locations": ["Europe"],
"jobTypes": ["full-time", "contract"],
"postedWithinDays": 7,
"salaryMin": 60000,
"maxResults": 200,
"onlyNewJobs": true,
"monitorName": "python-europe"
}

Output

Each job is one item in the run's dataset. Here is one real item from an all-boards run on 2026-10-05 (description shortened). Jobicy's copy was kept and the same job on Remote OK went to alsoListedOn:

{
"title": "People Operations Coordinator",
"company": "Ashby",
"companyUrl": null,
"location": "USA",
"locations": ["USA"],
"isWorldwide": false,
"workMode": "remote",
"employmentType": "full-time",
"seniority": "Senior",
"salaryMin": 55000,
"salaryMax": 80000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": null,
"tags": ["HR & Recruiting"],
"postedDate": "2026-10-03T14:56:39Z",
"url": "https://jobicy.com/jobs/154451-people-operations-coordinator",
"applyUrl": "https://jobicy.com/jobs/154451-people-operations-coordinator",
"description": "Hi! I’m Hannah and I lead People Operations here at Ashby. I joined over four years ago as the first People hire …",
"descriptionHtml": null,
"source": "jobicy",
"sourceName": "Jobicy",
"sourceUrl": "https://jobicy.com",
"attribution": "Job listing via Jobicy (https://jobicy.com): https://jobicy.com/jobs/154451-people-operations-coordinator",
"jobId": "154451",
"alsoListedOn": [
{
"source": "remoteok",
"sourceName": "Remote OK",
"url": "https://remoteok.com/remote-jobs/remote-people-operations-coordinator-ashby-1137412"
}
],
"scrapedAt": "2026-10-05T04:10:10Z"
}

Notes:

  • Every board gives the same fields. Empty values are null (or []), so CSV and Excel columns always match.
  • salaryMin/salaryMax are in the job's own currency and period.
  • location/locations say where candidates may live, not where the company is.
  • Items are sorted newest first.

Dataset views

The Output tab has two views of the same data:

ViewWhat it shows
JobsA compact table: title, company, open to, type, salary min/max, currency, posted date, source and job link. Best for a quick look.
Full detailsTitle, company, company URL, work mode, all locations, seniority, salary period, tags, description, apply link, attribution and other boards (alsoListedOn).

Every export (JSON, CSV, Excel, API) contains all fields, whichever view you look at. The run also writes a RUN_SUMMARY record to the key-value store: per board, how many jobs were fetched, matched your filters, were removed as duplicates and were saved, how many requests were made, and any board that was unavailable during the run.

How to export the data

  • In the Console: Output tab > Export > JSON, CSV, Excel, HTML, XML or RSS. You can pick fields and the view.
  • Google Sheets: add the Google Sheets integration to the Actor or a schedule (Integrations tab), or use =IMPORTDATA("https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&token=<TOKEN>").
  • API: https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=json (also csv, xlsx, xml). Add &view=overview for the compact table.

Pricing

This Actor uses pay per event. You pay $0.90 per 1,000 jobs ($0.0009 per job saved to the dataset), plus Apify's standard Actor start fee of $0.00005 per run. Platform compute is included in the price.

Example runJobs savedCost
Prefill test (python, 30 jobs)30about $0.03
500 jobs from all 5 boards500about $0.45
1,000 jobs1,000about $0.90
Daily job alert, ~50 new jobs per day for 30 days1,500about $1.35 per month

What you don't pay for:

  • jobs removed by your filters (keywords, location, type, date, salary),
  • duplicates removed across boards,
  • jobs already seen in monitoring mode,
  • malformed jobs that are skipped, and boards that return nothing,
  • the RUN_SUMMARY record.

To cap spending, set Max charge per run in the run options; the Actor stops cleanly at that limit and keeps what it saved. Apify's free plan includes monthly platform credit you can use for this Actor.

Use it via API

Get your API token in the Apify Console under Settings > API & Integrations. Each example runs the Actor and reads the jobs.

JavaScript / Node.js (npm install apify-client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('kadi_bence/remote-jobs-scraper').call({
keywords: ['python', 'data engineer'],
locations: ['Europe'],
postedWithinDays: 7,
maxResults: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`${items.length} jobs`, items[0]);

Python (pip install apify-client)

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("kadi_bence/remote-jobs-scraper").call(run_input={
"keywords": ["python", "data engineer"],
"locations": ["Europe"],
"postedWithinDays": 7,
"maxResults": 200,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["title"], job["company"], job["sourceName"], job["salaryMin"], job["url"])

cURL (runs the Actor and returns the jobs in one request; best for runs under 5 minutes)

curl -X POST "https://api.apify.com/v2/acts/kadi_bence~remote-jobs-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords": ["python"], "maxResults": 30}'

Apify CLI

$apify call kadi_bence/remote-jobs-scraper --input '{"keywords": ["python"], "maxResults": 30}' --output-dataset

MCP server for AI agents (Claude, Cursor, VS Code and other MCP clients)

Add the Apify MCP server with this Actor as a tool. Your client will ask you to sign in to Apify (OAuth), or you can send your token as an Authorization: Bearer YOUR_APIFY_TOKEN header.

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?actors=kadi_bence/remote-jobs-scraper"
}
}
}

Then ask your agent, for example: "Find remote Python jobs open to candidates in Europe posted in the last 7 days and list the ones with a published salary."

Integrations and scheduling

  • Schedules: in the Console go to Schedules > Create new, pick this Actor (or a saved task with your input) and a time, e.g. every day at 07:00. Each run gets its own dataset. Once or a few times a day is plenty: the boards refresh hourly to daily, and Jobicy asks integrations not to poll more than once an hour.
  • Webhooks: add a "Run succeeded" webhook on the Integrations tab.
  • Zapier, Make and n8n: use the Apify app or node. Trigger "Actor run finished", then "Get dataset items", then send each job to Slack, e-mail, a CRM or Airtable.
  • Google Sheets: the Google Sheets integration appends each run's jobs to a sheet, which is the easiest job-alert setup.

Monitoring mode (only new jobs)

Turn on Only new jobs (onlyNewJobs: true) and schedule the Actor:

  1. The first run outputs all matching jobs and remembers them.
  2. Every later run outputs only jobs that weren't returned before. In monitoring mode every output job has isNew: true.
  3. You pay only for those new jobs.

The "already seen" list is stored in a named key-value store (remote-jobs-monitor) in your own Apify account, With the Monitor name default, every search (keywords, sources and filters) keeps its own list. Any other Monitor name keeps one list for that name, whatever the keywords or filters, so you can change the search without getting old jobs again. A job is remembered by its URL on every board that lists it (including alsoListedOn), so a job seen on Jobicy is not returned again from Remote OK. Only jobs actually delivered are remembered; the most recent 100,000 URLs are kept.

If you run two schedules with different searches under your own monitor name, give them different Monitor names so their lists stay separate. To start over, use a new monitor name.

Other job scrapers by the same developer

All of them use the same output fields where possible, so you can merge datasets.

Related company data for B2B leads: SEC Form D Scraper (startup funding rounds), New Business Filings USA (newly registered companies) and Website Tech Stack Detector (technologies a company uses).

FAQ

How does Remote Jobs Scraper work? It calls the five boards' free public jobs APIs (RSS feeds for We Work Remotely), maps every job to one schema, applies your filters and removes cross-board duplicates. No browser and no proxies are needed.

Which job boards are included, and why not Remotive, Working Nomads or The Muse? We Work Remotely, Himalayas, Remote OK, Jobicy and Arbeitnow: all five publish a free public jobs API or RSS feed and allow reuse with attribution. Others were left out on purpose: Remotive's robots.txt blocks its API (Disallow: /api/*) and its terms forbid submitting its jobs to third-party sites; Working Nomads' terms forbid commercially exploiting the service or building a competing product with it; The Muse requires registration and forbids cloning its content; Get on Board restricts commercial reuse.

How many jobs can I get? Himalayas has 100,000+ active remote jobs, Jobicy publishes the last 7 days, Remote OK the latest ~100 per tag, We Work Remotely ~90 newest jobs in its main feed plus ~25 per category feed (about 250 per run), and Arbeitnow mostly German/EU jobs (on-site, hybrid and remote). Use up to 10,000 jobs per run; for "everything new", use monitoring mode on a schedule.

How fast is it? The 30-job prefill run takes about 12 seconds. A 500-job run from all four boards took about 22 seconds.

Why do I get fewer jobs than the boards show? Usually because of a filter or Max jobs: keywords must be in the title, Job type and Minimum salary drop jobs without that data, and Remote jobs only drops Arbeitnow's on-site jobs. Each board is read up to a fixed number of requests per run; We Work Remotely has no search, so for keyword or filtered runs all 11 of its feeds are read and filtered locally; Arbeitnow is capped at 8 pages, so its remote output tops out around 150–200 jobs. RUN_SUMMARY shows the counts per board.

Why do some jobs have no salary or job type? Only what the board publishes is returned. Remote OK has no job-type field (we read it from tags only when unambiguous) and about half the jobs on any board have no published pay.

How does de-duplication work? Company names are normalised ("Valiant Solutions, LLC" = "Valiant Solutions") and so are titles ("Sr. Python Engineer - Remote" = "Senior Python Engineer"). If the same job is on two boards, the copy with more data (salary, description) is kept and the other board's link goes to alsoListedOn. Several openings with the same title on one board (e.g. one per country) are all kept.

Is it legal to scrape these job boards? The Actor only calls the boards' official public APIs, respects robots.txt and crawl-delay, doesn't log in and removes e-mails and phone numbers from descriptions by default, so it collects no personal data (GDPR). You are responsible for how you use the data, including each board's terms and data-protection law in your country.

Can I publish these jobs on my own site? (attribution) The boards allow reuse when you credit them. When you display a job: link to its url on the source board and name the source (sourceName, or simply show attribution). Remote OK asks for a followed link (no rel="nofollow") and its name, not its logo. We Work Remotely asks that you attribute the links back to We Work Remotely (keep url pointing to its job page); its feeds refresh hourly, so schedule at most hourly runs. Himalayas asks that its jobs are not submitted to aggregators such as Jooble, Google Jobs or LinkedIn Jobs. Jobicy asks you not to present its listings as your own. You are responsible for following each board's terms.

Can I use it from Python or another app? Yes. Use the Apify API, the JavaScript or Python client, the CLI, or the MCP server, as shown in Use it via API.

How do I get only new jobs every day? Turn on Only new jobs and create a schedule. See Monitoring mode.

The run failed or a field is missing. What should I do? If one board is down, the run still saves jobs from the others and names the failed board in RUN_SUMMARY. Open an issue on the Issues tab with the run link or your input. Fixes usually land within 24–48 hours. See the changelog below for recent changes.

Need a custom version?

I build custom scrapers, scheduled data feeds and integrations (CSV, Excel, Google Sheets, API, MCP for AI agents). Tell me the sites and fields you need:

More low-cost Actors by the same developer, built on official APIs and public data:

All my Actors: apify.com/kadi_bence

Changelog

  • 2026-10-05, 1.1: added We Work Remotely (official public RSS feeds, attribution kept; on by default). Remotive (robots.txt blocks its API; terms forbid reposting) and Working Nomads (terms forbid commercial reuse) were checked again and stay excluded.
  • 2026-10-05, 1.0: first public release: Himalayas, Remote OK, Jobicy and Arbeitnow APIs, unified schema with salary and location, cross-board de-duplication, keyword/category/location/type/date/salary filters, monitoring mode, attribution fields.