Scrape any public job posting as clean JSON
Indeed Jobs API
The Indeed Jobs API turns any public Indeed job posting into structured JSON with a single GET request. Job title, company, location, salary range, job type, benefits, full description and posting date, scraped live with no publisher account, partner agreement or proxies on your side.
Indeed retired its public Job Search API and now reserves data access for select partners. This Indeed scraper API works on any public posting URL: pass it with your key and get the live job record back, including the salary data Indeed displays or estimates. Most requests complete synchronously in 5-45 seconds.
Free tier included, no credit card required. One key works across all 49 APIs.
- Endpoints
- 2
- Response Time
- 5-45s
- Data Freshness
- Live
Key features
- Any public job posting, no publisher or partner program
- Live scraping on every request, closed jobs detected immediately
- Salary ranges as displayed or estimated by Indeed
- Full job description text, benefits and job type
- Company name, rating and location data
- fields= selection to trim responses to just what you need
- Enterprise scraping infrastructure handles blocks on our side
Built for
- Salary benchmarking and compensation research
- Labor market analytics and trend tracking
- Competitor hiring intelligence
- Job board aggregation and enrichment
- Recruiting datasets for sourcing tools
Try it
Build the request for your data
Edit the parameters below and see the exact curl command and JSON response you will get. No key required to preview.
Parameters
GET /indeed/v1/job?url=https%3A%2F%2Fwww.indeed.com%2Fviewjob HTTP/1.1
Host: api.apicodex.io
Host: api.apicodex.io
X-Api-Key: YOUR_API_KEY
{
"type": "job",
"url": "https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8",
"data": {
"title": "Senior Backend Engineer",
"company": "Datadog",
"company_rating": 3.9,
"location": "New York, NY (Hybrid)",
"salary": "$150,000 - $200,000 a year",
"job_type": "Full-time",
"benefits": ["401(k)", "Health insurance", "Unlimited PTO"],
"posted_at": "2026-08-14",
"description": "We are looking for a Senior Backend Engineer to build the ingestion pipeline..."
}
}Documentation
Indeed Jobs API Documentation
Pass an Indeed job posting URL and get a complete, structured JSON record back in a single request. All endpoints are GET, and fields= lets you keep only the top-level fields you need. If a scrape exceeds the sync window you get HTTP 202 with a snapshot_id to resolve via /v1/result.
Base URL
https://api.apicodex.io/indeedAuthentication
Create a key at dash.apicodex.io and send it as an X-Api-Key header (or an ?apikey= query parameter) on every request. No Indeed account or publisher credential is ever involved.
GET /v1/job?url=https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8
X-Api-Key: YOUR_API_KEYRequest and response
Illustrative values. Confirm current endpoint behavior, quotas, and data freshness in the API documentation before production use.
GET /v1/job?url=https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8 HTTP/1.1
Host: api.apicodex.io
X-Api-Key: YOUR_API_KEY{
"type": "job",
"url": "https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8",
"data": {
"title": "Senior Backend Engineer",
"company": "Datadog",
"company_rating": 3.9,
"location": "New York, NY (Hybrid)",
"salary": "$150,000 - $200,000 a year",
"job_type": "Full-time",
"benefits": ["401(k)", "Health insurance", "Unlimited PTO"],
"posted_at": "2026-08-14",
"description": "We are looking for a Senior Backend Engineer to build the ingestion pipeline..."
}
}Code examples
curl --request GET \
--url 'https://api.apicodex.io/indeed/v1/job' \
--data-urlencode 'url=https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8' \
--get \
--header 'X-Api-Key: YOUR_API_KEY'Available Endpoints
GET /v1/job
Scrape a job posting by URL: title, company, salary, location, job type, benefits, description.
/v1/job?url=https://www.indeed.com/viewjob?jk=a1b2c3d4e5f6a7b8GET /v1/result
Fetch a pending result using the snapshot_id from a 202 response.
/v1/result?snapshot_id=s_abc123Request Parameters
Required parameters
urlIndeed job posting URL to scrape (a /viewjob?jk=... URL, any country domain). Required on /v1/job.
Optional parameters
fieldsComma-separated top-level fields to keep, e.g. fields=title,company,salary,location.snapshot_id/v1/result only: the id returned by a 202 response.
Pricing
Indeed Jobs API Pricing
One key, one subscription, all 49 APIs. Start free and upgrade when you grow. No minimums, no lock-in.
This API costs 25 credits per request. Credits are shared across every API on your plan.
Estimate your monthly cost
Drag the slider to match your expected request volume. We will recommend the cheapest plan that covers it.
Recommended plan
Pro
$99.99 /month
Free
- All 49 APIs included
- No credit card required
- Full documentation and examples
Starter
Popular- All 49 APIs included
- Email support
- Usage dashboard and analytics
Pro
- All 49 APIs included
- Priority support
- Up to 5 API keys
Need a different plan?
Tell us about your API, volume, or support requirements.
Coming soon · MCP
Use the Indeed Jobs API from your AI agent
The API Codex MCP server will expose this API, and the other 39, to Claude, Cursor and any MCP client as tools. Same key, same credits, one config entry.
FAQ
Frequently asked questions
No. Indeed retired its public Job Search API and its publisher program is closed to new applicants, with data access reserved for select ATS and enterprise partners. The Indeed Jobs API scrapes the public posting page instead: any /viewjob URL with your API Codex key returns the live job record as JSON.
You get whatever the public posting shows: the employer-provided range when listed, or the "Indeed estimated" range when Indeed displays one. When no salary information appears on the page at all, the salary field comes back null rather than a guess.
Every request triggers a live scrape of the posting at that moment, so you immediately see edits, salary updates or that a job has been taken down, which matters because job postings churn fast. That is also why responses take 5-45 seconds instead of milliseconds.
If a scrape exceeds the synchronous window, the API returns 202 with a snapshot_id instead of making you wait on an open connection. Poll GET /v1/result?snapshot_id=... until it returns 200 with status "ready" and your data; results are typically ready within 1-2 minutes.
Yes, any public Indeed country domain works (indeed.com, uk.indeed.com, de.indeed.com and so on). Because posting URLs contain their own ?jk= query parameter, URL-encode the url value or let your HTTP client do it, as shown in the code examples.