Remote Jobs Aggregator API: Remote OK, WWR & Jobicy, Deduped avatar

Remote Jobs Aggregator API: Remote OK, WWR & Jobicy, Deduped

Pricing

$1.00 / 1,000 jobs

Go to Apify Store
Remote Jobs Aggregator API: Remote OK, WWR & Jobicy, Deduped

Remote Jobs Aggregator API: Remote OK, WWR & Jobicy, Deduped

Remote jobs from Remote OK, We Work Remotely and Jobicy in one deduplicated JSON feed. Salary and keyword filters, only-new-jobs mode. $1 per 1,000 jobs.

Pricing

$1.00 / 1,000 jobs

Rating

0.0

(0)

Developer

Scott Williams

Scott Williams

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Categories

Share

Remote Jobs Aggregator API: Remote OK, We Work Remotely and Jobicy in one deduplicated feed

Remote Jobs Aggregator pulls remote job listings from three boards that publish official public feeds (the Remote OK API, the We Work Remotely RSS feeds and the Jobicy API) and returns them as one clean JSON dataset. The same job posted on more than one board is merged into a single record, with the other copies listed in alsoListedOn. Filter by keyword, location, salary, date, We Work Remotely category, or Jobicy region and industry, and use monitoring mode to get only jobs you haven't seen. Each item carries the attribution line the source asks for. You pay $0.001 per job written to the dataset; filtered-out jobs and merged duplicates are free.

Who it's for

  • Remote job boards and newsletters that want a deduplicated daily feed with source attribution included.
  • Job seekers who want one alert across three remote boards, filtered by stack and minimum salary.
  • Slack and Discord community owners posting new remote roles to a channel.
  • Researchers tracking remote hiring by category, region or published pay.

What data you get

One dataset item per job:

FieldWhat it holds
id, uidThe job's ID on its board, and a stable key source:id.
source, sourceNameremoteok, weworkremotely or jobicy, and the board's display name.
title, companyName, companyLogoJob title, company and logo URL when the board gives one.
location, isRemoteRegion or location text as published (e.g. Anywhere, USA).
employmentType, employmentTypeRawThe board's job type normalized to FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER (a value that fits none of them, such as Permanent) or null; and the board's own text, e.g. Full-Time. When a board lists several types the more specific one wins (Full-Time, Contract is CONTRACTOR).
seniority, category, tagsAs published by the board (not every board has every field).
postedAt, expiresAtISO 8601 timestamps.
url, applyUrlJob page and apply link.
salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryText, salarySourcePay when the board gives it (salarySource: "source") or when a range is found in the description ("description").
descriptionText / descriptionHtmlFull description, if includeDescription is on.
attributionThe credit line the source asks for, e.g. "Job data from Jobicy (https://jobicy.com). Credit Jobicy and send Apply clicks to the job URL."
alsoListedOnOther boards where the same job was found (when dedupe is on).
scrapedAtWhen the run read the job.

Sample item (real output, run without descriptions):

{
"id": "157680",
"source": "jobicy",
"sourceName": "Jobicy",
"title": "Staff Software Engineer, Containers",
"companyName": "Chainguard",
"companyLogo": "https://jobicy.com/data/server-nyc0409/galaxy/mercury/2025/06/e4b6aacf-221.jpeg",
"location": "Canada, Germany, UK, USA",
"isRemote": true,
"employmentType": "FULL_TIME",
"employmentTypeRaw": "Full-Time",
"seniority": "Senior",
"category": "Software Engineering",
"tags": [],
"postedAt": "2026-10-28T16:55:29+00:00",
"expiresAt": null,
"url": "https://jobicy.com/jobs/157680-staff-software-engineer-containers",
"applyUrl": "https://jobicy.com/jobs/157680-staff-software-engineer-containers",
"salaryMin": 205000,
"salaryMax": 231000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salaryText": null,
"salarySource": "source",
"attribution": "Job data from Jobicy (https://jobicy.com). Credit Jobicy and send Apply clicks to the job URL.",
"uid": "jobicy:157680",
"alsoListedOn": [],
"scrapedAt": "2026-10-29T01:03:49.025052+00:00"
}

How to use it

Every input is optional. An empty input runs in default mode: it returns the 8 newest jobs from all three boards, without descriptions, and the log says Default mode: no sources or filters given, returning up to 8 of the newest jobs from remoteok, weworkremotely, jobicy without descriptions. That costs at most $0.008. Raise Max jobs in total (0 = no limit) and turn on Include description for a full pull. Click Start, then export from the Output tab.

Input fieldLabelNotes
sourcesSourcesremoteok, weworkremotely, jobicy. Empty = all.
keywordsKeywords (any)Matches title, tags or category, case-insensitive.
excludeKeywordsExclude title keywordsDrops jobs whose title contains any of these.
searchInDescriptionMatch keywords in description tooDefault false.
locationsLocations (any)Matches location or region text, e.g. USA, Europe, Anywhere.
requireSalaryOnly jobs with a salaryDefault false.
minSalaryUsdMinimum yearly salary (USD)Compares the top of the range, converted to a rough yearly USD figure. Jobs without a salary are dropped when this is set.
postedWithinDaysPosted within last N days1–365. Jobs without a posting date are kept.
wwrCategoriesWe Work Remotely categoriesprogramming, full-stack, front-end, back-end, devops, design, product, customer-support, sales-marketing, management-finance, other. Empty = all.
jobicyGeoJobicy regione.g. usa, europe, canada.
jobicyIndustryJobicy industrye.g. dev, marketing, design-multimedia.
dedupeMerge duplicates across boardsDefault true. Same company and title (normalized) = one job; the newest copy is kept.
onlyNewJobsOnly new jobs (monitoring mode)Default false. Seen jobs are remembered for 120 days.
stateStoreNameState store nameDefault remote-jobs-aggregator-state. Also stores the Jobicy hourly limit.
includeDescriptionInclude descriptionDefault false (was true before GAP8).
descriptionFormatDescription formattext, html or both.
maxTotalJobsMax jobs in totalDefault 8. 0 = no limit. With a cap and no filters, each board stops after twice the cap, so capped runs are fast.

Example input (Python or backend jobs paying at least $100k a year, posted in the last week, only new ones):

{
"sources": [
"remoteok",
"weworkremotely",
"jobicy"
],
"keywords": [
"python",
"backend"
],
"minSalaryUsd": 100000,
"postedWithinDays": 7,
"onlyNewJobs": true
}

Things to know:

  • Jobicy hourly limit. Jobicy asks API users to poll at most once an hour. If Jobicy was read less than 60 minutes ago (tracked in the state store), it is skipped for that run with a log message, and the other boards still run.
  • Salary periods. Some boards publish hourly or monthly pay. Check salaryPeriod before comparing numbers. Remote OK's salary fields are meant to be yearly USD, but some employers enter an hourly rate there; a Remote OK range whose top is $500 or less is labelled HOUR, everything else YEAR.
  • Text encoding. Remote OK sends some titles, company names, locations and descriptions with garbled characters (for example ’ instead of an apostrophe, or México). The Actor repairs these before writing the item; text that is already correct is left as is.
  • Rough salary conversion. minSalaryUsd converts to a yearly figure with fixed rough exchange rates (USD, EUR, GBP, CAD, AUD); it is a filter, not an accurate conversion.
  • RUN_SUMMARY in the default key-value store shows jobs pushed, duplicates merged, HTTP requests, stoppedByCostLimit and per-source counts.

Pricing

This Actor uses pay-per-event pricing: $0.001 per job written to the dataset. That is $1.00 per 1,000 jobs. There is no separate start fee in this Actor's pricing (as listed on October 28, 2026; the Pricing tab on the Store page is the source of truth).

You are charged only for jobs that end up in your dataset. Jobs removed by your filters, jobs skipped in monitoring mode and duplicates are not charged.

ExampleJobsCost
Default run (empty input)8$0.008
Daily new remote jobs, filtered to one stack40$0.04
One full pull of all three boards, maxTotalJobs 0 (illustration)600$0.60
A month of daily monitoring at 40 new jobs a day1,200$1.20

Rows are illustrations, not measured board sizes.

Worked example: 1,000 jobs × $0.001 = $1.00.

To cap spend, set Maximum cost per run in the run options (or maxTotalChargeUsd via the API). The Actor stops cleanly when the next job would go over the limit and records stoppedByCostLimit: true in the run summary.

How it compares

Prices and descriptions are from the public Apify Store listings on October 28, 2026.

OptionListed priceWhat it is good at
This Actor$0.001 per jobThree boards with official public feeds, cross-board dedupe, salary and region filters, attribution field, only-new-jobs mode.
memo23/remote-jobs-aggregator$0.00199 free plan / $0.00189 paid, plus extra dataRemote OK plus six more boards, and company emails. A better fit if you need more boards or contact data.
benthepythondev's remote jobs ActorSee listingSix boards with a worldwide vs US-only filter.
inlifeprojects/remoteok-jobs-scraper$0.001 per jobRemote OK only.
The boards' own feedsFreeRemote OK, We Work Remotely and Jobicy all publish free feeds. Calling them yourself is fine if you handle dedupe, salary parsing, the Jobicy rate limit and attribution.

We deliberately read only boards that publish a public feed or API for reuse. Other remote boards are not included.

Integrations and API

The actor ID is fecklesspleb/remote-jobs-aggregator (in API URLs: fecklesspleb~remote-jobs-aggregator).

n8n, Make and Zapier. Each has an Apify integration with a "run Actor" action. Pick fecklesspleb/remote-jobs-aggregator, paste the input JSON shown below, then read the results from the run's default dataset in the next step. To process only new jobs on a schedule, turn on the monitoring option and run it from a schedule (Apify Schedules or a trigger in your automation tool).

Webhooks and schedules. Apify Schedules can run the Actor on a cron, and a webhook on "run succeeded" can call your own endpoint with the run ID.

HTTP API. Run the Actor and get the items back in one call. This waits for the run to finish, so use it for small runs:

curl -X POST "https://api.apify.com/v2/acts/fecklesspleb~remote-jobs-aggregator/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sources": ["remoteok", "weworkremotely", "jobicy"], "keywords": ["python", "backend"], "minSalaryUsd": 100000, "postedWithinDays": 7, "onlyNewJobs": true}'

Python (pip install apify-client):

from decimal import Decimal
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("fecklesspleb/remote-jobs-aggregator").call(
run_input={
"sources": [
"remoteok",
"weworkremotely",
"jobicy"
],
"keywords": [
"python",
"backend"
],
"minSalaryUsd": 100000,
"postedWithinDays": 7,
"onlyNewJobs": True
},
max_total_charge_usd=Decimal("5"), # optional spend cap
)
# apify-client 3.x returns a Run object; on 1.x/2.x use run["defaultDatasetId"]
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

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

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fecklesspleb/remote-jobs-aggregator').call(
{
"sources": [
"remoteok",
"weworkremotely",
"jobicy"
],
"keywords": [
"python",
"backend"
],
"minSalaryUsd": 100000,
"postedWithinDays": 7,
"onlyNewJobs": true
},
{ maxTotalChargeUsd: 5 }, // optional spend cap
);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Results can also be exported from the dataset as JSON, CSV, Excel, XML or RSS from the Apify Console or the dataset API.

FAQ

Is there a Remote OK API I can use without writing code? Yes: Remote OK publishes a free JSON API, and this Actor wraps it together with We Work Remotely and Jobicy, so you can call one endpoint and get filtered, deduplicated jobs. Remote OK asks that you link back to the job URL and mention Remote OK as the source when you show its jobs. The attribution field carries that note on every item.

How are duplicates detected? Two jobs are treated as the same when the normalized company name and title match. The newest copy is kept and the others are listed in alsoListedOn. Turn dedupe off to keep every copy.

How do I get only worldwide or only US jobs? Use locations (e.g. Anywhere, Worldwide, USA), which matches each board's location text. For Jobicy, jobicyGeo filters at the source. Boards word locations differently, so test your list on a small run first.

Why did Jobicy return nothing? Most likely it was read less than an hour ago and skipped to respect Jobicy's hourly limit. The log says so. Run again after an hour.

Can I post new remote jobs to Slack or a Google Sheet? Yes. Schedule the Actor with onlyNewJobs on, and use the Apify integration in n8n, Make or Zapier to send each new item on.

Do I need an API key or login? No. The Actor reads public endpoints and needs no account on the source site. You only need an Apify account to run it. It obeys robots.txt and rate-limits requests per host. robots.txt is checked again on every redirect, so a URL that redirects to a disallowed path or another host is not followed. If a host's robots.txt can't be read (a server error, a network failure or a page that isn't a robots file), that host is skipped for the run and RUN_SUMMARY says why. A missing robots.txt means no rules.