Job Opportunities API

Check the data. Then trust it.

REST API and OpenAPI

Call the API from any HTTP client, or import the OpenAPI spec.

  • Official

Any HTTP client · free key, no card

Set it up in 4 steps

You need a free API key (no card) — get one here.

  1. Get a free key

    Register for a free key, and keep it in an environment variable such as JOA_API_KEY.

  2. Make a request

    Send the key as a Bearer token to GET /v1/jobs with any filters (country, q, remote, category, seniority, company …):

    curl
    curl -s "https://api.jobopportunitiesapi.org/v1/jobs?country=DE&q=engineer&limit=5" \
      -H "Authorization: Bearer $JOA_API_KEY"
  3. Page through results

    Results are newest first. Pass the response's next_cursor as ?cursor= to get the next page, and stop when has_more is false.

    Response shape
    {
      "data": [
        {
          "id": "…", "slug": "…",
          "title": "…", "company": "…", "location": "…", "country": "DE",
          "remote": "remote | hybrid | on_site | not_stated",
          "apply_url": "https://… (the employer's own apply page)",
          "posted_at": "2026-10-05T17:41:41Z",
          "field_sources": { "title": "published", "remote": "inferred", "…": "…" }
        }
      ],
      "next_cursor": "… (pass as ?cursor= for the next page)",
      "has_more": true
    }
  4. Import the spec

    Point Postman, Insomnia, an API gateway or a code generator at /openapi.json or /openapi.yaml to get every endpoint and parameter.

Example: for job boards

A board fetches /v1/jobs for its niche every night, stores each job by id, and uses /v1/jobs/{id}?include_closed=true (or the change feed on Growth) to drop roles once employers close them.

Example: for AI agents

Generate tool definitions straight from /openapi.json, or use the MCP server, which already wraps the main endpoints as agent tools.

Questions

Straight answers about plans, metering and what to show.

How is usage counted?

Every job row the API returns counts against your plan's monthly record allowance, exactly as a direct API call would. The free key has a small monthly allowance and needs no card, so start with small page sizes and a daily schedule rather than polling every few minutes. Your key's largest page size is in GET /v1/me (limits.max_page_size).

Can it remove jobs that have closed?

Yes, two ways. The change feed (/v1/changes) and the closure feed (/v1/jobs/expired) are on the Growth plan and above and are the cheapest way to keep a copy in sync. On every plan you can re-check a single job with GET /v1/jobs/{id}?include_closed=true, which returns it with status "closed" once the employer has taken it down.

Where do applicants apply?

On the employer's own site. Every job carries apply_url, the employer's application page or applicant-tracking-system link. Job Opportunities API never sits between the candidate and the employer, so always use apply_url as the apply button.

Do I need to show any attribution?

Yes, one line where listings are shown publicly: a visible credit "Data: Job Opportunities API" linking to https://jobopportunitiesapi.org (see /terms — storing, displaying, reselling and redistributing within your key's plan limits are all allowed). In addition, jobs listed through Erioun for Teams carry an attribution field (for example "via Erioun for Teams") and a canonical_url: when attribution is present, show it with the listing and link to canonical_url.

See all integrations

Get a free API key

No card. The same key works for every integration on this site.

Get a free key →