Free remote job APIs compared: what you get and what their terms allow
Last updated: 4 November 2026 · By Quicksloth
Six job boards with remote jobs let you read them for free, without a key: Remote OK, Remotive, Himalayas, Jobicy and Arbeitnow through a JSON API, and We Work Remotely through an RSS feed. We called each one on 4 November 2026, counted what came back, and read their terms. The terms differ more than the data: some ask only for a link back, others forbid passing the jobs on to other job boards, aggregators or Google Jobs.
Short version: for the most jobs, with salary currency and period, use Himalayas (114,131 jobs, 20 per request), but only on sites you run yourself. If you want to build an aggregator or pass the jobs on, Jobicy is the only one whose documentation says you may "redistribute job data". Remote OK is the simplest (one address, about 100 recent jobs, salaries in US dollars) and asks for a followed link back. Every source whose terms we could read asks you to name it or link back to it; we could not read We Work Remotely's terms page.
The six side by side
One request to each source on 4 November 2026, between 11:54 and 11:57 UTC, with no key. "Jobs" is what that one request returned; "with a salary" counts the jobs that had a salary in a field of their own.
| Source | Endpoint | Jobs in one request | With a salary | How fresh | Pace they ask for | Passing jobs on to other sites |
|---|---|---|---|---|---|---|
| Remote OK | remoteok.com/api | 99, no paging | 21 (US dollars) | refreshed from time to time; last_updated was 00:00 UTC that day | robots.txt: 1 request per second | not mentioned; followed link back required |
| Remotive | remotive.com/api/remote-jobs | 11 (all it had) | 8 (free text) | "delayed by 24 hours" | "max. 4 times a day" | "do not submit … to third Party websites" |
| Himalayas | himalayas.app/jobs/api | 20 of 114,131 (cursor paging) | 8 of 20 (with currency and period) | "refreshed every 24 hours" | once a day is enough; a free key gives 60 per minute | forbidden, including Google Jobs and structured data |
| Jobicy | jobicy.com/api/jobs | 100 (cursor paging, last 7 days) | 34 (with currency and period) | 3-hour delay | a new pass at most once per hour | allowed: "redistribute job data" |
| Arbeitnow | arbeitnow.com/api/job-board-api | 300 per page, 20 marked remote | none (no salary field) | "updated every hour" | "please do not abuse" | not addressed; link back required |
| We Work Remotely | weworkremotely.com/remote-jobs.rss | 100 (RSS) | none (no salary field) | feed ttl 60 minutes | not stated where we could read | we could not read their terms page |
The counts change every day. Remote OK, Remotive, Jobicy and Arbeitnow put a short notice inside every answer; we quote those notices below, together with the documentation and terms pages, all read on 4 November 2026.
Remote OK
GET https://remoteok.com/api returns one JSON list: the first item is a legal notice, the rest are the latest jobs. On 4 November it held 99 jobs posted between 5 August and 3 November 2026, 21 of them with salary_min and salary_max (US dollars, with no field for the period). There is no key, no paging and no search; ?tag=python narrows the list to one tag. Fields, tags and a CSV script are in our Remote OK API guide.
The terms are in the legal field of every answer:
"API Terms of Service: Please link back (with follow, and without nofollow!) to the URL on Remote OK and mention Remote OK as a source, so we get traffic back from your site. If you do not we'll have to suspend API access."
The same field adds: "Please don't use the Remote OK logo without written permission as it's a registered trademark, please DO use our name Remote OK though." Remote OK's robots.txt allows ordinary user agents with Crawl-delay: 1 and carries the signal ai-train=no.
Remotive
GET https://remotive.com/api/remote-jobs returns all active jobs the API offers, with optional category, company_name, search and limit filters (from its README). On 4 November it returned 11 jobs, and its own total-job-count said 11. Eight had a salary, written as free text: "$20k -$35k", "$3.5k–$5k/month", "$50-$75 /hour".
Its 0-legal-notice field says:
"Please do not submit Remotive jobs to third Party websites, including but not limited to: Jooble, Neuvoo, Google Jobs, LinkedIn Jobs. Please link back to the URL found on Remotive AND mention Remotive as a source in order to Remotive to get traffic from your listing."
It also says that "Jobs displayed are delayed by 24 hours", that "Displaying our jobs in order to collect signups/email addresses to show a listing constitutes a breach of our terms of services", and "we advise max. 4 times a day"; the README adds that "excessive requests (more than 2x per minute) will be blocked". One more thing to know: Remotive's robots.txt has Disallow: /api/* for all user agents. The README invites developers to call the API, so we read the line as aimed at crawlers, but a tool that follows robots.txt strictly will not call it.
Himalayas
GET https://himalayas.app/jobs/api returns 20 jobs per request ("Maximum value is 20") and a nextCursor for the next page; /jobs/api/search filters by keyword, country, seniority, company and more. On 4 November totalCount was 114,131, the largest of the six by far. Eight of the 20 jobs we got had minSalary and maxSalary, with currency and salaryPeriod (USD hourly and annual, GBP and EUR annual). One gap with the documentation: it describes locationRestrictions as objects with a name, but the feed returned plain country names.
The documentation says: "No API key is required; a free API key gives you higher rate limits and usage tracking." With a key, "60 requests per minute and 10,000 per UTC day"; without one, "Requests without a key share one public allowance with every other caller." And: "The data is cached and refreshed every 24 hours, so there is no benefit to polling more frequently than once per day."
Section 113 of the Himalayas terms, for API users, allows "personal and commercial integrations, including showing Himalayas jobs on your own job board, website or app", on these conditions (the first three of six):
"(a) Every Apply action for a job from Himalayas must use the applicationLink supplied by the API. Do not replace it with a direct employer or applicant tracking system link.
(b) Clearly identify Himalayas as the source of the jobs, with a visible link to the Himalayas job or to himalayas.app.
(c) Show the jobs only on sites and apps you operate. Do not pass them on to third parties, such as other job boards, aggregators, job search engines, Google Jobs or LinkedIn Jobs, including through feeds or JobPosting structured data."
Point (c) matters if you run a job board: adding Google's JobPosting markup to Himalayas jobs is passing them on to Google Jobs. The same terms forbid scraping the website (section 30), with an exception for the public API "in line with their published documentation and rate limits" (section 30A).
Jobicy
GET https://jobicy.com/api/jobs?count=100 returned 100 jobs (the most one page allows, per the documentation, updated 19 October 2026) and a nextCursor for more. Filters: geo, industry and tag (a keyword in the title). The documentation says the API returns "listings published in the last 7 days" and keeps a 3-hour delay. Thirty-four of the 100 jobs had salaryMin and salaryMax, with currency and period ("yearly" or "hourly"). An optional paid key returns the employer's own application link instead of the Jobicy page.
Jobicy's terms are the most open of the six. From its FAQ: "You can store, cache, process, and redistribute job data as needed", and "You're welcome to create your own job board, aggregator, personalized job discovery platform, or any other product powered by our API." What it asks:
"Clearly credit Jobicy as the original source when displaying listings."
And: "Apply links provided by our free API must continue to direct users to the original job pages on Jobicy." On pace: "Start a new automated pass no more than once per hour". The friendlyNotice in each answer repeats it: "Please ensure Jobicy is clearly credited with a direct link to the source, and all application buttons redirect to the original job URL provided in this feed."
Arbeitnow
Arbeitnow is a European job board, not a remote-only one: Berlin, London, Zurich and Paris led the first page. GET https://www.arbeitnow.com/api/job-board-api returned 300 jobs per page with ?page= for more; 20 of the 300 had remote: true. There is no salary field. Its API page mentions a visa_sponsorship filter and a UK version at arbeitnow.co.uk. The response header x-ratelimit-limit said 50; we found no page that says per what.
The meta field of every answer says:
"This is a free public API for jobs, please do not abuse. I would appreciate linking back to the site. By using the API, you agree to the terms of service present on Arbeitnow.com"
It adds: "Jobs are updated every hour". Section 11 of the terms makes the link back a condition: "You also agree to providing a link back to Arbeitnow.com on your platform", and "We may revoke the permission to use API at any time." Section 11 says nothing about commercial use, while the general licence in section 2 covers the website's materials "for personal, non-commercial transitory viewing only". If you plan to use the jobs commercially, ask Arbeitnow first.
We Work Remotely (RSS)
https://weworkremotely.com/remote-jobs.rss returned 100 jobs, and each category has its own feed (the programming one returned 25). Each item has title ("Company: Job title"), region, country, state, skills, category, type, an HTML description, pubDate, expires_at and link. There is no salary field; some employers put the pay in the title. Watch the dates: 91 jobs were from October or November 2026, but one pubDate was from June 2023, on a job that expires in December 2026.
We Work Remotely has an API terms and guidelines page, but it answered every request we made on 4 November 2026 with a bot check (HTTP 403), so we could not read their terms page and do not quote it. Read it in your browser before you reuse the feed beyond your own reading. Its robots.txt allows the feed.
One free Python script for all six
The script reads each source once and writes remote_jobs.csv: source, title, company, location, salary, date and the job link that each source asks you to keep (for Himalayas, the applicationLink). It keeps only Arbeitnow's remote jobs, waits a second between sources, and counts the jobs that appear on more than one board. It is for your own use: the CSV is not a licence to republish the jobs. Standard library only (Python 3.8 or later).
"""Read six free remote-job sources once each and save the jobs to one CSV, with the source link each one asks for."""
import csv
import json
import re
import time
import urllib.request
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime
HEADERS = {"User-Agent": "remote-jobs-script"}
def get(url):
with urllib.request.urlopen(urllib.request.Request(url, headers=HEADERS), timeout=60) as response:
return response.read()
def salary(low, high, currency="", period=""):
if not low and not high:
return ""
return f"{currency} {low or '?'}-{high or '?'} {period}".strip()
def remote_ok():
for j in json.loads(get("https://remoteok.com/api"))[1:]: # item 0 is the legal notice
yield (j["position"], j["company"], j.get("location"), salary(j.get("salary_min"), j.get("salary_max"), "USD"),
j["date"][:10], j["url"])
def remotive():
for j in json.loads(get("https://remotive.com/api/remote-jobs"))["jobs"]:
yield (j["title"], j["company_name"], j["candidate_required_location"], j.get("salary") or "",
j["publication_date"][:10], j["url"])
def himalayas():
for j in json.loads(get("https://himalayas.app/jobs/api?limit=20"))["jobs"]:
names = [c if isinstance(c, str) else c["name"] for c in j["locationRestrictions"]] # plain names in the feed
where = ", ".join(names[:3]) + (f" +{len(names) - 3}" if len(names) > 3 else "") or "Worldwide"
posted = datetime.fromtimestamp(j["pubDate"], timezone.utc).date().isoformat()
yield (j["title"], j["companyName"], where, salary(j["minSalary"], j["maxSalary"], j["currency"], j["salaryPeriod"]),
posted, j["applicationLink"]) # Himalayas: every Apply must use applicationLink
def jobicy():
for j in json.loads(get("https://jobicy.com/api/jobs?count=100"))["jobs"]:
yield (j["jobTitle"], j["companyName"], j["jobGeo"],
salary(j.get("salaryMin"), j.get("salaryMax"), j.get("salaryCurrency", ""), j.get("salaryPeriod", "")),
j["pubDate"][:10], j["url"])
def arbeitnow(): # a European job board: keep only the jobs marked remote
for j in json.loads(get("https://www.arbeitnow.com/api/job-board-api"))["data"]:
if j["remote"]:
posted = datetime.fromtimestamp(j["created_at"], timezone.utc).date().isoformat()
yield j["title"], j["company_name"], j["location"], "", posted, j["url"]
def we_work_remotely(): # the public RSS feed of all categories
for item in ET.fromstring(get("https://weworkremotely.com/remote-jobs.rss")).iter("item"):
company, _, title = item.findtext("title").partition(": ")
posted = parsedate_to_datetime(item.findtext("pubDate")).date().isoformat() # a few jobs carry a date years old
yield title, company, item.findtext("region"), "", posted, item.findtext("link")
SOURCES = {"Remote OK": remote_ok, "Himalayas": himalayas, "Jobicy": jobicy,
"Arbeitnow": arbeitnow, "We Work Remotely": we_work_remotely}
# Remotive's robots.txt disallows /api/* for all user agents, while its README invites developers to use the API:
# turn it on only if you accept that invitation, at most 4 runs a day.
# SOURCES["Remotive"] = remotive
def key(title, company): # the same job on two boards: same company and title, ignoring case and punctuation
return re.sub(r"\W+", "", f"{company}|{title}".lower())
seen = {}
with open("remote_jobs.csv", "w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(["source", "title", "company", "location", "salary", "date", "url"])
for name, read in SOURCES.items():
rows = list(read())
for row in rows:
writer.writerow([name, *row])
seen.setdefault(key(row[0], row[1]), set()).add(name)
print(f"{name}: {len(rows)} jobs, {sum(1 for r in rows if r[3])} with a salary")
time.sleep(1) # one request per source, a pause between them
print(f"{sum(1 for s in seen.values() if len(s) > 1)} jobs appear on more than one source")
$ python3 remote_jobs.py
Remote OK: 99 jobs, 21 with a salary
Remotive: 11 jobs, 8 with a salary
Himalayas: 20 jobs, 8 with a salary
Jobicy: 100 jobs, 34 with a salary
Arbeitnow: 20 jobs, 0 with a salary
We Work Remotely: 100 jobs, 0 with a salary
4 jobs appear on more than one source
Remotive is off by default in the script, because of the Disallow: /api/* line in its robots.txt (see Remotive); for the run below we turned it on once, as its README invites developers to do.
What we got on 4 November 2026: 350 jobs in about 11 seconds, 71 with a salary. Only 4 jobs were on two boards (two on Remote OK and We Work Remotely, one on Remote OK and Remotive, one on Himalayas and Jobicy): the six sources overlap very little, so reading more than one adds real jobs. The script reads the first page only; for more, follow Himalayas' and Jobicy's nextCursor and Arbeitnow's ?page=, at the pace each one asks for.
Which one fits
- A job board or app of your own, with the most jobs: Himalayas. Get a free key, cache, link to the job, and keep the jobs off other job boards, Google Jobs and your
JobPostingmarkup. - An aggregator, a feed for others, or data you pass on: Jobicy, the only one whose terms we could read that says you may redistribute. Credit Jobicy and keep its apply links.
- A simple alert or newsletter for tech jobs, with salaries: Remote OK. One address, no key, about 100 recent jobs; give every job a followed link.
- Jobs in Europe, or with visa sponsorship: Arbeitnow, keeping in mind that most of its jobs are not remote.
- Remotive and We Work Remotely: fine to read for yourself. Remotive returned only 11 jobs, delayed by a day, and forbids third-party sites; for We Work Remotely, read their terms page before you reuse anything.
When our Apify Actor saves time. We make the Remote OK Jobs Scraper on the Apify Store. It reads the Remote OK API in the cloud, for up to 50 tags per run, with title and location keywords; with Only new or changed jobs on, scheduled runs return just the jobs that are new or changed since the last run. It fixes broken characters, turns a salary of 0 into an empty value, drops jobs that do not really carry your tag, and gives every result source and url for the link back. It reads only Remote OK, not the other five. Prices are in the Pricing tab of the Actor's page; the free script above is enough for a one-off export.
Questions and answers
- Do I need an API key?
- No, for all six. Himalayas offers a free key for higher limits (60 requests a minute, 10,000 a day), and Jobicy a paid key for the employer's own apply links. The others have no key at all.
- Which of them allow commercial use?
- Himalayas and Jobicy say so in plain words ("personal and commercial integrations"; "can be used in commercial projects"). Remote OK and Remotive ask for a link back without mentioning it either way, and Remotive offers a private paid API. Arbeitnow's API section does not address it, and we could not read We Work Remotely's terms. When the terms are silent, ask the board.
- Can I add the jobs to Google Jobs with JobPosting structured data?
- Not with Himalayas jobs: its terms name "Google Jobs" and "JobPosting structured data" among the forbidden ways to pass jobs on. Remotive also names Google Jobs. Jobicy allows redistribution. For the others the terms we read do not say.
- Why did Remotive return only 11 jobs?
- That is what its API offered on 4 November 2026:
total-job-countwas 11, and the jobs ran from 4 October to 2 November 2026. Its notice says jobs are delayed by 24 hours; it does not say why there are so few. Remotive also offers a private, paid API. - How often should I call them?
- As each one asks: Remote OK one request per second (robots.txt), Remotive at most 4 times a day, Himalayas once a day (its data refreshes every 24 hours), Jobicy a new pass at most once per hour, Arbeitnow without abuse (it updates hourly). Polling faster gives you nothing new.
- Why not scrape the job boards' websites instead?
- Because the APIs are what the boards offer for reuse, with clear conditions. Himalayas' terms forbid scraping the site outside the API, and the API answers are smaller, faster and stable. If you need jobs at specific companies, read them at the source instead: see how to monitor new jobs at a list of companies and the guides for Greenhouse, Lever, Ashby and Workday.
APIs, feed and script tested by Quicksloth on 4 November 2026, one or two requests per source; job counts change every day. Terms quoted from the API answers, documentation and terms pages read on 4 November 2026; they can change, so read them again before you build on them. Written with AI tools and checked by Quicksloth. Quicksloth is an independent developer and is not affiliated with Remote OK, Remotive, Himalayas, Jobicy, Arbeitnow, We Work Remotely, Apify or the companies named. Remote OK, Remotive, Himalayas, Jobicy, Arbeitnow, We Work Remotely and Apify are trademarks of their respective owners.