Job Opportunities API

Check the data. Then trust it.

Job Opportunities API MCP server

Let Claude, Cursor, VS Code and other AI assistants search live job postings.

  • Official
  • No code

Remote server at https://api.jobopportunitiesapi.org/mcp (Streamable HTTP) · key only in the Authorization header

Set it up in 3 steps

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

  1. Get a free key

    Register for a free key. Two tools, market_signals and coverage, work without one; search_jobs, get_job, company_hiring and changes_since use it.

  2. Add the server to your client

    Pick your client below and copy its config. The key goes only in the Authorization: Bearer header of the connection, never in the URL or a tool argument.

  3. Ask a question

    Try: "Find remote data engineering jobs in the Netherlands posted this week and give me the apply links." The agent calls search_jobs and answers with the employer's own apply_url.

Configs for your AI assistant

Replace YOUR_API_KEY with your key. More detail, including raw JSON-RPC examples, is on the MCP server page.

Claude Code

Run in your terminal (add --scope user to use it in every project):

Terminal
claude mcp add --transport http joa \
  https://api.jobopportunitiesapi.org/mcp \
  --header "Authorization: Bearer YOUR_API_KEY"

Claude (claude.ai and Claude Desktop)

Settings → Connectors → Add custom connector. Name it Job Opportunities API, paste the URL below, and under Request headers add Authorization with the value Bearer YOUR_API_KEY.

Server URL
https://api.jobopportunitiesapi.org/mcp

Prefer a config file? Claude Desktop can also reach the server through mcp-remote, in claude_desktop_config.json:

Claude Desktop (config file, via mcp-remote)

claude_desktop_config.json — the header value is passed through env because some clients mangle spaces inside args:

claude_desktop_config.json
{
  "mcpServers": {
    "joa": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.jobopportunitiesapi.org/mcp",
               "--header", "Authorization:${JOA_AUTH_HEADER}"],
      "env": { "JOA_AUTH_HEADER": "Bearer YOUR_API_KEY" }
    }
  }
}

Cursor

Project .cursor/mcp.json, or ~/.cursor/mcp.json for every project:

.cursor/mcp.json
{
  "mcpServers": {
    "joa": {
      "url": "https://api.jobopportunitiesapi.org/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}

VS Code

.vscode/mcp.json in your workspace. VS Code asks for the key once and stores it securely:

.vscode/mcp.json
{
  "inputs": [
    { "type": "promptString", "id": "joa-key", "description": "Job Opportunities API key", "password": true }
  ],
  "servers": {
    "joa": {
      "type": "http",
      "url": "https://api.jobopportunitiesapi.org/mcp",
      "headers": { "Authorization": "Bearer ${input:joa-key}" }
    }
  }
}

Windsurf

mcp_config.json (~/.config/devin/mcp_config.json in current versions; ~/.codeium/windsurf/mcp_config.json in older ones). The key can come from an environment variable:

mcp_config.json
{
  "mcpServers": {
    "joa": {
      "serverUrl": "https://api.jobopportunitiesapi.org/mcp",
      "headers": { "Authorization": "Bearer ${env:JOA_API_KEY}" }
    }
  }
}

ChatGPT

ChatGPT connects remote MCP servers through developer mode (Business and Enterprise/Edu workspaces; Pro with read/fetch access): Settings → Apps → Create, paste the server URL and choose the authentication. ChatGPT's setup offers OAuth or no authentication and documents no way to send a fixed API-key header, so with no authentication ChatGPT gets the two keyless tools, market_signals (salary and time-to-fill statistics) and coverage. Job search needs a client that sends the Authorization header, such as Claude, Cursor or VS Code above.

Server URL
https://api.jobopportunitiesapi.org/mcp
STEP 1Your AI assistantClaude, Cursor, VS Code …STEP 2MCP serverAuthorization: Bearer headerSTEP 3Job Opportunities APIsearch_jobs, get_job,company_hiring …STEP 1Your AI assistantClaude, Cursor, VS Code …STEP 2MCP serverAuthorization: Bearer headerSTEP 3Job Opportunities APIsearch_jobs, get_job, company_hiring …
Diagram (not a screenshot): how a client reaches the data through the MCP server.

Example: for job boards

A board owner asks Claude "which employers in Lisbon posted product design roles this month, and how fast does that market fill roles?" before deciding which niche to launch next; market_signals answers the second half without a key.

Example: for AI agents

A recruiting agent in Cursor or VS Code calls search_jobs with country, category and remote filters, then get_job for the full advert text of the shortlisted roles, and drafts outreach with the employer's apply_url. company_hiring adds each employer's open-roles trend.

Questions

Straight answers about plans, metering and what to show.

Which tools need a key?

market_signals and coverage work with no key. search_jobs, get_job and company_hiring use your normal key and plan; changes_since needs the Growth plan or above, like /v1/changes.

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 I put the key in the URL?

No. The server accepts the key only as an Authorization: Bearer header on the MCP connection. A key in the URL or a tool argument is ignored, which keeps it out of logs and prompts.

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 →