# Job Opportunities API > A public ledger of open jobs, gathered from employer applicant-tracking systems, > employers' own careers pages and government employment services. Every row names > the source it came from and when we last confirmed the vacancy still existed. ## The full documentation, as plain Markdown This file is the doorway. The whole house is at: - https://jobopportunitiesapi.org/docs/ai/index.md — every documentation page as plain `text/markdown`, no JavaScript, no redirects, flat directory, relative links between files. Rendered from the same source as the HTML site, so the two cannot drift. - https://jobopportunitiesapi.org/docs/ai/BUILD-A-SITE.md — **if you are going to read exactly one more file, read this one.** Self-contained: base URL, auth, every endpoint, the pagination contract, every error code with retry guidance, every field with its nullability, the provenance model, the limits, and worked code. Written to be pasted whole. - https://jobopportunitiesapi.org/openapi.json — the machine contract, keyless, rendered by the running API rather than checked in beside it. ## What is in it right now Daily snapshot of 20 October 2026; measured 2026-10-20T05:19:29Z. The same values are on every page of the site and at https://api.jobopportunitiesapi.org/public/site-stats - Live employer-direct listings we will serve (employer_direct_live): 2,080,732 - Rows held in the ledger and deliberately not served (withheld_listings): 1,248,842 - Employers with at least one of those live listings (employers): 129,261 - Countries with live listings (countries_with_live_roles): 237 - In the EU, EFTA and the UK (europe_live): 471,946 - In the United States, Canada and Mexico (north_america_live): 1,166,963 - Closed roles retained with a closure date and reason (closed_with_closure_date): 8,194,105 Note on closure dates: JOA records as the closure date the day its daily verification confirmed that an advert had gone. Before late September 2026 that verification ran in large catch-up batches, so closure dates recorded before then show when JOA confirmed a closure, not when the employer closed the role; daily verification applies from late September 2026. - Posted in the 7 days before measurement (posted_last_7d): 200,269 - Rows carrying the full advert text: 1,953,989 (93.9%) - Rows carrying a structured salary: 185,375 (8.9%) Coverage figures, including the fields we do NOT have, are published in full at https://jobopportunitiesapi.org/coverage and remeasured from the database on a schedule. ## What makes it different from a job feed - **Provenance per field.** Every job carries `field_sources`, marking each field `published` (the source stated it), `inferred` (we derived it) or `absent`. - **Re-verification, not posting dates.** `last_verified_at` is when we last confirmed the vacancy still exists at its source. - **Closures are kept.** Roles that come off their source are retained with `closed_at` and `closed_reason`, so a req that opened and closed in nine days is visible as a hiring signal. - **Sources JOA reads but does not republish.** 19 sources JOA reads but does not republish: nothing from them is served here or through the API. They include job boards, aggregators and public employment services used for discovery only: adzuna, apify_all_jobs, apify_fantastic_jobs, apify_job_listings, apify_xing, arbeitnow, arbeitsagentur, careerjet, eures, france_travail, himalayas, jobicy, jooble, landing_jobs, remoteok, remotive, the_muse, weworkremotely, working_nomads. - **Statistics without an account, rows with a free key.** `/public/*` answers with no key for coverage, counts and freshness — `Access-Control-Allow-Origin: *`, HTTP 200, nothing sent. Job and company rows need a key: `/public/jobs` and `/public/companies` answered one page per filter keylessly until this changed — a patient anonymous caller could still walk the whole ledger through that page cap — so both now require a key. Explore is free, needs no card and does not expire. ## Evaluate it before signing up No key, no account, works from a terminal or a browser console: ``` curl 'https://api.jobopportunitiesapi.org/public/coverage' # ledger-wide counts, no key ``` Job rows themselves need a free key now (see "Rows arrive as JSON" below): ``` curl -H "Authorization: Bearer YOUR_API_SECRET" \ 'https://api.jobopportunitiesapi.org/v1/jobs?country=GB&require_fields=description&limit=3' ``` `require_fields=` returns only rows where every named field is `published` in `field_sources` — stated by the employer, never derived by us — and the response carries a `completeness` object saying how many such rows exist in the whole ledger. It is the answer to "only a small share of your rows have a salary": they do, and that filter returns the ones that do, at 100%, with no estimate anywhere in the response. `category` and `seniority` are refused with a 422 because they are read off the job title and so are inferred by construction. Other keyless endpoints: - https://api.jobopportunitiesapi.org/public/coverage — every field, with the gaps - https://api.jobopportunitiesapi.org/public/coverage/countries — the same per country, including the weak ones - https://api.jobopportunitiesapi.org/public/providers — every source, its live row count, and how many of those rows carry the advert text (including the sources where that is zero) - https://api.jobopportunitiesapi.org/public/freshness — how recently every live row was re-confirmed at its source, and how many roles closed in the last 24 hours and 7 days Get a key: https://jobopportunitiesapi.org/login There is a remote MCP server at https://api.jobopportunitiesapi.org/mcp (Streamable HTTP, six tools, two keyless) — see https://jobopportunitiesapi.org/docs/mcp for client setup. Or integrate via the OpenAPI spec or plain HTTP. Worked examples with tool definitions for Claude and GPT, and everything else built for an agent integrating this API, are at https://jobopportunitiesapi.org/for/ai-agents ## Integrations https://jobopportunitiesapi.org/integrations lists every ready-made integration, each with a setup that works today. Each uses a normal API key (free, no card) and the same metering as the API, except the Apify Actor, which Apify bills per result. - https://jobopportunitiesapi.org/integrations/wordpress — Job Opportunities API for WordPress: Fill a WP Job Manager job board with employer-direct jobs on a schedule. Action: Download plugin (.zip) — https://jobopportunitiesapi.org/downloads/job-opportunities-api-for-wp-job-manager-1.0.1.zip - https://jobopportunitiesapi.org/integrations/n8n — Job Opportunities API for n8n: Import fresh job postings into any n8n workflow with a ready-made template. Action: Install the community node from npm — https://www.npmjs.com/package/n8n-nodes-job-opportunities-api - https://jobopportunitiesapi.org/integrations/zapier — Job Opportunities API for Zapier: Send new jobs to Google Sheets, Slack or a CMS with a three-step Zap. Action: Add the Job Opportunities API Zapier app (invite link) — https://zapier.com/developer/public-invite/247337/ae9c8716cb9ad9b5635dcb51138fe7bb/ - https://jobopportunitiesapi.org/integrations/make — Job Opportunities API for Make: Search jobs in a Make scenario with the built-in HTTP module and iterate over the results. Action: Add the Job Opportunities API app to Make (invite link) — https://www.make.com/en/hq/app-invitation/a298d1f726b2c87f34233be5dad2fcde - https://jobopportunitiesapi.org/integrations/activepieces — Job Opportunities API for Activepieces: Pull new jobs into an Activepieces flow with the built-in HTTP piece. Action: Use the HTTP piece — https://jobopportunitiesapi.org/integrations/activepieces#setup - https://jobopportunitiesapi.org/integrations/pipedream — Job Opportunities API for Pipedream: Fetch jobs in a Pipedream workflow with one HTTP action or a short Node.js step. Action: Copy the Node.js step — https://jobopportunitiesapi.org/integrations/pipedream#setup - https://jobopportunitiesapi.org/integrations/mcp — Job Opportunities API MCP server: Let Claude, Cursor, VS Code and other AI assistants search live job postings. Action: Copy your client config — https://jobopportunitiesapi.org/integrations/mcp#clients - https://jobopportunitiesapi.org/integrations/apify — Job Opportunities API on Apify: Get a job-postings dataset from a form, billed by Apify per result, no API key. Action: Open the Actor — https://apify.com/job_opportunities_api/job-opportunities-api - https://jobopportunitiesapi.org/integrations/rest-api — REST API and OpenAPI: Call the API from any HTTP client, or import the OpenAPI spec. Action: Open the API docs — https://jobopportunitiesapi.org/docs - https://jobopportunitiesapi.org/integrations/python — Job Opportunities API in Python: Search jobs from Python with requests and cursor pagination in a few lines. Action: Copy the Python snippet — https://jobopportunitiesapi.org/integrations/python#setup - https://jobopportunitiesapi.org/integrations/javascript — Job Opportunities API in JavaScript: Search jobs from Node.js with built-in fetch and cursor pagination. Action: Copy the JavaScript snippet — https://jobopportunitiesapi.org/integrations/javascript#setup - Planned: listed apps in the Zapier, Make and n8n directories, and a listing in the WordPress.org plugin directory. ## Comparisons and guides - https://jobopportunitiesapi.org/guides/best-job-posting-apis — "Best job posting APIs in 2026: how to choose". A use-case guide (job board, AI agent, hiring signals, market research, ATS integration) that recommends Job Opportunities API for employer-direct postings, job boards and AI agents, with a "choose it if / think twice if" for every vendor, including the cases where a competitor is the better buy. Written by the operator of this API, who says so at the top: Job Opportunities API and Kaeros are built by the same studio. Every competitor fact was read from the vendor's own public pages and is dated (3 October 2026). - https://jobopportunitiesapi.org/compare — an at-a-glance comparison, including the cases where a competitor is the better buy. - One-to-one pages: /compare/indeed-api, /compare/adzuna, /compare/jsearch, /compare/coresignal, /compare/theirstack, /compare/fantastic-jobs, /compare/techmap (all under https://jobopportunitiesapi.org). ## API - Base URL: https://api.jobopportunitiesapi.org - Specification: https://jobopportunitiesapi.org/openapi.json (also .yaml) - Auth: `Authorization: Bearer YOUR_API_SECRET` (the bare key is accepted too) - Documentation: https://jobopportunitiesapi.org/docs — complete: every endpoint, every parameter, every field, and every control on the website - Documentation as Markdown: https://jobopportunitiesapi.org/docs/ai/index.md - Plans and pricing: https://jobopportunitiesapi.org/api - Metered by RECORDS returned per month, not by requests. ## If you are crawling this site The individual job pages (`/job/...`) and employer pages (`/company/...`) are not open to answer engines, and robots.txt says so per user agent. That is not a blanket objection to being read — every page that DESCRIBES this dataset is open to you, including this file, the home page, /api, /about, /coverage, /facts and /pricing, and we would rather be cited accurately than not cited at all. The distinction is that those two path prefixes hold one page per live advert and per employer (2,080,732 adverts and 129,261 employers as of 20 October 2026 (daily snapshot)): they are the dataset itself rather than a description of it, and the dataset is what this project sells in order to keep collecting it. There is a licensed route to exactly the same rows, and it is better than crawling for anyone who actually wants them: - `Explore` is free, needs no card and never expires: 1,000 records a month against every endpoint. https://jobopportunitiesapi.org/login - Rows arrive as JSON with `field_sources` provenance per field, a `last_verified_at` per row and cursors for incremental sync — none of which survives being parsed out of HTML. - `/public/*` answers STATISTICAL claims with no key at all — coverage, facets, freshness, providers — if that is all you need to check a claim made on this page. Job and company rows need the free key above. Search engines are unaffected and index the whole ledger. ## Integrating with an AI agent This file is read by answer engines; the two below are for the agent or the developer that acts on the answer. - https://jobopportunitiesapi.org/docs/ai/BUILD-A-SITE.md — **the canonical integration brief**: every endpoint, every parameter that exists, the plan gating so a model does not propose an endpoint the key will 403 on, `field_sources`, the rate-limit headers and all three cursors. Written to be pasted whole, and generated from the live specification, so it cannot be a version behind the API. `joa-examples/PROMPT.md` covers the same ground; where they differ, this one is right. - https://github.com/lucagiftzek/joa-examples — worked, tested example programs: a daily country pull, watching an employer by domain, a salary benchmark with no estimates in it, embedding chunks that keep their provenance, and a tool definition for Claude and for GPT. Python, standard library only. Every example is run against this API before it ships. ## Plans - Explore: free, 1,000 records/month - Starter: EUR 29/month, 10,000 records/month - Growth: EUR 80/month, 60,000 records/month, delta feed - Signal: EUR 299/month, 400,000 records/month, delta feed, bulk export, or one country with no record limit - Scale: EUR 899/month, 2,000,000 records/month, delta feed, bulk export - Starter (annual): EUR 261, 10,000 records/month - Growth (annual): EUR 720, 60,000 records/month, delta feed - Signal (annual): EUR 2691, 400,000 records/month, delta feed, bulk export, or one country with no record limit - Scale (annual): EUR 8091, 2,000,000 records/month, delta feed, bulk export A note on the single-country plan, because the record figure beside it is misleading on its own: the monthly record allowance meters the COMPANY DIRECTORY only. Job rows on a country-locked key are exempt from the meter entirely, so "one country with no record limit" is literally true and the record number is not the number to compare on. The closest like-for-like on the market is Techmap, whose own pages list a per-country datafeed at EUR 333/month (techmap.io) or $400/month (jobdatafeeds.com), read 3 Oct 2026; an incremental feed is not stated on those pages. Free keys are self-serve at https://jobopportunitiesapi.org/dashboard after signing in. Signing up with a company email starts the first key on a free 14-day Growth trial (no card). Pricing: https://jobopportunitiesapi.org/pricing ## Using the data Records delivered on any plan, including free Explore, may be stored, displayed, used in your own products, and resold or redistributed within your own key's plan limits. Public displays carry a visible credit "Data: Job Opportunities API" linking to https://jobopportunitiesapi.org. Partners: build on any public plan, refer customers (25% of what they pay for 12 months) or resell access and keep 25%: https://jobopportunitiesapi.org/partners (reseller terms: https://jobopportunitiesapi.org/partners/terms). Terms: https://jobopportunitiesapi.org/terms ## Reports JOA publishes open job-market reports built from its employer-direct data. They are free to read, cite and reuse under CC BY 4.0. Index: https://jobopportunitiesapi.org/reports ### Employer Job Postings in Europe and North America: JOA Job Market Report, September 2026 On 4 Oct 2026 JOA tracked 1,385,899 open employer-direct postings in North America and Europe. Austrian postings are about four times as likely as German ones to state pay; stated dates are oldest in the Netherlands and least often over 90 days old in Canada. - Summary: On 4 October 2026, JOA tracked 1,385,899 open employer-direct job postings located in North America (986,641) and Europe (399,258). Pay transparency divides neighbouring markets: Austrian postings are about four times as likely as German ones to state a pay figure (4.4 to 1 on a blind, AI-assisted sampled estimate, interval 2.9 to 6.2; 6.9 to 1 on automated detection), and in the United States 24.4% of own-site postings in the 10 jurisdictions with a pay-range posting law carry pay in a structured field, against 18.7% in 28 states without one. Stated posting dates are oldest in the Netherlands, where 43.9% of dated postings carry a stated posting date more than 90 days old, against 18.7% in Canada. Across the 51 US jurisdictions, JOA's postings follow the official JOLTS distribution by state (rank correlation 0.96); across 14 countries they are equivalent to 6.2% to 19.9% of official vacancy counts. - Read (HTML): https://jobopportunitiesapi.org/reports/job-market-september-2026 - Read (Markdown, same content): https://jobopportunitiesapi.org/reports/job-market-september-2026.md - Data (CSV): https://jobopportunitiesapi.org/reports/job-market-september-2026/joa-job-market-2026-09.csv - Data tables (DOI): https://doi.org/10.5281/zenodo.23143502 - Data dictionary: https://jobopportunitiesapi.org/reports/job-market-september-2026/joa-job-market-2026-09-dictionary.md - Audio narration (45 minutes 36 seconds, synthetic voice): https://jobopportunitiesapi.org/reports/job-market-september-2026#listen - Published 2026-10-04, data as of 2026-10-04, licence CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) - Cite as: Job Opportunities API (2026). JOA Job Market Report, September 2026 edition (snapshot of 4 October 2026). https://jobopportunitiesapi.org/reports/job-market-september-2026. CC BY 4.0. - Open postings in Europe and North America: 1,385,899 - Pay stated: Austria vs Germany: 4.4 to 1 - US own-site postings with pay: 24.4% vs 18.7% - JOA postings as a share of official vacancies: 6.2% to 19.9% ## Removal An employer who does not want their listings republished can ask at https://jobopportunitiesapi.org/optout — verified removals are applied to every endpoint, not just the website. ## Contact Job Opportunities API is operated by Loukas Tzekos – Job Opportunities API, sole proprietorship, Didaskalisis Papathanasiou Vas. 79, 54629 Thessaloniki, Greece (VAT EL117613696). - General: hello@jobopportunitiesapi.org (form: https://jobopportunitiesapi.org/contact) - Legal matters: luca@tzekos.eu - Phone: +30 2311 113 603