Remote Jobs API: RemoteOK, WWR & Jobicy Feed avatar

Remote Jobs API: RemoteOK, WWR & Jobicy Feed

Pricing

$1.00 / 1,000 job delivereds

Go to Apify Store
Remote Jobs API: RemoteOK, WWR & Jobicy Feed

Remote Jobs API: RemoteOK, WWR & Jobicy Feed

Remote jobs API: RemoteOK, We Work Remotely and Jobicy in one clean JSON feed. Filter by keyword, category, location, salary and date; cross-source dedupe; only-new mode for alerts. $0.001 per job.

Pricing

$1.00 / 1,000 job delivereds

Rating

0.0

(0)

Developer

Majd Hijazin

Majd Hijazin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Remote Jobs API: RemoteOK, We Work Remotely and Jobicy in one feed

Remote Jobs API gives you the newest remote jobs from Remote OK, We Work Remotely and Jobicy in one clean JSON feed. Each job has the same normalized fields, cross-posted duplicates are merged, and you can filter by keyword, category, location, salary and posting date.

  • Only-new mode. Turn on onlyNew to get just the jobs you haven't seen yet, which makes daily job alerts, Slack bots and AI agents cheap to run.
  • No browser, no proxies, no logins. The Actor reads only the boards' official public feeds, so runs finish in about 10–15 seconds and don't break when a website redesigns.
  • $0.001 per job ($1 per 1,000). Failed sources, duplicates and already-seen jobs are free.
  • Default sources: Remote OK and Jobicy. We Work Remotely is opt-in: add "weworkremotely" to sources to include it.

Use it as a remote jobs scraper without the scraping: a RemoteOK scraper, a We Work Remotely RSS reader and a Jobicy API client behind one input form and one output schema.

Why use this remote jobs API?

Remote Jobs APIScraping each board yourself
SourcesRemote OK + Jobicy by default; We Work Remotely (12 feeds) on request, in one callThree parsers and three schemas to maintain
ReliabilityOfficial public feeds; if one source fails, the others still returnHTML scrapers break when a site redesigns
DuplicatesThe same job posted on several boards is merged; alsoListedOn keeps the other linksYou write the dedupe logic yourself
AlertsonlyNew remembers what each saved search already returnedYou build and run your own state database
SalaryStructured salary, plus conservative parsing of "Salary: $X – $Y" lines in descriptionsInconsistent formats on every board
ComplianceAttribution and apply links built in, per each board's termsEasy to get your API access revoked
Price$0.001 per jobYour own servers and maintenance time

Who uses it

  • Job boards and newsletters: curate remote roles in a niche (Python, design, customer support, LATAM, and so on).
  • Job seekers and career coaches: set up a daily alert for "new senior backend jobs open to Europe paying $100k+".
  • AI agents and assistants: answer "find new remote data jobs I can do from Canada" with one tool call.
  • Recruiters and market researchers: track which companies hire remotely, salary bands and demand by skill.

How to use it

  1. Click Try for free. The form is prefilled: engineering jobs open to Europe or the USA from the last 14 days.
  2. Change the keywords, categories, locations or salary filters, or leave them empty to get every remote job.
  3. Click Start. Results appear in the Jobs table in about 15 seconds. You can download them as JSON, CSV, Excel or HTML, or read them over the API.
  4. For alerts, turn on Only new jobs since the last run and add a Schedule (for example, daily at 07:00).

Input

All fields are optional.

FieldTypeWhat it does
keywordsstring[]Keep jobs that mention any of these words (title, company, tags, category, description). Set keywordMode: "all" to require every word.
excludeKeywordsstring[]Drop jobs whose title or company contains any of these words, e.g. intern, crypto.
categoriesstring[]Cross-board categories, e.g. Programming, Design, Marketing, Sales, Customer Support, DevOps, Data, Product, Finance, HR, Writing, Security, QA.
locationsstring[]Countries or regions the role must be open to: USA, Europe, Germany, Canada, UK, LATAM, APAC, EMEA. A job open to all of Europe matches Germany, and the other way round.
includeWorldwidebooleanWhen locations is set, also keep jobs open worldwide or with no location limit. Default true.
salaryMinintegerMinimum annualized salary (highest posted bound). Hourly and monthly pay is annualized; currencies are not converted.
includeJobsWithoutSalarybooleanKeep jobs with no posted salary when salaryMin is set. Default false.
postedWithinDaysintegerOnly jobs posted in the last N days. Default 30.
sourcesstring[]Any of remoteok, weworkremotely, jobicy. Default: ["remoteok", "jobicy"]. We Work Remotely is opt-in and runs only when you list weworkremotely explicitly.
maxResultsintegerMaximum jobs per run, newest first. Default 200.
onlyNewbooleanSkip jobs this saved search returned in earlier runs. History is kept in a named key-value store.
stateKeystringOptional alert name. By default each combination of filters gets its own history.
includeDescriptionbooleanAdd the full plain-text descriptionText. Default false, which keeps output small.
dedupeAcrossSourcesbooleanMerge the same job posted on several boards. Default true.

Input example: daily alert for Python and backend jobs open to Europe

{
"keywords": ["python", "backend"],
"categories": ["Programming"],
"locations": ["Europe"],
"includeWorldwide": true,
"salaryMin": 80000,
"includeJobsWithoutSalary": true,
"postedWithinDays": 7,
"maxResults": 100,
"onlyNew": true,
"stateKey": "python-backend-europe"
}

Output

Each dataset item is one job, newest first. Here is a real item from a local test run on 2026-10-20 (shortened):

{
"id": "weworkremotely:vertex-marketing-group-distribution-engineer",
"source": "weworkremotely",
"sourceName": "We Work Remotely",
"sourceJobId": "vertex-marketing-group-distribution-engineer",
"title": "Distribution Engineer",
"company": "Vertex Marketing Group",
"companyUrl": "https://vertexmg.com/",
"location": "Anywhere in the World",
"regions": ["Worldwide"],
"category": "Back-End Programming",
"tags": ["Python", "API", "DevOps", "Android", "iOS"],
"employmentType": "Full-Time",
"salaryMin": null, "salaryMax": null, "salaryCurrency": null, "salaryPeriod": null, "salarySource": null,
"postedAt": "2026-10-20T11:32:37.000Z",
"expiresAt": "2026-11-19T11:32:37.000Z",
"url": "https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer",
"applyUrl": "https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer",
"excerpt": "Scale our distribution by code: a fleet of real devices…",
"descriptionText": null,
"attribution": {
"sourceName": "We Work Remotely",
"listingUrl": "https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer",
"text": "Job via We Work Remotely: https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer",
"html": "<a href=\"https://weworkremotely.com/remote-jobs/vertex-marketing-group-distribution-engineer\">View this job on We Work Remotely</a>"
},
"alsoListedOn": [],
"isNew": true,
"scrapedAt": "2026-10-20T18:23:01.078Z"
}
  • Salary fields. salaryMin, salaryMax, salaryCurrency and salaryPeriod come from the source's structured fields (salarySource: "feed"). Some We Work Remotely and Remote OK posts only state pay in the text; for those, the Actor parses an explicit range such as "Salary: $140,000 – $175,000" and sets salarySource: "description".
  • Cross-posted jobs. alsoListedOn lists the same job on the other boards, each with source, url and postedAt.
  • Run summary. The run's OUTPUT record (key-value store) holds the status, each source's health, counts, rejections per filter, billing and the onlyNew state.

The dataset has three ready-made views: Jobs, Salaries and Cross-posted jobs.

Pricing

Pay per event: job-scraped = $0.001 per job delivered ($1 per 1,000 jobs). Platform usage is included.

RunJobs deliveredCost
Daily alert with onlyNew (typical)5–40 new jobs$0.005–$0.04 per day
Full snapshot of all three boards~1,000–1,500 jobs~$1.00–$1.50
Prefilled example50 jobs$0.05

You are never charged for:

  • failed sources;
  • invalid records;
  • merged duplicates;
  • already-seen jobs (onlyNew).

Set Max cost per run (maxTotalChargeUsd) and the Actor stops cleanly at that budget: it pushes only jobs it can charge for and marks the run budget_limit_reached. If the budget can't cover even one job, the run ends immediately with BUDGET_TOO_LOW and fetches nothing.

API and integrations

Replace <username> with this Actor's owner on Apify.

HTTP (one call, returns the jobs):

curl -X POST "https://api.apify.com/v2/acts/<username>~remote-jobs-api/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"keywords":["react"],"locations":["USA"],"postedWithinDays":3,"maxResults":50}'

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('<username>/remote-jobs-api').call({ categories: ['Design'], onlyNew: true, stateKey: 'design-alert' });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python:

from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
run = client.actor("<username>/remote-jobs-api").call(run_input={"keywords": ["data engineer"], "salaryMin": 120000})
jobs = client.dataset(run["defaultDatasetId"]).list_items().items

Results also flow to Zapier, Make, n8n, Google Sheets, Slack and webhooks through Apify integrations. A common setup is a daily schedule with onlyNew, plus a webhook that posts the new jobs to Slack.

Use with AI agents (MCP)

The Actor works as a tool through the Apify MCP server in Claude, Cursor, VS Code and any MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=<username>/remote-jobs-api",
"headers": { "Authorization": "Bearer <APIFY_TOKEN>" }
}
}
}

Example prompt: "Use remote-jobs-api to find remote product designer jobs open to Europe posted in the last 3 days, with salary above 70k, and list company, salary and link."

Agents get a flat, predictable schema, a cost of $0.001 per result, and an attribution.text string they can quote as-is.

Attribution (required by the sources)

Each source lets you reuse its jobs only with attribution. Every item includes an attribution object and a source url, so complying takes one line of code:

  • Remote OK. Show "Remote OK" as the source and link to the job's url with a normal, followed link (no rel="nofollow"). Do not use the Remote OK logo.
  • We Work Remotely (opt-in, only when you add weworkremotely to sources). Credit We Work Remotely and send applicants to the weworkremotely.com listing (applyUrl). Don't brand your app with the WWR name. WWR's API terms restrict use in job search services, so it is off by default; check that your use fits WWR's terms before you enable it.
  • Jobicy. Credit Jobicy with a direct link to the listing, and point apply buttons to the feed's job URL. Don't present the jobs as your own.

Easiest option: render attribution.html next to each job, and use applyUrl for your "Apply" button. Details are in COMPLIANCE.md in the source code.

Limitations

  • Coverage follows the public feeds.
    • Remote OK's API returns its latest ~100 jobs.
    • Jobicy's public feed covers the last 7 days.
    • We Work Remotely's RSS feeds carry the current listings in each category (only when weworkremotely is requested; it is off by default).
    • Older jobs are not available, so for history, schedule the Actor and keep the datasets.
  • Remotive and Himalayas are not included. Their API terms forbid redistributing jobs through aggregators. If you pass them in sources, the Actor ignores them and adds a warning.
  • Salary. Many remote jobs don't publish pay. Currencies are not converted, and salaryMin compares numbers in each job's own currency.
  • Locations. Region matching uses the boards' free-text location labels; "Anywhere" and unspecified jobs count as worldwide.
  • Dedupe. Jobs are merged on company plus normalized title. Two genuinely different roles with identical titles at the same company would be merged; turn off dedupeAcrossSources if that matters to you.
  • Polling. Please don't schedule more often than hourly. The feeds refresh a few times a day.

FAQ

Is this a RemoteOK scraper? It returns everything a RemoteOK scraper would, but through Remote OK's official public API. That's faster and more reliable, and it's allowed when you credit Remote OK.

Do I need an API key or proxies? You only need an Apify account. The Actor uses no proxies and no logins.

How does "only new jobs" work? The Actor stores the IDs (and cross-board keys) of jobs it returned in a named key-value store (remote-jobs-api-state) under a key derived from your filters, or your stateKey. The next run skips those jobs, and you pay only for new ones. History is kept for 120 days.

What if one job board is down? The other sources still return results and the run status is partial. The run fails only if every source fails, and then nothing is charged.

Can I get full job descriptions? Yes. Set includeDescription: true (plain text, up to descriptionMaxChars). Keyword search always looks at descriptions, even when they aren't returned.

Can I use this to power my own job board? Yes, as long as you keep each source's attribution and apply links (see Attribution). Check each board's terms for your specific use.

Can I suggest a source? Yes. Open an issue on the Actor page. We only add sources whose terms allow this kind of use.