Aurelix

Tools › Jobs

Remote Job Board Scraper

Get remote jobs from Remote OK and We Work Remotely in one deduplicated list (title, company, tags, regions, salary) for $0.90 per 1,000 jobs, no login.

For job boards, newsletters and job-search tools. Filter by keywords, categories, regions or time zones and a minimum yearly salary, and get only new jobs on scheduled runs.

$0.90 per 1,000 jobs ($0.60 on paid Apify plans)

At a glance

What the Remote Job Board Scraper does

Sources
Remote OK (API) and We Work Remotely (public RSS)
Filters
Keywords, 12 categories, regions or time zones, worldwide on/off, employment type, minimum yearly salary
Output
28 fields per job; JSON, CSV, Excel, API
Automate
Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents

Who it is for

  • Remote job boards and newsletters pulling fresh postings daily with the new-jobs-only mode
  • Job seekers getting new remote roles in their region sent to Slack or Google Sheets
  • Recruiters and researchers tracking which remote roles and salaries are being advertised

Output

What you get

  • Title, company, company logo, normalised category and the board's own category, tags/skills
  • Employment type (normalised + as published); a seniority column that stays empty, since neither board publishes seniority
  • Allowed locations/regions and a worldwide flag
  • Salary min/max, currency and interval where published
  • Posted and expiry dates in ISO 8601 UTC
  • Job link on the source board, attribution line, and other boards carrying the same job
  • Description as text and HTML (optional)

Example

Input and output

Input

{
  "keywords": [
    "python",
    "data engineer"
  ],
  "categories": [
    "software-development",
    "data-ai"
  ],
  "regions": [
    "Canada",
    "USA"
  ],
  "minSalary": 80000,
  "incremental": true
}

One output record

{
  "job_id": "remoteok:1137475",
  "source": "Remote OK",
  "source_site": "https://remoteok.com",
  "title": "Senior React Full stack Developer",
  "company": "Lemon.io",
  "company_logo_url": null,
  "category": "software-development",
  "category_raw": null,
  "tags": [
    "dev",
    "engineer",
    "remote",
    "… 10 more"
  ],
  "employment_type": "FULL_TIME",
  "employment_type_raw": "full time",
  "seniority": null,
  "locations": [],
  "worldwide": true,
  "salary_min": 80000,
  "salary_max": 200000,
  "salary_currency": "USD",
  "salary_interval": "year",
  "posted_at": "2026-10-09T13:09:18Z",
  "expires_at": null,
  "apply_url": "https://remoteok.com/remote-jobs/remote-senior-react-full-stack-developer-lemon-io-1137475",
  "job_url": "https://remoteok.com/remote-jobs/remote-senior-react-full-stack-developer-lemon-io-1137475",
  "description_text": "Are you a talented Senior Developer looking for a remote job that lets you show your skills and get decent compensation? Look no further than Lemon.io — the…",
  "attribution": "Job via Remote OK (https://remoteok.com)",
  "also_listed_on": [
    {
      "source": "We Work Remotely",
      "job_url": "https://weworkremotely.com/remote-jobs/lemon-io-senior-react-full-stack-developer-7"
    }
  ],
  "source_url": "https://remoteok.com/remote-jobs/remote-senior-react-full-stack-developer-lemon-io-1137475",
  "scraped_at": "2026-11-04T06:24:01Z"
}

From a real run of this tool; long text and lists shortened here.

How to use it

Three steps

  1. Pick the sources (both by default) and optionally add keywords such as 'python' or 'product designer'.
  2. Narrow it with categories, regions (e.g. 'Canada', 'Europe'), employment types or a minimum yearly salary; turn on 'Only new jobs since last run' for a daily feed.
  3. Click Start, then download JSON, CSV or Excel, or schedule the run and send new jobs to Google Sheets, Slack, Zapier, Make or n8n.

API

Call it from Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("aurelix/remote-jobs-scraper").call(run_input={'keywords': ['python', 'data engineer'],
 'categories': ['software-development', 'data-ai'],
 'regions': ['Canada', 'USA'],
 'minSalary': 80000,
 'incremental': True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

pip install apify-client. The same input works from the Apify console, a schedule, Make, n8n, Zapier or an AI agent through the Apify MCP server.

Pricing

Pay per result

Per 1,000 jobs, free plan$0.90
Per 1,000 jobs, paid plans$0.60
Start fee per run$0.001

Live prices from the Apify Store; no subscription and no platform usage billed on top. See the Store page.

Honest limits

What it does not do

  • Coverage is what the boards publish: Remote OK's API gives its ~100 newest jobs and We Work Remotely's feeds their newest jobs per category. By default each board returns up to 100 jobs; set 'Max results per source' to 0 for everything.
  • Categories are normalised from titles and board categories by keyword rules; unusual titles can land in 'other'.
  • Locations are free text from the boards; region matching is by word, synonym and country code, not geography (e.g. 'Americas' does not match 'USA', 'Europe' does not match a list of European countries).
  • Jobicy, Remotive, Himalayas, Working Nomads and Arbeitnow are excluded on purpose (their terms forbid this reuse).
  • Apply links go to the job page on the source board, as the boards require, not to the employer's form.
  • If one board is down or rate-limits the run, the other board's jobs are still returned and the status says which board failed.

FAQ

Questions buyers ask

How much does the Remote Job Board Scraper cost?

$0.90 per 1,000 jobs ($0.60 on paid Apify plans), billed through your Apify account; you pay only for results. Apify's free plan includes $5 of credit a month, enough for about 5,555 jobs.

Which boards are included, and why not others?

Remote OK (API) and We Work Remotely (public RSS). Each publishes its feed for reuse with a link back. Jobicy, Remotive, Himalayas, Working Nomads and Arbeitnow are left out because their terms forbid passing jobs on to other platforms or commercial reuse.

How do I credit the source?

Every job carries 'attribution' (e.g. 'Job via Remote OK (https://remoteok.com)') and 'job_url' on the source board. If you show the jobs publicly, show that credit and use job_url for the apply button, as the boards ask. Do not use the Remote OK logo; the name is fine.

Is this legal?

It reads only public data any logged-out visitor can see: Remote OK's public API and We Work Remotely's public RSS feed, with an attribution line and source link on every job. It goes at a polite pace, never logs in and never solves CAPTCHAs. It returns job posting fields (title, company, tags, salary, dates, description, link); no candidate profiles; descriptions can name a recruiter or hiring contact (business contact information, B2B use only, see Lawful use). To have a record removed, open an issue on this Actor's Issues tab; if a board formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

How are duplicates detected?

By company and title, ignoring case and punctuation. The first board's record is kept; the others appear in also_listed_on with their links.

How does the region filter work?

It matches your words against each job's published allowed locations, such as 'USA', 'Europe', 'Canada' or 'Americas'. Jobs open worldwide are kept too unless you switch that off. Boards do not publish structured time zones, so 'UTC' matches only where the text says so.

Why is salary empty for some jobs?

Only about 4% of postings publish pay (about a fifth of Remote OK's; We Work Remotely's feed has no salary field). With a minimum salary set, jobs without a salary are dropped. Remote OK salaries are yearly USD.

How does 'new since last run' work?

The Actor remembers jobs it has returned for the same sources and filters (or the state name you set) and returns only unseen ones. A job seen on any board counts as seen. Jobs are forgotten 60 days after they were last seen.

Can I use it from an AI assistant?

Yes. Every input is described for agents, and all are optional. It works through Apify's MCP server and API.

What am I charged when nothing matches or a board is down?

Only the start fee. Jobs are charged one by one as they are saved, so a run with 0 matching jobs costs just that fee. If one board fails or rate-limits the run after retries, the other board's jobs are still returned and charged, and the status message names the board that failed. If both fail, the run ends with a 'No jobs' status and no job is charged.

Which text do keywords search?

The job title and company name only, case-insensitive. A job is kept if it contains any one of your keywords. Tags and descriptions are not searched. Matching is by text fragment, so 'java' also matches 'javascript'. For broad topics, the categories filter is usually more reliable.

How is the category decided?

By keyword rules applied to the title first, then to the board's own category, then to the tags. The first rule that matches wins, in a fixed order starting with software development. A job that matches no rule gets 'other'. The board's own category is kept in category_raw, where the board publishes one.

How does the minimum salary filter handle hourly or monthly pay?

It takes the top of the published range (or the single figure), converts it to a yearly amount (monthly x 12, weekly x 52, daily x 260, hourly x 2080) and compares it in the posting's own currency. Remote OK salaries are yearly USD. We Work Remotely's feed has no salary field, so setting a minimum salary returns Remote OK jobs only.

Why is a job with no location marked worldwide?

When a board publishes no location for a job, the Actor treats it as open worldwide, as do location texts such as 'Worldwide' or 'Anywhere'. In our test of everything both boards published, 53 of 99 Remote OK jobs had no location. With a region filter and 'Include worldwide jobs' on, these jobs are kept; switch it off to see only jobs that name your region.

Should I change 'Max results per source' for a daily feed?

The cap is applied before the new-jobs check, so each run looks only at the newest jobs per board, up to the cap. A daily run with the default 100 per board catches most new postings. Set it to 0 if you want every new job however old; in our test that meant 589 jobs on the first run.

Why are some columns always empty?

Each board publishes different fields. Neither board publishes seniority, so that column stays empty. In our test only We Work Remotely jobs carried a company logo and an expiry date, and only Remote OK jobs carried a salary. Missing values are null, never guessed.

How long does a run take?

Every run reads both boards in full before filtering, so run time hardly depends on your filters. On Apify a default run of 199 jobs took about 7 seconds and a run that matched nothing about the same.

How do I export jobs to Google Sheets?

Download the run's results as CSV or Excel and open them in Google Sheets, or add Apify's Google Sheets integration to the run or a schedule so every run's results land in a sheet.

Related

Related tools

Try the Remote Job Board Scraper

Open it on the Apify Store, paste the example input above and click Start. Results download as CSV, Excel or JSON.