RolesAPI
MCP server live at api.rolesapi.com/mcp

The Indeed API for job postings.
One REST call.

Normalized role objects, live search, salaries and descriptions for developers, AI agents, and spreadsheets. 100 free credits, no card required.

Get your free API key 100 credits included · no card
Bearer-key auth JSON · CSV · NDJSON 60+ country editions
api.rolesapi.com REQUEST
· Auth
· Rate limit
· Credits
· Cache
· 200

Simulated response · see real request shapes ↓

How it works

Key to data in under a minute

1

Get a key

Sign up, no card needed, and copy your rk_ API key from the dashboard. 100 free credits are already on the account.

rk_live_4f8a...c219
2

Call an endpoint

One bearer header, standard HTTP. Look up a role by key or URL, search by keyword and location, or batch up to 500 at once.

GET /v1/roles/{job_key}
3

Use the data

Every answer is the same normalized role object. Parse it once, or skip code entirely and export CSV straight from the dashboard.

?format=csv · json · ndjson

The data

One normalized shape for every Indeed posting

Pick a search and watch role objects come back the way your parser wants them: title, company, location, salary, posted date. Same envelope from every endpoint, in 60+ country editions.

POST /v1/search
a1b2c3d4e5f60718 Full-time
Senior Backend Engineer
Acme Logistics
Austin, TX
$140k–175k/yr 2026-06-28
b2c3d4e5f6a70819 Full-time
React Developer
Brightloop
Austin, TX
$120k–150k/yr 2026-06-30
c3d4e5f6a7b80920 Hybrid
Frontend Engineer, Web
Kernwave
Austin, TX · Hybrid
$135k–160k/yr 2026-07-01
d4e5f6a7b8c91021 Remote
Full-Stack Developer
Postline
Remote (US)
$110k–145k/yr 2026-07-02
"total": 154 · "count": 4 shown 1 credit / page
Run this search yourself for free 100 credits on sign-up · no card

API surface

Every endpoint, same envelope

Role lookups, live search, batch enrichment, async jobs, and signed webhooks. Click through and the example updates.

GET /v1/roles/{job_key}

Fetch one normalized role object (title, company, location, salary, description, benefits) from an Indeed job key. 1 credit.

ParameterInDescription
job_keypathThe Indeed job key (the jk= value in a viewjob URL)
countryqueryCountry edition, e.g. us, gb, de (default us)
fieldsqueryOptional comma list to project the response
example request
curl -s "https://api.rolesapi.com/v1/roles/a1b2c3d4e5f60718?country=us" \
  -H "Authorization: Bearer rk_live_..."

Use cases

What developers build with Indeed job data

The same normalized role object, pointed at different problems.

Job boards & aggregators

Keep a niche board fresh without running your own data infrastructure. Search by keyword and location on a schedule, enrich new postings in batch, and dedupe on job_key.

/v1/search/v1/roles/batch

Salary & market research

Pull disclosed salary ranges by title, city, or country edition and track how pay moves over time. The salary sub-resource returns just the pay block for 1 credit.

/v1/roles/{key}/salarycountry=gb

Recruiting & sourcing tools

See which companies are hiring for what, where, right now. Enrich a list of postings with company blocks and full descriptions in one async job.

/v1/search/with-details/v1/roles/{key}/company

AI career agents

Give an agent the MCP server and it can search roles, compare salaries, and read full descriptions on a user's behalf, with no custom tool code.

/mcpsearch_rolesget_salary_info

Spreadsheets & no-code

No code at all: configure a search in the dashboard and download CSV. Or hit the GET-shaped /v1/listings straight from Sheets.

/v1/listingsformat=csv

Alerts & monitoring

Watch for new postings with the posted-today and posted-this-week presets, and let a signed webhook ping your endpoint when an async job finishes.

/v1/listings/posted-today/v1/webhooks
Start building for free Every use case works on the free plan

Orientation

Which Indeed API do you need?

Indeed's own APIs, Job Sync and the Real-time API, serve employers and ATS partners posting and managing jobs. They cover the hiring side of the platform.

RolesAPI covers the other direction: reading postings. Search roles by keyword and location, fetch full details and disclosed salaries, and get every answer back as the same normalized JSON object. It is an independent REST API built for developers, AI agents, and spreadsheets.

Weighing your options? Read the guide: every way to get Indeed job-postings data, compared.

For AI agents

Your agent already knows how to use this

Point any MCP-capable agent, whether Claude, ChatGPT, or your own, at the server and it gets five tools: search_roles, get_role_by_key, get_role_by_url, get_salary_info, and get_role_description. OAuth 2.1 (PKCE) or a bearer rk_ key.

{
  "mcpServers": {
    "rolesapi": {
      "url": "https://api.rolesapi.com/mcp"
    }
  }
}
Connect your agent for free
agent session · connected to rolesapi mcp
you Find senior backend roles in Austin paying over $150k and tell me the median posted salary.
agent Searching live postings…
tool search_roles({ keyword: "senior backend engineer", location: "Austin, TX" })
mcp 154 results · returning first page (15 roles) · 1 credit
tool get_salary_info({ job_key: "a1b2c3d4e5f60718" })
mcp { "min": 140000, "max": 175000, "currency": "USD", "period": "year" }
agent Found 154 matching roles. Of the first page, 9 disclose salary; the median disclosed range is $142k–$171k. Three exceed $150k at the minimum. Want the full list as CSV?

Simulated agent session using real MCP tool names

Product

Why RolesAPI

One REST call

No infrastructure to run. You call an endpoint, you get a normalized role object. Auth is a bearer key; responses are the same JSON envelope everywhere.

Built for agents

MCP server, OpenAPI 3.1, llms.txt, and agent skills. Connect Claude or ChatGPT in one config block and let it search roles and pull salaries on its own.

Honest pricing

Credits per answer, nothing hidden. Entry at $5/month, and top-up packs from $3 per 1,000 credits when you need more.

Start free

100 free credits, no card required, and every endpoint available from the first request, including batch, webhooks, and the MCP server.

Pricing

Pricing that reads like an invoice

One credit buys one answer: one role lookup, or one page of search results (up to 15 roles). Plans only differ in how many answers you get and how fast you can ask.

Free

Try every endpoint before paying

$0

100 credits, one time
= 100 role lookups or search pages
Every endpoint: search, batch, webhooks, MCP 20 requests per minute JSON, CSV, and NDJSON output No card required
Start free

Monthly

For steady integrations

$5/month

1,000 credits every month
= 1,000 role lookups, or ~15,000 roles via search pages
Everything in Free 200 requests per minute Ran out? Top up: +1,000 credits (1,000 more lookups) for $4 Cancel anytime in Stripe
Buy now

Buy now takes you to sign-up. If you're already signed in, it goes straight to Stripe checkout.

Async, done right

Signed webhooks, not silent POSTs

Async jobs can push a job.succeeded or job.failed event to your endpoint the moment they finish. Every delivery is signed with HMAC-SHA256 over the timestamp and raw body, so you can verify it in five lines and reject anything older than five minutes.

Register endpoints with POST /v1/webhooks and audit every attempt via GET /v1/webhooks/{id}/deliveries.

# Every delivery carries a signed header
x-rolesapi-signature: t=1751760000,v1=5f8a1c...c219

// Verify in Node
import { createHmac, timingSafeEqual } from "node:crypto";

const [t, v1] = signature.split(",").map((part) => part.split("=")[1]);
const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(t)) <= 300;
if (!fresh || !timingSafeEqual(Buffer.from(v1), Buffer.from(expected))) {
  throw new Error("invalid signature");
}

Coverage

60+ Indeed country editions, one parameter

Pass country=gb on any endpoint to read the UK edition, or de, fr, in, ca, au, and 55 more. The response envelope and role-object shape are identical everywhere, so one parser covers every market.

usgbdefrincaaunlbrmxjpsg + 48 more

FAQ

Frequently asked questions

There is no official Indeed API for job-postings data: Indeed deprecated its public Publisher job-search API, and the official APIs that remain serve the hiring and ATS side of the platform. RolesAPI is an independent REST API that returns Indeed job-postings data as normalized JSON. You get role details, live search, salaries, and descriptions with a bearer key and standard HTTP calls.

No. RolesAPI is not affiliated with, endorsed by, or sponsored by Indeed, Inc. Indeed is a registered trademark of Indeed, Inc. RolesAPI provides access to publicly available data via a stable REST API.

Developers typically weigh three routes: building and maintaining their own data pipelines, buying from multi-source aggregators, or calling a dedicated API. RolesAPI is a dedicated Indeed API for job-postings data: live search, role details, salaries, and batch enrichment in one normalized JSON shape, with 100 free credits to evaluate it.

Each role object is normalized JSON with the job title, company name, location, remote flag, employment type, salary range with currency and period, benefits, full description, posted date, canonical URL, and country. The same shape comes back from every endpoint, so one parser covers single lookups, batches, and search results.

The Free plan includes 100 one-time credits. Monthly is $5 per month with 1,000 credits, and Annual is $54 per year with 12,000 credits, which works out 10% less per credit. Subscribers can buy top-up packs from $4 per 1,000 credits on Monthly or $3 per 1,000 on Annual.

One credit buys one answer: one role detail or one search page. Batch enrichment costs 1 credit per role, and /v1/search/with-details costs the search pages plus 1 credit per role detail. GET /v1/usage itemizes exactly what each request cost.

Yes. RolesAPI's Free plan includes 100 credits with no card required, and every endpoint is available on it: role details, search, batch, webhooks, and the MCP server. Add a card only when you subscribe.

RolesAPI covers 60+ Indeed country editions through the country parameter: us, gb, de, fr, in, ca, au, and more. Pass country=gb on any endpoint to read the UK edition. The response envelope and role-object shape are identical in every country.

Point any MCP-capable agent, whether Claude, ChatGPT, or your own, at https://api.rolesapi.com/mcp. The server speaks streamable HTTP and authenticates with OAuth 2.1 (PKCE) or a bearer rk_ API key. Tools include search_roles, get_role_by_key, get_role_by_url, get_salary_info, and get_role_description; an OpenAPI 3.1 spec, llms.txt, and agent skills are also published.

Endpoints that do more work than one request, such as batch, large searches, and search-with-details, return 202 with a job id and a queued status. Poll GET /v1/jobs/{id} for progress, then page through GET /v1/jobs/{id}/results when it finishes. Register a webhook at POST /v1/webhooks to receive a signed job.succeeded event instead of polling.

Append format=csv to any /v1/jobs/{id}/results call, or send the matching Accept header; NDJSON and JSON work the same way. Synchronous endpoints accept the same format parameter. Combine it with fields=title,company.name,salary.min to project only the columns you need.

Yes. Every role object includes a salary block with min, max, currency, period, and source whenever the posting or the employer provides one. If you only need pay data, GET /v1/roles/{job_key}/salary returns just that block for 1 credit.

Start with 100 free credits

Every endpoint, no card, keys in under a minute.

Get your free API key