Remote Jobs API: RemoteOK, We Work Remotely, Remotive avatar

Remote Jobs API: RemoteOK, We Work Remotely, Remotive

Pricing

from $0.81 / 1,000 remote job delivereds

Go to Apify Store
Remote Jobs API: RemoteOK, We Work Remotely, Remotive

Remote Jobs API: RemoteOK, We Work Remotely, Remotive

Remote jobs from RemoteOK, We Work Remotely, Remotive and Jobicy in one clean JSON: title, company, salary min/max, location, job type, category, date, apply URL. Cross-board dedup, new-jobs-only alerts. No API key, no login. MCP-ready for AI agents. Pay per result. $0.95 per 1,000 jobs.

Pricing

from $0.81 / 1,000 remote job delivereds

Rating

0.0

(0)

Developer

ABM

ABM

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

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

$0.95 per 1,000 jobs. Pay only for jobs delivered. Errors, blocked boards and empty results are free. No API key, no login, no monthly rental.

This Actor merges the public remote job feeds of Remote OK, We Work Remotely, Remotive and Jobicy into one clean, deduplicated JSON schema. You can filter the merged list by category, keywords, location, minimum salary, contract type and posting date. Turn on "Only new jobs" to get daily alerts that contain only jobs you haven't received yet.

It reads only official public feeds (JSON APIs and RSS), with no browser and no HTML scraping. That makes it fast (usually under 30 seconds) and much more reliable than page scrapers that break whenever a job board changes its design.

What you get for each job

FieldExample
title, company, companyLogo"Senior Python Engineer", "Acme"
url, applyUrlOriginal job page on the board
location, isWorldwide"Europe, UK", false
jobType, seniority"full-time", "Senior"
categories (unified across boards), sourceCategory, tags["developer"], "Back-End Programming"
salaryMin, salaryMax, salaryCurrency, salaryPeriod120000, 150000, "USD", "year"
salaryMinYearly, salaryMaxYearlyHourly or monthly pay converted to a yearly figure
postedAtISO 8601 UTC date
descriptionPlain text, Markdown (LLM/RAG-ready), HTML, or none
source, sourceName, alsoListedOn, sourceCountWhere the job was found, plus duplicate listings on other boards
dedupKey, id, attribution, scrapedAtStable keys for your database

How much does it cost?

Pricing is pay-per-event: $0.00095 per job delivered ($0.95 per 1,000 jobs).

  • 50 Python developer jobs = $0.05
  • 1,000 jobs = $0.95
  • A daily alert that returns about 20 new jobs costs about $0.02 a day, or roughly $0.60 a month.
  • A run that finds no job, or a board that is down, costs $0 in results.

Set a maximum charge per run in Apify. The Actor stops cleanly when it reaches that limit and never delivers unpaid "preview" items.

Input example

{
"sources": ["remoteok", "remotive", "weworkremotely", "jobicy"],
"categories": ["developer"],
"keywords": ["python"],
"excludeKeywords": ["intern"],
"locations": ["Europe"],
"includeWorldwide": true,
"minSalary": 0,
"maxAgeDays": 30,
"maxResults": 50,
"onlyNew": false,
"descriptionFormat": "markdown"
}
InputWhat it does
sourcesWhich boards to merge (all four by default)
categoriesOne unified list: developer, devops, data, design, product, marketing, sales, customer-support, finance, hr, writing, qa, other
keywords / excludeKeywordsWhole-word match, case- and accent-insensitive. A job is kept if it matches any keyword
searchInDescriptionAlso search keywords in the job description (default: on)
locations / includeWorldwideFor example ["USA", "Canada"]. "Anywhere" jobs are kept unless you switch that off
minSalary / onlyWithSalaryYearly salary filter (hourly and monthly pay are converted)
jobTypesfull-time, part-time, contract, freelance, internship, temporary
maxAgeDaysKeep jobs posted in the last N days
onlyNew / stateKeyReturn only jobs not delivered by previous runs with the same filters (or the same alert name)
deduplicateMerge the same job (same company and title) posted on several boards (default: on)
descriptionFormat / maxDescriptionLengthtext, markdown, html or none, with optional truncation

Output example

{
"id": "weworkremotely-acme-senior-python-engineer",
"source": "weworkremotely",
"sourceName": "We Work Remotely",
"sourceJobId": "acme-senior-python-engineer",
"title": "Senior Python Engineer",
"company": "Acme",
"companyLogo": "https://...",
"url": "https://weworkremotely.com/remote-jobs/acme-senior-python-engineer",
"applyUrl": "https://weworkremotely.com/remote-jobs/acme-senior-python-engineer",
"location": "Anywhere in the World",
"isWorldwide": true,
"jobType": "full-time",
"seniority": null,
"categories": ["developer"],
"sourceCategory": "Back-End Programming",
"tags": [],
"salaryMin": 120000,
"salaryMax": 150000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"salaryMinYearly": 120000,
"salaryMaxYearly": 150000,
"salaryText": "$120,000 - $150,000",
"postedAt": "2026-10-24T07:31:05Z",
"description": "## About the role\n\nWe are looking for ...",
"descriptionFormat": "markdown",
"dedupKey": "acme|senior python engineer",
"sourceCount": 2,
"alsoListedOn": [{"source": "remoteok", "sourceName": "Remote OK", "url": "https://remoteok.com/remote-jobs/..."}],
"attribution": "Job via We Work Remotely (https://weworkremotely.com)",
"scrapedAt": "2026-10-26T08:00:00Z"
}

You can download the dataset as JSON, CSV, Excel, XML or HTML. The RUN_SUMMARY record in the key-value store shows how many jobs were downloaded, matched, deduplicated and delivered for each board.

Use cases

1. Daily remote job alert for a recruiting agency (Slack or email)

A tech recruiter who places remote Python and Django developers schedules the Actor every morning at 7:00. Each run returns only the jobs published since the last run, usually 10 to 40 per day, for about $0.01 to $0.04.

Input:

{"categories": ["developer"], "keywords": ["python", "django", "fastapi"], "excludeKeywords": ["intern"], "maxAgeDays": 3, "onlyNew": true, "stateKey": "python-daily", "maxResults": 200, "descriptionFormat": "none"}

Output (excerpt):

[{"title": "Senior Backend Engineer (Python)", "company": "Acme", "location": "Europe", "salaryMin": 90000, "salaryMax": 120000, "salaryCurrency": "EUR", "url": "https://jobicy.com/jobs/..."}]

Next step: a Make or n8n scenario posts each new job to the #remote-python Slack channel. Each company becomes a prospect for the recruiter's outreach.

2. Salary benchmark for an HR / compensation analyst

A compensation analyst wants published pay ranges for remote DevOps roles. A weekly run collects only jobs with a salary of $100k or more.

Input:

{"categories": ["devops"], "onlyWithSalary": true, "minSalary": 100000, "maxAgeDays": 30, "maxResults": 500, "descriptionFormat": "none"}

Output (excerpt):

[{"title": "Site Reliability Engineer", "company": "Globex", "salaryMinYearly": 140000, "salaryMaxYearly": 175000, "salaryCurrency": "USD", "location": "USA", "sourceName": "Jobicy"}]

Next step: the dataset goes into Google Sheets, and a pivot table shows median ranges by seniority and location. 500 jobs cost $0.48.

3. Remote job board or newsletter for a niche audience

The editor of a "remote jobs for designers in Europe" newsletter needs fresh design jobs every week, without the same job appearing three times.

Input:

{"categories": ["design"], "locations": ["Europe", "EMEA", "UK"], "includeWorldwide": true, "maxAgeDays": 7, "onlyNew": true, "stateKey": "design-eu-weekly", "descriptionFormat": "markdown", "maxDescriptionLength": 600}

Output (excerpt):

[{"title": "Product Designer", "company": "Initech", "location": "Anywhere in the World", "sourceCount": 2, "alsoListedOn": [{"sourceName": "Remote OK"}], "description": "## About us\n..."}]

Next step: an LLM writes a two-line pitch for each job from the Markdown description, and the newsletter tool sends the issue. Each job links to its original board (url and attribution).

4. Job-search AI agent

A career-coach assistant (Claude, ChatGPT or Cursor through MCP) calls the Actor with the candidate's skills and preferences and gets back structured jobs to rank. Twenty jobs cost $0.02.

Call it from code

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("<USERNAME>/remote-jobs-feeds-aggregator").call(run_input={
"categories": ["developer"], "keywords": ["python"], "maxResults": 50,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
print(job["postedAt"], job["title"], job["company"], job["url"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('<USERNAME>/remote-jobs-feeds-aggregator').call({
categories: ['developer'], keywords: ['python'], maxResults: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((j) => `${j.title} @ ${j.company}`));

Integrations (Make, n8n, Zapier, Google Sheets)

  • Schedules: in Apify Console go to Schedules, choose a daily cron (0 7 * * *) and use an input with "onlyNew": true.
  • n8n: Schedule Trigger, then the Apify node ("Run Actor and get dataset items"), then Slack, Gmail or Google Sheets.
  • Make / Zapier: use the Apify app trigger "Actor run finished", then "Get dataset items", then add a row in Google Sheets or send an email.
  • Google Sheets: add the dataset export URL with format=csv to =IMPORTDATA(...), or use the Apify integration.
  • Webhooks and API: any HTTP tool can start a run and read .../datasets/{id}/items?format=json.

Use with AI agents (MCP)

The Actor works with the Apify MCP server (https://mcp.apify.com), so Claude, Cursor, ChatGPT and other MCP clients can call it as a tool. For example, you can ask: "Find remote Python jobs posted this week that pay over $100k and are open to Europe." The input fields are plain, documented JSON, and descriptionFormat: "markdown" returns compact descriptions an LLM can read directly.

FAQ

Why not query each board myself? Each board has its own format, its own categories and its own salary format, and many jobs appear on several boards. This Actor gives you one schema, unified categories, parsed salaries and cross-board deduplication.

How does deduplication work? Jobs with the same normalized company and title (ignoring "Remote", "(m/f/d)" and "Inc/LLC") are merged. The newest listing is kept, the other links go into alsoListedOn, and missing salary or location data is taken from the duplicates.

How does "Only new jobs" work? The Actor remembers the jobs it already delivered in a named key-value store in your account. That memory is kept per filter set, or per stateKey, for 90 days. The first run returns everything that matches. Later runs return only new jobs.

Is the salary in USD? Salaries stay in the currency the job gives (salaryCurrency). minSalary compares yearly amounts without currency conversion.

Do you use proxies or a browser? No. The Actor makes a few plain HTTP calls to public feeds. If a board refuses a request, it retries once through a datacenter proxy. Residential proxies are never used.

Is it legal? The Actor only reads feeds that the boards publish for public reuse. Every job includes its original url and an attribution line. Keep both when you display jobs, as the boards ask.

Limits (honest)

  • Remotive's free public API only serves its latest jobs (about 10, published with a 24-hour delay) and asks for at most about 4 calls a day. The Actor caches Remotive's response for 6 hours, so most jobs come from Remote OK, We Work Remotely and Jobicy.
  • The Actor covers the jobs currently listed in each feed: a few hundred per board. That means recent jobs, not a full history.
  • We Work Remotely's feed has no salary field. Salaries are taken from the description when a clear range is written (for example "$120,000 - $150,000").
  • Remote OK has no category field, so categories come from the job title. Remote OK's tags are very broad, so use keywords for precision.
  • Deduplication is by company and title. The same job with a very different title on two boards may still appear twice.