Indeed API & Scraper
The Indeed API returns live job listings, salary data and company profiles as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary jobs/search endpoint returns jobs with jobkey, title, company, location, remote flag, employment types, job level and salary range, and you can pull a single job, a company profile, company reviews and salaries, and an estimated salary for a role. It is built for recruiting tools, labor-market analysts and job boards that need live Indeed data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
Country sites, the jobkey, and which salary fields each action fills
Indeed is not one site but roughly 60 country sites, and a jobkey only means something on the one it came from. Salary is genuinely parsed into numbers rather than left as a snippet, but the two job-bearing actions fill different salary fields from different sources. Measured on 'python developer' in New York (60 rows), a nine-country sweep, jobkeys 91ddcf600033e1ee and 29d4f6e637589348, the Microsoft company profile, and a 'software engineer' estimate for Austin, TX.
| Thing | Measured | Note |
|---|---|---|
| jobkey | 16 lowercase hex characters: 91ddcf600033e1ee. All 60 rows in one search were exactly 16 characters. | It is the ?jk= value in an Indeed job URL. The job action accepts a single key, a list of keys, or full URLs. |
| country=US | www.indeed.com | The default. Every other country is a separate site with its own postings and its own jobkeys. |
| country=CA, DE, IN, AU, FR, TR, BR | ca.indeed.com, de.indeed.com, in.indeed.com, au.indeed.com, fr.indeed.com, tr.indeed.com, br.indeed.com | All seven returned live rows in our sweep. The enum lists about 60 codes in total; the rest we did not test. |
| country=UK | Returned TARGET_BLOCKED at the time of writing | Recorded as measured, not as a permanent verdict. Other European sites in the same sweep answered normally. |
| salary_min / salary_max | Floats, with salary_period 'YEARLY' or 'HOURLY' and salary_currency alongside | Of 60 New York rows, 58 were priced, 59 YEARLY and 1 HOURLY. salary_yearly_min and salary_yearly_max are always annualized, so compare on those. |
| salary_source | 'EMPLOYER' on jobs/search rows, 'EXTRACTION' on the company action's job rows | EMPLOYER means the pay came from the employer's structured posting. EXTRACTION means it was read out of the salary text, and only then are salary_text and the salary_range object filled. |
| posted_iso / posted_epoch_ms | posted_iso is a date only, '2026-08-26'. posted_epoch_ms is usually rounded to midnight US-Eastern. | These are real posting dates, not fetch times: one 60-row search spanned 11 distinct days back to 2026-06-18. On the company action posted_iso is null and you get posted_relative ('15 days ago') instead. |
| job body | description_text and description_html, not a field called description | Filled on jobs/search and job, roughly 7,000 to 11,000 characters of text. Both are null on the job rows embedded in the company action. |
| job_level | 'Entry level', 'Mid-level', 'Senior level' | Present on jobs/search and job rows, null on the company action's rows. |
| estimated_salary | local_estimate and national_estimate, each {median, min, max, mean, std, sample_size, period, inferred, currency, cash_bonus_mean} | 'software engineer' in Austin, TX: local median 128,732 from 877 samples, national median 135,623 from 39,364. avg_salary_by_us_state carries 51 keys, the 50 states plus DC. |
In estimated_salary, top_paid_cities gives you a city object with displayName and locationUrlSegment, but its mean was null on every row we read, so that block is an ordering rather than a set of figures. avg_salary_by_us_state is the field that actually carries numbers.
Real request and response JSON
Captured from the indexed primary action, jobs/search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/indeed/v1/jobs/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "python developer",
"location": "New York",
"country": "US",
"max_results": 60
}
}{
"ok": true,
"meta": {
"api": "indeed",
"endpoint": "jobs/search",
"mode": "live",
"latency_ms": 2017.7,
"record_count": 60,
"bytes": 0,
"cache_hit": false
},
"data": {
"jobs": [
{
"jobkey": "[redacted-phone]b74e4a",
"indeed_url": "https://www.indeed.com/viewjob?jk=[redacted-phone]b74e4a",
"search_query": "python developer",
"search_country": "US",
"title": "Senior Associate - Developer Engineer",
"normalized_title": null,
"company": "New York Life",
"company_rating": null,
"company_review_count": null,
"company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/977b8c576b59e94555a5f6bbb0270201",
"company_url": "https://www.indeed.com/cmp/New-York-Life",
"company_industry": null,
"company_employees": "10,000+",
"company_revenue": "more than $10B (USD)",
"company_description": "For over 175 years, New York Life has helped people act on their love through offerings such as life insurance, retirement services, investments, and long-term care insurance.",
"company_website": "https://www.newyorklife.com",
"formatted_location": "New York, NY",
"city": "New York",
"state": "NY",
"postal_code": null,
"country": "US",
"remote": true,
"location": null,
"salary_text": null,
"salary_min": 100000,
"salary_max": 143000,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 100000,
"salary_yearly_max": 143000,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "[redacted-phone]",
"posted_epoch_ms": 1782363600000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://careers.newyorklife.com/careers/job/42742531",
"external_apply_url": "https://careers.newyorklife.com/careers/job/42742531",
"snippet_html": null,
"snippet_text": null,
"description_html": "<div><div><div><div><h2 class=\"jobSectionHeader\"><b>Job Description</b></h2>\n</div></div><div><div><div><h4 class=\"jobSectionHeader\"><b>Requisition ID</b></h4>\n<div>94321</div>\n</div><div><h4 class=\"jobSectionHeader\"><b>Department</b></h4>\n<div>Tech Data AI Ventures</div>\n</div><div><h4 class=\"jobSectionHeader\"><b>Job Function</b></h4>\n<div>Tech Data AI Ventures</div>\n</div><div><h4 class=\"jobSectionHeader\"><b>Location</b></h4>\n<div>New York,New York,United States</div>\n</div><div><h4 class=\"jobSectionHeader\"><b>Role Location Designation</b></h4>\n<div>Hybrid - 3 days per week</div><br>\n</div><",
"description_text": "Job Description Requisition ID 94321 Department Tech Data AI Ventures Job Function Tech Data AI Ventures Location New York,New York,United States Role Location Designation Hybrid - 3 days per week Location Designation: Hybrid - 3 days per week Role Overview New York Life is seeking a highly motivated and forward-thinking Senior Associate –Developer Engineer to join our technology organization. This role is ideal for an experienced engineer who combines deep mainframe expertise with modern software engineering practices and a passion for continuous learning. As a senior member of the engineerin",
"indeed_skills": [
"Spring Boot",
"Bachelor's degree in management information systems",
"Version control"
],
"benefits": [
"Yearly bonus"
],
"employment_types": [],
"job_level": "Senior level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
},
{
"jobkey": "4a903b480e04c419",
"indeed_url": "https://www.indeed.com/viewjob?jk=4a903b480e04c419",
"search_query": "python developer",
"search_country": "US",
"title": "Senior Executive Director of Software Engineering - Data Platforms | Workforce and Experience Technology (WXT)",
"normalized_title": null,
"company": "JPMorganChase",
"company_rating": null,
"company_review_count": null,
"company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/62e186e96c[redacted-phone]ef6880fae379",
"company_url": "https://www.indeed.com/cmp/Jpmorganchase-2",
"company_industry": null,
"company_employees": "10,000+",
"company_revenue": "more than $10B (USD)",
"company_description": "Headquartered in New York City, JPMorgan Chase is the largest bank in the United States.",
"company_website": "https://www.jpmorganchase.com/",
"formatted_location": "New York, NY 10172",
"city": "New York",
"state": "NY",
"postal_code": "10172",
"country": "US",
"remote": false,
"location": null,
"salary_text": null,
"salary_min": 232750,
"salary_max": 325000,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 232750,
"salary_yearly_max": 325000,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "[redacted-phone]",
"posted_epoch_ms": 1784350800000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://JPMorganChase.contacthr.com/[redacted-phone]",
"external_apply_url": "https://JPMorganChase.contacthr.com/[redacted-phone]",
"snippet_html": null,
"snippet_text": null,
"description_html": "<div><b>JOB DESCRIPTION</b><br>\n<br>\n<br>\n<p>You will be poised to achieve extraordinary success and make a high impact on those around you through data solutions. Partner with an organization comprised of the industry's thought leaders and committed to advancing your leadership career.\n</p><p></p><p>As a Senior Director of Software Engineering at JPMorganChase within the Employee Platforms, Workforce Experience Technology (WxT) Workforce Data and Analytics (WDA) team, you lead multiple technical areas, manage the activities of multiple departments, and collaborate across technical domains. Yo",
"description_text": "JOB DESCRIPTION You will be poised to achieve extraordinary success and make a high impact on those around you through data solutions. Partner with an organization comprised of the industry's thought leaders and committed to advancing your leadership career. As a Senior Director of Software Engineering at JPMorganChase within the Employee Platforms, Workforce Experience Technology (WxT) Workforce Data and Analytics (WDA) team, you lead multiple technical areas, manage the activities of multiple departments, and collaborate across technical domains. Your expertise is applied cross-functionally ",
"indeed_skills": [
"Data integrity assurance",
"Cost management",
"Commission pay"
],
"benefits": [
"Health insurance",
"Tuition reimbursement"
],
"employment_types": [
"Full-time"
],
"job_level": "Senior level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
},
{
"jobkey": "fa7d6f6db028664f",
"indeed_url": "https://www.indeed.com/viewjob?jk=fa7d6f6db028664f",
"search_query": "python developer",
"search_country": "US",
"title": "Principal Agile Coach",
"normalized_title": null,
"company": "Metropolitan Transportation Authority",
"company_rating": null,
"company_review_count": null,
"company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/80a263f4cedc4492e628479e5d010de6",
"company_url": "https://www.indeed.com/cmp/Metropolitan-Transportation-Authority-7",
"company_industry": null,
"company_employees": "10,000+",
"company_revenue": null,
"company_description": "We move the region that moves the world.",
"company_website": "https://new.mta.info/",
"formatted_location": "New York, NY 10004",
"city": "New York",
"state": "NY",
"postal_code": "10004",
"country": "US",
"remote": false,
"location": null,
"salary_text": null,
"salary_min": 142251,
"salary_max": 167902,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 142251,
"salary_yearly_max": 167902,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "[redacted-phone]",
"posted_epoch_ms": 1784264400000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://careers.mta.org/jobs/18009077-principal-agile-coach?tm_job=16585&tm_event=view&tm_company=47560",
"external_apply_url": "https://careers.mta.org/jobs/18009077-principal-agile-coach?tm_job=16585&tm_event=view&tm_company=47560",
"snippet_html": null,
"snippet_text": null,
"description_html": "<div><p><b>Description</b><br>\n</p><br>\n<br>\n<div><div><p>JOB TITLE:</p><p><br>\nPrincipal Agile Coach</p></div><div><p><br>\nSALARY RANGE:</p><p><br>\n$142,251 - $167,902</p></div><div><p><br>\nDEPT/DIV:<br>\n</p><p>Information Technology</p></div><div><p><br>\nSUPERVISOR:<br>\n</p><p>Director, Portfolio & Prog Mgmt</p></div><div><p><br>\nLOCATION:</p><p><br>\n2 Broadway, New York, NY 10004</p></div><div><p><br>\nHOURS OF WORK:<br>\n</p><p>9:00 am - 5:30 pm (7.5 hours/day) or as required</p></div></div><p></p><p><br>\nThis position is eligible for teleworking, which is currently 2 days per week. New ",
"description_text": "Description JOB TITLE: Principal Agile Coach SALARY RANGE: $142,251 - $167,902 DEPT/DIV: Information Technology SUPERVISOR: Director, Portfolio & Prog Mgmt LOCATION: 2 Broadway, New York, NY 10004 HOURS OF WORK: 9:00 am - 5:30 pm (7.5 hours/day) or as required This position is eligible for teleworking, which is currently 2 days per week. New hires are eligible to apply 30 days after their effective date of hire. Opening: The Metropolitan Transportation Authority is North America's largest transportation network, serving a population of 15.3 million people across a 5,000-square-mile travel area",
"indeed_skills": [
"Jira",
"Performance dashboard reports",
"SAFe"
],
"benefits": [],
"employment_types": [],
"job_level": "Senior level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
}
]
}
}What the Indeed API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| jobs/search | Search live job postings on Indeed by keyword and location. Each result includes the full job description, salary range, employer details, posting date, apply link, employment type and remote flag. Filter by job type, remote/hybrid, seniority, posting date and radius. Covers 60+ Indeed country sites. | Recruiting teams call jobs/search to search live job postings on Indeed by keyword and location. | query, country, location, max_results, sort_by, ... |
| job | Get the full detail of one or more specific jobs by their Indeed job key (or job URL). Returns the complete job description, salary, employer details, location, posting date, skills, benefits and apply link for each. Pass several keys at once to fetch them in a single call. | Labor-market analysts call job to get the full detail of one or more specific jobs by their Indeed job key (or job URL). | jobkey, country |
| company | Look up a company on Indeed: profile (industry, size, revenue, HQ, founded year, description, website), reputation (overall rating, review count, CEO approval) and optionally the company's open jobs. | Job boards call company to look up a company on Indeed. | company, country, include_jobs, max_jobs |
| company/search | Find companies on Indeed by name or keyword (optionally near a location). Returns a ranked list of companies with each one's overall rating, review count, industry sectors, logo and links to its Indeed profile, jobs, reviews and salaries pages. | Sales intelligence teams call company/search to find companies on Indeed by name or keyword (optionally near a location). | query, country, location, max_results |
| company/reviews | Get a company's employee reviews from Indeed (review text, overall rating, the 5 sub-ratings — work/life balance, compensation, management, culture, job security — job title, location and date). Pass the company name or Indeed /cmp slug; paginate with `start`. | Recruiting teams call company/reviews to get a company's employee reviews from Indeed (review text, overall rating, the 5 sub-ratings. | company, max_reviews, start, sort |
| company/salaries | Get a company's salary breakdown by job title from Indeed (average pay, pay period and the number of salaries reported per role). Pass the company name or Indeed /cmp slug. | Labor-market analysts call company/salaries to get a company's salary breakdown by job title from Indeed (average pay, pay period and the nu…. | company |
| estimated_salary | Estimate the market salary for a job title (optionally in a specific US location) from Indeed's salary data — median/mean/min/max/std + sample size + average cash bonus, plus the top-paying companies, top-paid cities, related job titles and a per-US-state average map. Both the location-specific estimate and the national estimate are returned. | Job boards call estimated_salary to get estimate the market salary for a job title (optionally in a specific US location) from Indeed…. | job_title, location |
Call jobs/search from your stack
curl -X POST https://api.reefapi.com/indeed/v1/jobs/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"python developer","location":"New York","country":"US","max_results":60}'import requests
r = requests.post(
"https://api.reefapi.com/indeed/v1/jobs/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "python developer",
"location": "New York",
"country": "US",
"max_results": 60
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/indeed/v1/jobs/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "python developer",
"location": "New York",
"country": "US",
"max_results": 60
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.indeed.jobs/search with {"query":"python developer","location":"New York","country":"US","max_results":60}.Who uses this API and why
- Job boards call jobs/search to aggregate fresh listings by role, location and remote status.
- Compensation tools use estimated_salary and company/salaries to benchmark pay for a title.
- Sales-intelligence teams use company and jobs/search to detect hiring signals at target accounts.
Questions developers ask before integrating
What does an Indeed jobkey look like, and where do I get one?
It is 16 lowercase hex characters, for example 91ddcf600033e1ee, and it is the ?jk= parameter in any Indeed job URL. Every row from jobs/search carries it as jobkey along with the matching indeed_url. The job action takes a single key, an array of keys, or full job URLs, so you can refresh a batch of saved postings in one call.
Which country sites are live?
The country enum lists about 60 codes and each one is a genuinely separate site: US serves www.indeed.com and everything else serves a subdomain such as ca.indeed.com or de.indeed.com. In our sweep US, CA, DE, IN, AU, FR, TR and BR all returned rows, while UK came back TARGET_BLOCKED at the time of testing. A jobkey from one country does not resolve on another, so keep the country next to the key.
Is the salary a parsed range or a snippet string?
Parsed. jobs/search rows carry numeric salary_min and salary_max, a salary_period of YEARLY or HOURLY, salary_currency, and salary_yearly_min and salary_yearly_max already annualized. In a 60-row New York search, 58 rows were priced and salary_source was EMPLOYER on all of them, meaning the figures came from the employer's own structured posting rather than from text.
Why does the same company look different in jobs/search and in the company action?
They come from different Indeed surfaces. jobs/search returns full description_text, job_level, an exact posted_iso, and salary_source 'EMPLOYER' with salary_text null. The job rows nested inside the company action return the opposite: no description, job_level null, posted_iso null with posted_relative '15 days ago', and salary_source 'EXTRACTION' with salary_text '$97,600 - $206,400 a year' plus a salary_range object. Use the company action for the profile and ratings, then re-fetch those jobkeys through the job action when you need bodies.
How do I tell sponsored listings from organic ones?
Every row carries a sponsored boolean alongside urgently_hiring, new_job and expired. In our 60-row sample it was false on all of them, so treat it as a hint that is present rather than a reliable split between paid and organic placement. If ad placement matters to your analysis, compare the same query under sort_by='relevance' and sort_by='date' instead.
What is the difference between posted_iso and posted_epoch_ms?
posted_iso is a plain date such as '2026-08-26' with no time at all. posted_epoch_ms is a millisecond timestamp, usually rounded to midnight US-Eastern for that same day, though a few rows carried an exact time. They are genuine posting dates rather than fetch times: one 60-row search covered 11 distinct days going back to 2026-06-18.
What does estimated_salary give me that a job row does not?
Market context rather than one employer's offer. You get local_estimate and national_estimate side by side, each with median, mean, min, max, std and the sample size behind them, so you can see how thin a local figure is. For 'software engineer' in Austin, TX the local median was 128,732 from 877 reports against a national median of 135,623 from 39,364. It also returns top_paying_companies, related job titles and a 51-key state map.
Is the job description HTML or plain text?
Both, as two separate fields. description_html keeps Indeed's markup, including the jobSectionHeader headings employers use, and description_text is the flattened version, typically a few thousand characters shorter. Alongside them you get indeed_skills, an extracted skill list that ran to 60 entries on one posting, and a benefits array that is often empty.
What is the Indeed API?
Indeed API is a ReefAPI endpoint group for job search and company profiles. It returns live JSON through POST requests under /indeed/v1.
Is the Indeed API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Indeed calls use the same shared credit balance as every other ReefAPI engine.
Do I need an Indeed login or account?
No login to Indeed is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Indeed data?
The page example is captured from a live jobs/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Indeed API use?
Indeed actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Indeed from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call indeed actions with the same key, credit pool and JSON envelope used by normal REST requests.