Remote Jobs Scraper - Remote OK, We Work Remotely & 5 More avatar

Remote Jobs Scraper - Remote OK, We Work Remotely & 5 More

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Remote Jobs Scraper - Remote OK, We Work Remotely & 5 More

Remote Jobs Scraper - Remote OK, We Work Remotely & 5 More

Remote job postings from the public APIs and RSS feeds of Remote OK, We Work Remotely, Remotive, Jobicy, 4dayweek.io, Remote First Jobs and Arbeitnow. One schema, cross-posts merged, salary and location restrictions parsed, source attribution on every row, and new / removed jobs between runs.

Pricing

from $1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Cedarfetch Labs

Cedarfetch Labs

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

20 hours ago

Last modified

Categories

Features

Limited permissions

Share

Collect remote job postings from seven remote-job boards in one run and get them back as one clean, deduplicated dataset: Remote OK, We Work Remotely, Remotive, Jobicy, 4dayweek.io, Remote First Jobs and Arbeitnow. Every board is read through its official public API or RSS feed, and every board is normalised to one schema: title, company, category, employment type, where you can work from (parsed into countries and regions), salary where published (with a USD-per-year estimate), description as text, HTML or Markdown, dates and links.

The same job is often posted on several boards. The Actor merges those copies into one row and lists the other boards in alsoOn. Turn on change tracking and schedule it daily: each row then says whether the job is new, updated, unchanged or removed since the last run, and "Output only changes" returns just the new and removed postings.

No browser, no proxies, no login. A run over every board takes about five minutes (4dayweek.io alone is ~100 polite requests; leave it out or set maxJobsPerSource for a run under a minute); a run over two boards takes a few seconds.

Who it is for

  • Job-board and newsletter builders: a daily feed of new remote jobs with categories, location restrictions and salaries already parsed, and the attribution each board asks for on every row.
  • Recruiters and sourcers: who is hiring remotely for which roles, and which roles closed.
  • Job seekers automating alerts: "new remote data jobs open to Europe, at least $80k" every morning.
  • Analysts: remote salary ranges, category mix and regional openness across boards.
  • AI agents and pipelines: one stable JSON shape for seven boards, callable through the Apify API.

Sources

BoardWhat it providesCoverage per runRequests per runAttribution and reuse terms (read 2026-11-11)Polling limit
Remote OKTitle, company, logo, tags, location text, USD salary range, HTML descriptionthe ~100 most recent jobs1Link back to the job on Remote OK with a followed link (no rel="nofollow") and mention Remote OK as the source. Do not use the Remote OK logo.none published
We Work RemotelyTitle, company, company URL, logo, category, type, region and allowed-country list, skills, HTML description, expiryevery listed job (all 11 category feeds)11Anyone can use the public RSS feeds; attribute the job links back to We Work Remotely.none published (feed TTL 60 min)
RemotiveTitle, company, logo, category, tags, job type, location text, salary text, HTML descriptionall public jobs, published with a 24-hour delay1Link back to the job on Remotive and mention Remotive as the source. Do not submit Remotive jobs to third-party job sites (Google Jobs, LinkedIn Jobs, Jooble, Neuvoo). Do not use the listings to collect sign-ups or e-mail addresses.about 4 a day; enforced: 1 call per account per 6 hours
JobicyTitle, company, logo, industry, job type, seniority, location, salary with currency and period, HTML descriptionjobs from the last 7 days (3-hour delay)1 per 100 jobsCommercial use and redistribution allowed. Credit Jobicy as the source, keep apply links on the Jobicy job page, do not present listings as your own.no more than once an hour; enforced: 1 pass per account per hour
4dayweek.ioTitle, company, website, logo, category, seniority, contract type, countries, salary, schedule (4-day week, async hours...), skills and stack, plain-text description, expiryevery live remote job (new listings can take 48 hours)1 per 100 jobs (about 100)Free API designed for scripts, dashboards and aggregators; link back to 4dayweek.io and credit it in public products.60 requests a minute; enforced: 1 request per 1.1 s
Remote First JobsTitle, company, logo, category, seniority, countries, salary amounts, HTML descriptionthe newest 500 jobs (24-hour delay)5Credit Remote First Jobs and link to each job. Do not submit the jobs to LinkedIn Jobs, Google Jobs, Jooble or similar platforms.5 pages of 100
ArbeitnowTitle, company, tags, job types, location, HTML description (only jobs Arbeitnow flags as remote)remote-flagged jobs among the 2,400 newest postings (Europe, mostly Germany)8Free public API, do not abuse; provide a link back to Arbeitnow.com.none published

Every row carries its board's terms in one sentence (sourceAttribution), and the run summary keeps the notice each board returned live in that run (sourceNotice). If you republish the jobs, follow the terms of the board each job came from: link to jobUrl, name the board, and do not forward Remotive or Remote First Jobs listings to Google Jobs, LinkedIn Jobs or Jooble.

Polling limits are enforced per Apify account: if you run the Actor again within a board's window, that board's answer from your previous run is reused (dataOrigin: "cache", noted in the summary) instead of calling the board again. All other boards are read live.

Not included, on purpose: Himalayas (its API terms forbid passing the jobs to third parties), Working Nomads (its terms forbid reselling or commercially exploiting the service, and the feed publishes no reuse terms), The Muse (the public API answers 404), Real Work From Anywhere and NoDesk (RSS feeds offered for personal reading, no reuse terms), and boards without a public unauthenticated feed or behind bot protection (Jobspresso answered 403, JustRemote and Remote.co offer no usable feed, LinkedIn and Indeed).

Input

Everything is optional. With no input you get every listed remote job from all seven boards, deduplicated, newest first, with a plain-text description.

Example: a daily "new remote jobs" feed (changes only)

{
"trackChanges": true,
"changesOnly": true,
"changeTypes": ["new"],
"descriptionFormat": "markdown"
}

Example: engineering jobs open to people in Europe, paying at least $90k

{
"categories": ["engineering", "devops", "data"],
"locationsAllowed": ["europe"],
"minSalaryUsd": 90000,
"postedAfter": "14 days",
"includeDescription": false
}

Example: two boards, keyword search in titles and descriptions

{
"sources": ["weworkremotely", "remotive"],
"titleKeywords": ["react", "typescript"],
"searchDescription": true,
"excludeTitleKeywords": ["intern"],
"maxJobs": 100
}

All options

FieldDefaultWhat it does
sourcesall sevenBoards to read: remoteok, weworkremotely, remotive, jobicy, fourdayweek, remotefirstjobs, arbeitnow.
maxJobs0 (all)Stop after this many delivered jobs (newest first, after filters and dedupe).
maxJobsPerSource0 (all)Stop reading a board after this many matching jobs (saves requests; such a board reports no removals in that run).
titleKeywordsnoneKeep titles containing any (or all) of these words. Alias: keywords.
titleKeywordsModeanyany or all.
excludeTitleKeywordsnoneDrop titles containing any of these words. Alias: excludeKeywords.
searchDescriptionfalseApply both keyword lists to the description too.
categoriesnoneengineering, design, product, marketing, sales, support, data, devops, finance, hr, writing, other.
locationsAllowednoneWhere you can work from: worldwide, a region, or a country (see below).
includeUnknownLocationsfalseWith a location filter, also keep jobs whose restriction could not be read.
employmentTypesnonefull_time, part_time, contract, temporary, internship, apprenticeship, volunteer, other.
minSalaryUsd0 (off)Minimum estimated USD per year (top of the published range).
includeJobsWithoutSalaryfalseWith a minimum salary, also keep jobs that publish no pay.
postedAfternoneISO date (2026-11-01) or relative (24 hours, 7 days, 2 weeks).
dedupetrueMerge cross-posted copies into one row (alsoOn).
includeDescriptiontrueInclude the description.
descriptionFormattexttext, html, markdown or all.
trackChangesfalseLabel rows new / updated / unchanged / removed against the previous run with the same boards and filters.
changesOnlyfalseWith tracking on, deliver only the change types in changeTypes.
changeTypesnew, updated, removedWhich changes changesOnly delivers.
snapshotStoreNameremote-jobs-scraper-snapshotsNamed key-value store for snapshots; use different names for independent feeds.
requestTimeoutSecs60Timeout per request.
maxRetries4Retries for 429, 5xx and network errors (jittered backoff, Retry-After honoured).

Keywords are case- and accent-insensitive and match whole words: engineer matches "Senior Engineer" but not "Engineering"; engineer* matches both; phrases such as data scientist work.

Output

One row per job in the default dataset, newest first. Download as JSON, CSV, Excel or XML, or read it through the API. Views: Jobs, Changes, Job details, Boards that could not be read.

Sample row (shortened):

{
"recordType": "job",
"source": "jobicy",
"sourceJobId": "161259",
"jobId": "jobicy:161259",
"alsoOn": [
{
"source": "remotefirstjobs",
"sourceJobId": "associate-general-counsel-880884",
"jobUrl": "https://remotefirstjobs.com/companies/pair-team/jobs/associate-general-counsel-880884",
"postedAt": "2026-11-08T18:33:31.000Z",
"sourceAttribution": "Job from Remote First Jobs (https://remotefirstjobs.com). Remote First Jobs API terms: credit Remote First Jobs and link to this jobUrl; do not submit the job to third-party sites such as LinkedIn Jobs, Google Jobs or Jooble."
}
],
"title": "Associate General Counsel",
"companyName": "Pair Team",
"companyUrl": null,
"companyLogo": "https://jobicy.com/data/server-nyc0409/galaxy/mercury/2025/06/105c0d0c-221.png",
"category": "finance",
"categoryRaw": "Legal & Compliance",
"tags": [],
"seniority": "Director",
"employmentType": "full_time",
"employmentTypeRaw": "Full-Time",
"isRemote": true,
"workplaceType": "remote",
"location": "USA",
"locations": [
"USA"
],
"regions": [
"north_america",
"americas"
],
"countries": [
"US"
],
"country": "US",
"isWorldwide": false,
"compensation": {
"min": 215000,
"max": 240000,
"currency": "USD",
"interval": "year",
"text": null
},
"salaryUsdAnnualMin": 215000,
"salaryUsdAnnualMax": 240000,
"descriptionText": "About Pair Team\n\nPair Team is a public benefit company reimagining care for the safety net. As an AI-enabled medical group for Medicaid and Medicare, we deliver...",
"descriptionHtml": null,
"descriptionMarkdown": null,
"postedAt": "2026-11-11T10:53:05.000Z",
"expiresAt": null,
"jobUrl": "https://jobicy.com/jobs/161259-associate-general-counsel-3",
"applyUrl": "https://jobicy.com/jobs/161259-associate-general-counsel-3",
"sourceAttribution": "Job from Jobicy (https://jobicy.com). Jobicy API terms: credit Jobicy as the source, keep apply links pointing to the Jobicy job page (this jobUrl), do not present the listing as your own.",
"changeType": null,
"changedFields": null,
"previous": null,
"firstSeenAt": null,
"removedAt": null,
"removedReason": null,
"dataOrigin": "api",
"scrapedAt": "2026-11-11T21:36:19.003Z"
}

Fields

FieldMeaning
source, sourceJobId, jobIdBoard, the board's id, and "<source>:<sourceJobId>".
alsoOnOther boards listing the same job: source, sourceJobId, jobUrl, postedAt, sourceAttribution.
title, companyName, companyUrl, companyLogoAs published (company URL from We Work Remotely and 4dayweek.io).
category, categoryRawShared category, and the board's own label.
tags, seniorityBoard tags or skills; seniority label where published.
employmentType, employmentTypeRawNormalised type and the board's label(s).
isRemote, workplaceTypeAlways true / "remote" (every source is a remote board or is filtered to remote jobs).
location, locationsThe restriction text as published.
regions, countries, country, isWorldwideParsed restriction (see below).
compensation{ min, max, currency, interval, text } as published.
salaryUsdAnnualMin, salaryUsdAnnualMaxEstimated USD per year.
descriptionText, descriptionHtml, descriptionMarkdownPer descriptionFormat; the others are null.
postedAt, expiresAtISO 8601.
jobUrl, applyUrlThe job page on the board (all seven boards route applications through their own job page).
sourceAttributionThe board's attribution and reuse terms.
changeType, changedFields, previous, firstSeenAt, removedAt, removedReasonChange tracking.
dataOriginapi (read in this run), cache (reused to respect a polling limit), snapshot (removed row).
scrapedAtWhen the row was produced.

Field names are the same as in the ATS Jobs Scraper (Greenhouse, Lever, Ashby...) wherever the meaning is the same (companyName, title, location, locations, country, isRemote, workplaceType, employmentType, employmentTypeRaw, compensation, descriptionText, descriptionHtml, postedAt, jobUrl, applyUrl, jobId and the change fields), so the two datasets can be stacked.

The run summary (OUTPUT in the default key-value store) lists for every board: status (ok, partial, no_jobs, blocked, rate_limited, not_found, unreachable, error), jobs listed, matching the filters, left after dedupe, delivered, removed, requests, seconds, whether the cached answer was used, and the board's live terms notice.

How location restrictions are read

Boards write "where you may work from" as free text: "Worldwide", "USA Only", "Europe, USA, Canada", "EMEA", a flag-prefixed list of countries, "Remote - US". The Actor parses it like this:

  • countries: ISO codes of every country named, including common aliases (USA, UK, UAE, "United Kingdom of Great Britain and Northern Ireland", "Korea (Republic of)", "Türkiye"). US state and Canadian province names count as US / CA. Bare two-letter codes other than US, UK and EU are not read, because "IN", "CA" and "DE" are also US state codes.
  • regions: regions named in the text (north_america, latin_america, americas, europe, eu, middle_east, africa, emea, asia, apac, oceania) plus the regions of the named countries.
  • isWorldwide: true for Worldwide / Anywhere / Global; false when a country or region was recognised; null when nothing was (empty, "Remote", or only a city such as "Berlin").
  • We Work Remotely: the allowed-country list wins over the region label when both are given; the state field is ignored (it appears next to "Anywhere in the World").
  • Remote OK and Arbeitnow often give an office city or nothing; those jobs have isWorldwide: null.

locationsAllowed keeps a job when it is open worldwide, or when its countries or regions overlap the places you list (a German resident matches "EMEA" and "Europe" jobs; a "Germany, Europe" job matches a French resident). Jobs with an unknown restriction are dropped unless includeUnknownLocations is on. ["worldwide"] alone keeps only jobs open worldwide.

Categories

Each board's category is mapped to one shared list: engineering, design, product (product and project management), marketing, sales, support (customer support and success), data (data, analytics, ML/AI), devops (DevOps, SRE, sysadmin, IT), finance (finance, accounting, legal), hr, writing, other. Vague board labels ("All others", "Sales and Marketing") and boards without categories (Remote OK, Arbeitnow) are classified from the job title. The board's label stays in categoryRaw.

Salary

Salary is only filled when the board publishes one: structured ranges (Remote OK in USD per year, Jobicy with currency and period, 4dayweek.io, Remote First Jobs) or free text (Remotive: "$50-$75 /hour", "OTE $25k - $35k", "$3.5k–$5k/month"). When no period is written, "year" is assumed only for amounts of 10,000 or more. salaryUsdAnnualMin/Max convert with fixed ECB reference rates of 2026-11-11 and hour x 2080, day x 260, week x 52, month x 12; they stay null when the currency or period is unknown (Remote First Jobs publishes amounts without a currency, so only US-only jobs get USD). Placeholder values (0, 110, 114,000,000) are dropped.

Deduplication

Two records are merged only when all of these hold: the same company (ignoring case, punctuation and legal suffixes such as Inc, LLC, GmbH), the same title (ignoring punctuation, "(m/f/d)"-style markers and "(Remote)" markers, but not seniority words or region suffixes such as "- UK"), different boards, no board listing two jobs under that company and title, location restrictions that do not contradict, posting dates within 30 days, and matching external apply hosts when both have one. The richest copy is kept (description, salary, logo, company URL, parsed location, employment type), and the others are listed in alsoOn. On the boards' live data on 2026-11-11, a full run read 13,192 postings and merged 174 cross-posted copies (1.3%) into 13,018 jobs; most merges paired 4dayweek.io or Jobicy with We Work Remotely or Remote First Jobs. Keys that one board uses for several openings (for example one posting per country) were left unmerged.

Change tracking and the daily feed recipe

  1. Run once with trackChanges: true and the boards and filters you want. Every row is new; a snapshot is saved in a named key-value store in your account.
  2. Schedule the same input daily (Apify Console, Schedules) with changesOnly: true. Each run returns only new, updated and removed jobs. Use changeTypes: ["new"] for a pure "new jobs" feed.
  3. Connect the dataset to your newsletter, Slack, Google Sheets or webhook through Apify integrations.

What the change types mean:

  • new: not seen before in this scope (same boards and filters).
  • updated: title, company, board category, employment type, location text, salary or description changed; changedFields and previous say what changed.
  • removed: no longer listed. Boards drop jobs when they are filled or expire, and some feeds only expose a recent window: removedReason is no_longer_listed (We Work Remotely, Remotive, 4dayweek.io read in full) or left_feed_window (Remote OK's latest ~100, Jobicy's last 7 days, Remote First Jobs' newest 500 - the job may still be open elsewhere).
  • A job is only reported removed when every board that listed it was read completely in this run without errors. A failed, capped or partial read never claims a job disappeared; it is reported on the next complete run. Arbeitnow is always read partially, so it never reports removals.
  • A cross-posted job keeps its history when one board drops it and another still lists it.

Use from an AI agent or via the API

Call the Actor synchronously and get the jobs back in one HTTP request:

curl -X POST "https://api.apify.com/v2/acts/<username>~remote-jobs-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"sources":["remoteok","weworkremotely","remotive"],"categories":["data"],"locationsAllowed":["US"],"maxJobs":50,"includeDescription":false}'

The Actor is also available to MCP-capable assistants through the Apify MCP server. Small, filtered inputs (maxJobs, includeDescription: false) keep agent context short; jobUrl is the link to show users.

Pricing

Pay per event: you are charged for each job row delivered (removed-job rows included). Board status rows are free. The run stops cleanly when it reaches the maximum total charge you set; everything delivered so far stays in the dataset. With "Output only changes", a daily run is charged only for the new, updated and removed jobs.

Limits and honest caveats

  • These are the boards' public feeds, not their full websites: Remote OK exposes its latest ~100 jobs, Jobicy the last 7 days, Remote First Jobs the newest 500, Arbeitnow is read up to 8 pages; Remotive and Remote First Jobs publish with a 24-hour delay, Jobicy with 3 hours, 4dayweek.io up to 48 hours.
  • Remotive's public feed is small (13 jobs on 2026-11-11).
  • Location text is free text; anything the parser cannot read stays in location with isWorldwide: null.
  • Categories for Remote OK and Arbeitnow, and for vague board labels, come from the title; a few will be wrong.
  • Salary USD estimates use fixed exchange rates and full-time hours; treat them as filters, not offers.
  • Arbeitnow is a Europe-focused board, many of its postings are in German, and its location is often a city.
  • If a board blocks or rate-limits requests, it is reported in the summary and as a free status row, and the other boards are still delivered. The run fails only when every selected board failed (with each board's reason).
  • The Actor reads job postings only. It does not collect anything about applicants or other people.

FAQ

Why not LinkedIn, Indeed or Himalayas? LinkedIn and Indeed have no public job feed and sit behind bot protection, which this Actor does not bypass. Himalayas has a public API, but its terms forbid passing its jobs to third parties.

Why do some jobs show dataOrigin: "cache"? Remotive asks API users to call at most about 4 times a day and Jobicy at most once an hour. Runs in your account within those windows reuse your previous answer for those two boards.

Can I get the board's apply link to the employer? All seven boards route applications through their own job page in their public feeds (Jobicy requires it). applyUrl is that page.

How do I keep two independent daily feeds? Use a different snapshotStoreName for each, or different boards/filters (each combination has its own snapshot).

Does it work with the ATS Jobs Scraper? Yes. Shared fields have the same names and shapes, so you can stack both datasets: company career pages from the ATS scraper, remote boards from this one.

What does a failed board look like? A free row with recordType: "source_status", the board, its status (for example blocked) and a plain explanation, plus the same in OUTPUT.

More Actors from Cedarfetch Labs

Built the same way: public data only, typed output, per-source error reporting, change tracking for scheduled runs.

  • Shopify Store Scraper: full product catalogs from any Shopify store, with price and stock change tracking.
  • ATS Jobs Scraper: open jobs from Greenhouse, Lever, Ashby, SmartRecruiters, Workable, Recruitee and Personio boards, with new and removed postings flagged.
  • Substack Scraper: public posts from any Substack newsletter as Markdown, with a new-posts feed.
  • Google Trending Searches: what is trending on Google right now, per country, with alerts on new trends.