Free Job APIs With No API Key: Working Examples

CleanJobData Engineering

TL;DR

You can pull real job listings today with no key from Remotive, Arbeitnow, RemoteOK, Himalayas, Jobicy and the public Greenhouse, Lever and Ashby board endpoints. Each request below was tested in October 2026. 'No key' doesn't mean 'no rules': most require a visible link back to the source, several are remote-only, and Remotive blocks more than 2 requests a minute. For global jobs with structured location and salary filters you'll need a key, but CleanJobData's is free and needs no card.

If you want job data without a signup form, there are real options. Every endpoint below was called with plain curl in October 2026 and returned live listings. The trade-off is that keyless sources are narrower (remote-only, Europe-only, or one employer at a time) and almost all of them ask for attribution. For limits, terms and more detail on each, see Best Free Job APIs in 2026.

Remote Jobs

# Remotive: remote jobs worldwide
curl "https://remotive.com/api/remote-jobs?limit=5"
 
# Himalayas: remote jobs, cursor pagination
curl "https://himalayas.app/jobs/api?limit=5"
 
# Jobicy: remote jobs from the last 7 days
curl "https://jobicy.com/api/v2/remote-jobs?count=5"
 
# RemoteOK: remote jobs (the first array element is a legal notice, not a job)
curl "https://remoteok.com/api"

What to know before shipping any of these:

  • Remotive: requests above 2 per minute are blocked, and Remotive advises at most 4 a day. Jobs are 24 hours delayed. You must link to the Remotive URL and credit Remotive, and you must not forward its jobs to other job sites.
  • Himalayas: 20 jobs per request, refreshed every 24 hours, so polling more than daily is wasted. A visible link to himalayas.app is required.
  • Jobicy: only the last 7 days of jobs, with a 3-hour delay. Credit with a direct link is required, and its notice says application buttons should redirect to the original job URL it provides.
  • RemoteOK: link back with a followed link (no nofollow) and mention Remote OK, or access may be suspended.

Europe

# Arbeitnow: Europe and Germany focus
curl "https://www.arbeitnow.com/api/job-board-api"

Arbeitnow returns a data array of jobs aggregated from ATS platforms, and has a separate UK endpoint at arbeitnow.co.uk. Its responses ask you to link back and not to abuse the API, and a response header showed a limit of 50 with no stated time window. Its site terms include language restricting commercial use, public display and mirroring, and it isn't spelled out whether that covers the API, so ask Arbeitnow before building a product on it.

One Employer at a Time

The public job boards of three ATS platforms need no key to read:

# Greenhouse (add content=true for full descriptions)
curl "https://boards-api.greenhouse.io/v1/boards/stripe/jobs"
 
# Lever (EU-hosted companies use api.eu.lever.co)
curl "https://api.lever.co/v0/postings/spotify?limit=5"
 
# Ashby (add includeCompensation=true for pay ranges)
curl "https://api.ashbyhq.com/posting-api/job-board/ashby"

These are public job board endpoints. The catch is that each call returns one employer's jobs, and you have to know that employer's board token, site slug or board name in advance. There's no search across employers. The guides for Greenhouse, Lever and Ashby cover each in depth.

What the Responses Look Like

These are real responses from 7 October 2026, trimmed to one job each, with long values shortened. Treat field names as a snapshot: none of these providers promise a stable schema in the pages we read.

Remotive returns { "job-count": …, "jobs": [ … ] }:

{
  "id": 2091149,
  "url": "https://remotive.com/remote-jobs/software-development/…",
  "title": "Software Engineer / AI Code Trainer",
  "company_name": "CodeForAI",
  "company_logo": "https://remotive.com/job/2091149/logo",
  "category": "Software Development",
  "tags": ["api"],
  "job_type": "contract",
  "publication_date": "2026-10-05T05:15:43",
  "candidate_required_location": "USA, UK, India, Australia, …",
  "salary": "$45-$120/Hour",
  "description": "<div class=\"h2\">…"
}

Location and salary are free-text strings, and the description is HTML. The response also begins with a legal notice field.

Arbeitnow returns { "data": [ … ], "links": …, "meta": … }:

{
  "slug": "servicekraft-barista-in-hamburg-…",
  "company_name": "Isabella Glutenfreie Pâtisserie GmbH & Co. KG",
  "title": "Servicekraft / Barista (m/w/d)",
  "description": "<p>Schaue dir an was …",
  "remote": false,
  "url": "https://www.arbeitnow.com/jobs/companies/…",
  "tags": [],
  "job_types": ["Entry"],
  "location": "Hamburg, Hamburg, Deutschland",
  "created_at": 1791426613
}

There is no salary field, and created_at is a Unix timestamp in seconds.

RemoteOK returns a bare array whose first element is the legal notice. Skip it before reading jobs:

{
  "slug": "remote-project-manager-spiralyze-1137466",
  "id": "1137466",
  "epoch": 1791315342,
  "date": "2026-10-06T19:35:42+00:00",
  "company": "Spiralyze",
  "position": "Project Manager",
  "tags": ["project manager"],
  "description": "<p>The Project Manager is …",
  "location": "Worldwide",
  "apply_url": "https://remoteOK.com/remote-jobs/…",
  "salary_min": 0,
  "salary_max": 0,
  "url": "https://remoteOK.com/remote-jobs/…"
}

Note that salary_min and salary_max are 0 when no salary was given, so filter zeros out rather than showing "$0".

Himalayas returns { "totalCount", "nextCursor", "jobs": [ … ] }:

{
  "title": "Content Marketing Manager",
  "excerpt": "Canonical is a leading provider of …",
  "companyName": "Canonical",
  "companySlug": "canonical",
  "employmentType": "Full Time",
  "minSalary": null,
  "maxSalary": null,
  "salaryPeriod": "annual",
  "currency": null,
  "seniority": ["Manager"],
  "locationRestrictions": [],
  "timezoneRestrictions": [-11],
  "categories": ["Content-Marketing-Manager"],
  "parentCategories": ["Marketing"],
  "description": "<p>…",
  "pubDate": 1791431319,
  "expiryDate": 1796615318,
  "applicationLink": "https://himalayas.app/companies/canonical/jobs/…"
}

It is the most structured of the remote feeds: seniority, salary period, timezone restrictions and an expiry date. applicationLink points to a Himalayas page rather than the employer's own.

Jobicy returns { "jobCount", "nextCursor", "hasMore", "jobs": [ … ] }:

{
  "id": 154795,
  "url": "https://jobicy.com/jobs/154795-event-travel-manager",
  "jobTitle": "Event Travel Manager",
  "companyName": "TripActions",
  "jobIndustry": ["Project & Program Management"],
  "jobType": ["Full-Time"],
  "jobGeo": "USA",
  "jobLevel": "Director",
  "jobExcerpt": "Purpose of the Role: …",
  "jobDescription": "<p><strong>Purpose of the Role:</strong></p>…",
  "pubDate": "2026-10-07T19:37:36+00:00",
  "salaryMin": 68000,
  "salaryMax": 72000,
  "salaryCurrency": "USD",
  "salaryPeriod": "yearly"
}

Greenhouse returns { "jobs": [ … ], "meta": { "total": 724 } }:

{
  "id": 8172487,
  "title": "Abuse Investigator",
  "company_name": "Stripe",
  "location": { "name": "Dublin" },
  "absolute_url": "https://stripe.com/jobs/search?gh_jid=8172487",
  "first_published": "2026-09-03T13:30:34-04:00",
  "updated_at": "2026-10-07T19:02:27-04:00",
  "language": "en",
  "requisition_id": "See Opening ID",
  "data_compliance": [{ "type": "gdpr", "requires_consent": false, … }]
}

The list has no description. Add ?content=true to include it. Location is a single name string.

Lever returns a bare array of postings:

{
  "id": "2193db3f-77c5-43b8-b030-8f92c9882bf1",
  "text": "Android Engineer - Experience",
  "categories": {
    "commitment": "Permanent",
    "department": "Engineering",
    "location": "London",
    "team": "Experience",
    "allLocations": ["London"]
  },
  "country": "GB",
  "workplaceType": "hybrid",
  "createdAt": 1782214185805,
  "descriptionPlain": "We design Spotify's consumer experience …",
  "description": "<div>…",
  "lists": [{ "text": "What You'll Do", "content": "<div>…" }],
  "hostedUrl": "https://jobs.lever.co/spotify/2193db3f-…",
  "applyUrl": "https://jobs.lever.co/spotify/2193db3f-…"
}

createdAt is in milliseconds, unlike Arbeitnow's seconds. Postings that disclose pay carry a salaryRange object, which this sample doesn't have.

Ashby returns { "apiVersion": "1", "jobs": [ … ] }:

{
  "id": "7458d4e9-da2e-47bd-98cb-adfda43d42b2",
  "title": "Engineering Manager - EU",
  "department": "Engineering",
  "team": "EMEA Engineering",
  "employmentType": "FullTime",
  "location": "Remote - European Union",
  "secondaryLocations": [{ "location": "Spain", "address": { "postalAddress": { … } } }],
  "isRemote": true,
  "workplaceType": "Remote",
  "publishedAt": "2024-03-04T14:29:08.532+00:00",
  "address": { "postalAddress": { "addressCountry": "European Union", … } },
  "jobUrl": "https://jobs.ashbyhq.com/ashby/7458d4e9-…",
  "applyUrl": "https://jobs.ashbyhq.com/ashby/7458d4e9-…",
  "descriptionHtml": "<p>…",
  "descriptionPlain": "Hi …"
}

The Same Field Under Different Names

Put the eight side by side and the problem is clear:

ConceptRemotiveArbeitnowRemoteOKHimalayasJobicyGreenhouseLeverAshby
TitletitletitlepositiontitlejobTitletitletexttitle
Companycompany_namecompany_namecompanycompanyNamecompanyNamecompany_namenot in the postingnot in the posting
Postedpublication_date (ISO)created_at (seconds)date (ISO)pubDate (seconds)pubDate (ISO)first_published (ISO)createdAt (ms)publishedAt (ISO)
Locationcandidate_required_location (text)location (text)location (text)locationRestrictions (array)jobGeo (text)location.namecategories.locationlocation
Apply linkurlurlapply_urlapplicationLinkurlabsolute_urlapplyUrlapplyUrl

Eight sources give you eight parsers, three date formats, and no consistent location structure. That is the cost of going keyless and source by source, and it is the problem a normalized API such as CleanJobData exists to remove. Its response uses one schema for every employer, with structured location IDs and numeric salary fields. See the quickstart for a sample.

Where Keyless Stops Working

Keyless sources fall short in three common cases:

  1. Global coverage. Most are remote-only or regional.
  2. Structured search. Locations are free text (for example, candidate_required_location on Remotive), and none of them filter by city ID, salary range, or experience level the way you'd need for a real job board.
  3. Terms. Link-back rules and bans on republishing matter once you have a public product.

If you need those, you do need a key, but it doesn't have to cost anything or need a card. CleanJobData's free Trial gives 300 requests a day with 20 jobs per response, with filters for location, salary, seniority, remote status and freshness. Sign up, or try queries first in the playground. A step-by-step walkthrough is in the quickstart.