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.
An independent service. Not affiliated with Indeed, Inc.
Simulated response · see real request shapes ↓
How it works
Key to data in under a minute
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 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} 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.
API surface
Every endpoint, same envelope
Role lookups, live search, batch enrichment, async jobs, and signed webhooks. Click through and the example updates.
Fetch one normalized role object (title, company, location, salary, description, benefits) from an Indeed job key. 1 credit.
| Parameter | In | Description |
|---|---|---|
| job_key | path | The Indeed job key (the jk= value in a viewjob URL) |
| country | query | Country edition, e.g. us, gb, de (default us) |
| fields | query | Optional comma list to project the response |
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.
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.
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.
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.
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.
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.
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 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
Monthly
For steady integrations
$5/month
Annual Best value · save 10%
Cheapest per answer
$54/year
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.
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.