R RolesAPI

Indeed job-postings data. One REST call.

Normalized role objects, live search, salaries and descriptions — with 100 free credits and no card required.

Bearer-key auth · JSON, CSV, or NDJSON out · 60+ country editions

# One job key in — one normalized role object out
curl -s "https://api.rolesapi.com/v1/roles/a1b2c3d4e5f60718" \
  -H "Authorization: Bearer rk_live_..."

{
  "data": {
    "job_key": "a1b2c3d4e5f60718",
    "title": "Senior Backend Engineer",
    "company": { "name": "Acme Logistics", "rating": 4.1 },
    "location": "Austin, TX",
    "remote": false,
    "employment_type": "Full-time",
    "salary": { "min": 140000, "max": 175000, "currency": "USD", "period": "year" },
    "posted_at": "2026-06-28",
    ...
  },
  "request_id": "req_01hq..."
}

API surface

Featured endpoints

Role lookups, live search, batch enrichment, async jobs, and signed webhooks — every response in the same envelope.

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
curl -s "https://api.rolesapi.com/v1/roles/a1b2c3d4e5f60718?country=us" \
  -H "Authorization: Bearer rk_live_..." | jq '.data.title'

Product

Why RolesAPI

One REST call

No scraping 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.

Live examples

See the response before you sign up

Three real request shapes with the exact JSON they return.

Request
curl -s -X POST "https://api.rolesapi.com/v1/search" \
  -H "Authorization: Bearer rk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"keyword":"react developer","location":"Austin, TX"}'
Response 200 OK
{
  "data": [
    {
      "job_key": "a1b2c3d4e5f60718",
      "title": "Senior Backend Engineer",
      "company": {
        "name": "Acme Logistics",
        "rating": 4.1
      },
      "location": "Austin, TX",
      "salary": {
        "min": 140000,
        "max": 175000,
        "currency": "USD",
        "period": "year"
      },
      "posted_at": "2026-06-28",
      "url": "https://www.indeed.com/viewjob?jk=a1b2c3d4e5f60718"
    }
  ],
  "meta": {
    "total": 154,
    "count": 15,
    "limit": 15,
    "offset": 0,
    "has_more": true
  },
  "request_id": "req_8f3k2mq1"
}

Pricing

Pricing that reads like an invoice

One credit per answer. Three plans, no surprises.

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");
}

Frequently asked questions

Is there an official Indeed API for job postings?
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.
What data does a role object include?
Each role object is normalized JSON with the job title, company name and rating, 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.
How much does it cost?
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 — 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.
What are credits and how are they charged?
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.
Do I need a credit card to start?
No. The Free plan includes 100 credits with no card required, and every endpoint — role details, search, batch, webhooks, and the MCP server — is available on it. Add a card only when you subscribe.
Which countries are covered?
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.
How do AI agents connect?
Point any MCP-capable agent — 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.
How do async jobs work?
Endpoints that do more work than one request — batch, large searches, 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.
How do I get results as CSV?
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.
Is RolesAPI affiliated with Indeed?
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.
Can I get salary data?
Yes. Every role object includes a salary block — 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 API key