How do you get Indeed job listings via API?
Call ReefAPI's indeed jobs/search action with a query, country and location and read 53 fields per job back as JSON - including the full description, structured salary and the employer's own apply URL. The field that most affects analysis is salary_source, because a salary Indeed estimated and a salary an employer published are not the same data.
This guide demonstrates the real Indeed API engine with a captured response from . The example is only published because the engine passed the SEO snapshot gate.
Labor-market analytics, job boards, hiring intelligence and lead discovery.
Call the live endpoint
- 1
Set country deliberately
country selects which national Indeed site is queried, and it changes what data exists - not just the language. US postings carry salary; German ones largely do not.
- 2
Call indeed/v1/jobs/search
query plus location plus max_results is enough. sort_by, job_type, remote, hybrid, level, from_days and radius narrow it further.
- 3
Branch on salary_source before aggregating
EMPLOYER means the company published the figure. Keep the two sources in separate columns; averaging them produces a number that describes no real posting.
- 4
Treat posted_epoch_ms as a date
It is local midnight on the posting day, which is why a whole page of jobs can share one value. posted_iso is the same fact in a clearer form.
- 5
Enrich the company separately
company_rating and company_review_count are null in search. The company, company/reviews and company/salaries actions carry them, keyed on the company slug from company_url.
Copy the request
These snippets use the captured request params for indeed/v1/jobs/search.
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}.Captured output from ReefAPI
Captured on UTC. The response below is the committed snapshot, including the API envelope and metadata.
{
"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": 906.4,
"record_count": 60,
"bytes": 0,
"cache_hit": false,
"charged_credits": 3,
"version": "1.3.0"
},
"data": {
"jobs": [
{
"jobkey": "23635acc7a4c6f9b",
"indeed_url": "https://www.indeed.com/viewjob?jk=23635acc7a4c6f9b",
"search_query": "python developer",
"search_country": "US",
"title": "MES Analyst",
"normalized_title": null,
"company": "Corning",
"company_rating": null,
"company_review_count": null,
"company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/d8c4a309ebecc5431f7aa8881113c519",
"company_url": "https://www.indeed.com/cmp/Corning-4",
"company_industry": "Industrial Manufacturing",
"company_employees": "10,000+",
"company_revenue": "more than $10B (USD)",
"company_description": "Corning is one of the world’s leading innovators in glass, ceramic, and materials science. From the depths of the ocean to the farthest reaches of space, our technologies push the boundaries of what’s",
"company_website": "http://www.corning.com/",
"formatted_location": "Fairport, NY 14450",
"city": "Fairport",
"state": "NY",
"postal_code": "14450",
"country": "US",
"remote": false,
"location": null,
"salary_text": null,
"salary_min": 78062,
"salary_max": 107335,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 78062,
"salary_yearly_max": 107335,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "2026-09-23",
"posted_epoch_ms": 1790139600000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://corningjobs.corning.com/job/Fairport-MES-Analyst-NY-14450/1432899900/",
"external_apply_url": "https://corningjobs.corning.com/job/Fairport-MES-Analyst-NY-14450/1432899900/",
"snippet_html": null,
"snippet_text": null,
"description_html": "<p><b>Date: </b>Sep 23, 2026</p>\n<br><p><b>Location:</b> Fairport, NY, US, 14450</p>\n<br><p><b>Company: </b>Corning</p>\n<br><div><p>Requisition Number: 78225</p><br>\n<p></p><p><b>The company built on breakthroughs.\n</b><br>\n<b>Join us.<br>\n</b></p><p></p><p>Corning is one of the world’s leading innovators in glass, ceramic, and materials science. From the depths of the ocean to the farthest reaches of space, our technologies push the boundaries of what’s possible.<br>\n</p><p></p><p>How do we do this? With our people. They break through limitations and expectations – not once ",
"description_text": "Date: Sep 23, 2026 \n Location: Fairport, NY, US, 14450 \n Company: Corning \n Requisition Number: 78225 \n The company built on breakthroughs.\n \n Join us. \n Corning is one of the world’s leading innovators in glass, ceramic, and materials science. From the depths of the ocean to the farthest reaches of space, our technologies push the boundaries of what’s possible. \n How do we do this? With our people. They break through limitations and expectations – not once in a career, but every day. They help move our company, and the world, forward. \n At Corning, there are endless possibilities for makin",
"indeed_skills": [
"Quality control corrective actions",
"Version control",
"Systems integration"
],
"benefits": [
"Paid parental leave",
"Disability insurance",
"Health insurance"
],
"employment_types": [
"Full-time"
],
"job_level": "Mid-level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
},
{
"jobkey": "985e2e0b98ceeafb",
"indeed_url": "https://www.indeed.com/viewjob?jk=985e2e0b98ceeafb",
"search_query": "python developer",
"search_country": "US",
"title": "Full Stack Developer",
"normalized_title": null,
"company": "Teso Life",
"company_rating": null,
"company_review_count": null,
"company_logo_url": null,
"company_url": "https://www.indeed.com/cmp/Teso-Life",
"company_industry": null,
"company_employees": null,
"company_revenue": null,
"company_description": null,
"company_website": null,
"formatted_location": "Flushing, NY 11354",
"city": "Flushing",
"state": "NY",
"postal_code": "11354",
"country": "US",
"remote": false,
"location": null,
"salary_text": null,
"salary_min": 110000,
"salary_max": 140000,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 110000,
"salary_yearly_max": 140000,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "2026-09-23",
"posted_epoch_ms": 1790179680000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://ats.rippling.com/tesolife-us-inc/jobs/4735ac03-7c3d-427c-a6e2-1c59816a7550?jobSite=Indeed",
"external_apply_url": "https://ats.rippling.com/tesolife-us-inc/jobs/4735ac03-7c3d-427c-a6e2-1c59816a7550?jobSite=Indeed",
"snippet_html": null,
"snippet_text": null,
"description_html": "<div><div><p><b>About TESO Group</b><br>\nFounded in 2017 in New York, TESO Group is an Asian-inspired lifestyle retail company bringing premium Asian products and culture to the U.S. market. With brands including TESO LIFE, TESO X, and TESO Mini, we offer a curated mix of beauty, snacks, home goods, and trendy collectibles—delivering quality, value, and a unique shopping experience.</p></div><p></p><div><p><b><br>\nPosition Overview</b></p><p>\nThe Full-Stack Developer builds and guards the company’s in-house systems, maintaining TESO Dock, TESO Dashboard, and TESO Tools in productio",
"description_text": "About TESO Group \nFounded in 2017 in New York, TESO Group is an Asian-inspired lifestyle retail company bringing premium Asian products and culture to the U.S. market. With brands including TESO LIFE, TESO X, and TESO Mini, we offer a curated mix of beauty, snacks, home goods, and trendy collectibles—delivering quality, value, and a unique shopping experience. \nPosition Overview \nThe Full-Stack Developer builds and guards the company’s in-house systems, maintaining TESO Dock, TESO Dashboard, and TESO Tools in production while building new systems and features per roadmap priorities. \nThis role",
"indeed_skills": [
"Performance dashboard reports",
"Roadmap creation (System development task)",
"Dashboard development"
],
"benefits": [
"Performance bonus",
"Quarterly bonus",
"Health insurance"
],
"employment_types": [
"Full-time"
],
"job_level": "Mid-level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
},
{
"jobkey": "f0c5a06e69cef889",
"indeed_url": "https://www.indeed.com/viewjob?jk=f0c5a06e69cef889",
"search_query": "python developer",
"search_country": "US",
"title": "2027 Quantitative Research - Risk and Treasury - Summer Internship - Associate - United States",
"normalized_title": null,
"company": "JPMorganChase",
"company_rating": null,
"company_review_count": null,
"company_logo_url": "https://d2q79iu7y748jz.cloudfront.net/s/_squarelogo/256x256/62e186e96c7550325814ef6880fae379",
"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 10001",
"city": "New York",
"state": "NY",
"postal_code": "10001",
"country": "US",
"remote": false,
"location": null,
"salary_text": null,
"salary_min": 123500,
"salary_max": 170000,
"salary_period": "YEARLY",
"salary_currency": "USD",
"salary_source": "EMPLOYER",
"salary_yearly_min": 123500,
"salary_yearly_max": 170000,
"salary_usd_yearly_normalized": null,
"salary_range": null,
"posted_relative": null,
"posted_iso": "2026-09-23",
"posted_epoch_ms": 1790139600000,
"valid_through": null,
"sponsored": false,
"urgently_hiring": false,
"new_job": false,
"expired": false,
"indeed_apply": false,
"apply_url": "https://JPMorganChase.contacthr.com/153700939",
"external_apply_url": "https://JPMorganChase.contacthr.com/153700939",
"snippet_html": null,
"snippet_text": null,
"description_html": "<div><b>JOB DESCRIPTION</b><br>\n<br>\n<br>\n<p>At JPMorganChase, we champion your innovative ideas through a supportive culture that helps you every step of the way as you build your career. If you are passionate, curious and ready to make an impact, we are looking for you.</p><p>\n</p><p><b>Job Summary</b></p><p>\nAs a Quantitative Research – Risk and Treasury Summer Associate in the Quantitative Modeling Program, you will work alongside top-tier professionals in a dynamic environment. You'll apply academic knowledge to real-world financial challenges, gain hands-on experience, and build a ",
"description_text": "JOB DESCRIPTION \n \n \n At JPMorganChase, we champion your innovative ideas through a supportive culture that helps you every step of the way as you build your career. If you are passionate, curious and ready to make an impact, we are looking for you. \n Job Summary \nAs a Quantitative Research – Risk and Treasury Summer Associate in the Quantitative Modeling Program, you will work alongside top-tier professionals in a dynamic environment. You'll apply academic knowledge to real-world financial challenges, gain hands-on experience, and build a valuable network. This program sets a solid foundation",
"indeed_skills": [
"AI models",
"Financial forecasting",
"MATLAB"
],
"benefits": [],
"employment_types": [
"Full-time"
],
"job_level": "Entry level",
"work_schedule": null,
"onet_skills": null,
"ai_summary": null
}
]
}
}Why this is hard manually
Salary is where job-market analysis quietly goes wrong. Indeed shows two kinds of number in the same visual slot: what the employer wrote, and what Indeed's model estimated from similar postings. Averaged together they produce a figure that describes neither. Every US job in our New York sample carried salary_source 'EMPLOYER', and knowing that is the difference between a median you can defend and one you cannot.
Coverage is not uniform either, and the gap is cultural rather than technical. All ten of our US 'python developer' results carried salary_min and salary_max. All five of our Berlin results carried none - salary_min, salary_max, salary_currency and salary_period were null on every one. German postings mostly do not state pay. A dashboard that reports 'average salary by country' from this data will report zero for Germany unless it separates 'no salary offered' from 'salary of zero'.
The third trap is timestamps. Indeed's posting date is a date, not a moment. All ten of our US jobs returned posted_epoch_ms 1787720400000 - the same millisecond, because it is local midnight on the posting day. It looks like a precise timestamp and it is a calendar day wearing a timestamp's clothes.
Why ReefAPI solves it
The full job description comes back inside the search response, not behind a second call. description_text and description_html were populated on every row of both our US and German searches while snippet_text and snippet_html were null - the opposite of the usual search-then-fetch shape. For a matching or classification pipeline that removes an entire round trip per job.
Company enrichment is inline too. Alongside the job you get company_employees ('10,000+', '1,001 to 5,000'), company_revenue, company_website, company_description, company_url and company_logo_url. Note that company_revenue can be the literal string 'Decline to state' rather than null - that is Indeed's own value for an employer who declined, and it is genuine information, not a missing field. company_rating and company_review_count were null across our search results; those come from the company action.
Salary arrives in five related fields so you can tell what you are looking at. salary_min and salary_max carry the figures, salary_period says YEARLY, salary_currency says USD, salary_source says EMPLOYER, and salary_yearly_min / salary_yearly_max carry the annualized form so hourly and yearly postings can be compared without you doing the arithmetic. salary_usd_yearly_normalized stays null when the posting is already in USD and fills in when it is not.
The apply path is explicit, which matters if you are routing candidates. indeed_apply was false on our sample and apply_url pointed straight at the employer's own applicant tracking system - a Workday URL, in one case. external_apply_url carries the same destination. A job with indeed_apply true is applied to on Indeed; a job with it false sends the candidate off-site, and that distinction changes conversion modelling.
Location is parsed rather than left as a display string, and it survives non-US address formats. A German posting whose formatted_location read '10245 Berlin' came back as city 'Berlin', state 'BE', postal_code '10245', country 'DE'. postal_code is null when the posting does not give one. remote is Indeed's own flag and is independent of the address - one of our results was tagged remote:true with a Getzville, NY location, which is how Indeed classifies a remote role attached to an office.
company can be an empty string rather than null on postings from confidential employers. Test for falsiness, not for null. Seven actions share the engine: jobs/search, job, company, company/search, company/reviews, company/salaries and estimated_salary, with 60+ country sites behind the country parameter. Search answered in 3.0 seconds for the US and 1.6 for Germany in our runs.
Questions developers ask
Do I need an Indeed publisher account or API key?
No. You send a ReefAPI key. Indeed's own publisher programme is not involved, and there is no per-partner approval to wait for.
Why are all my German jobs missing salary?
Because German postings mostly do not state one. All five of our Berlin results returned salary_min, salary_max, salary_currency and salary_period as null, while all ten US results carried figures. Record it as 'not disclosed', not as zero.
What is salary_source and why does it matter?
It says whether the range came from the employer or from Indeed's estimate. Every job in our US sample read EMPLOYER. Mixing employer-stated and model-estimated pay into one average produces a figure that matches neither population.
Why do all my jobs have the same posted_epoch_ms?
Because it is midnight local time on the posting date - a day, not a moment. Our ten US jobs all posted on 2026-08-26 and all returned 1787720400000. Use posted_iso for anything a human reads.
Do I have to fetch each job to get its description?
No. description_text and description_html arrive in the search response, on every row we measured, in both countries. snippet_text and snippet_html were null - the full text is what you get.
What does indeed_apply false mean?
That applications go to the employer's own system rather than through Indeed. apply_url and external_apply_url then point at the employer's applicant tracking system, such as Workday. It is a meaningful signal for conversion modelling.
Why is company sometimes an empty string?
Confidential postings hide the employer name, and Indeed sends an empty string rather than omitting the field. Test for falsiness rather than for null, or those rows will pass a null check and then break formatting downstream.