Indeed APIindeed.com ↗
Search Indeed job listings, retrieve full job details, company profiles, salary ranges, and more via 5 structured API endpoints returning clean JSON.
What is the Indeed API?
The Indeed API exposes 5 endpoints covering job search, job details, company profiles, company search, and salary statistics from Indeed.com. The search_jobs endpoint returns paginated job cards with titles, companies, locations, and salary snippets, while get_job_details delivers the full job description, benefits, hiring insights, and structured salary data for any job identified by its 16-character job key.
curl -X GET 'https://api.parse.bot/scraper/6ec17689-852f-49ed-b969-1b787c8344e7/search_jobs?jt=fulltime&query=software+engineer&start=0&explvl=entry_level&fromage=1&location=remote' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace indeed-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Indeed.com job search workflow — search jobs, get details, explore companies and salaries."""
from parse_apis.indeed_com_api import Indeed, JobType, PostedDays, CompanyNotFound
client = Indeed()
# Search for recent full-time software engineer jobs
search = client.jobsearches.search(
query="software engineer",
job_type=JobType.FULLTIME,
days_posted=PostedDays.SEVEN_DAYS,
)
print(f"Search base URL: {search.base_url}")
# Get details for a specific job by key
job = client.jobs.get(jk="a430a14b7fc2fe6f")
print(f"Job: {job.title}")
if job.salary_info:
print(f"Salary: {job.salary_info.salary_text} ({job.salary_info.salary_type})")
if job.hiring_insights:
print(f"Posted: {job.hiring_insights.age}")
# Search companies and explore results
for company in client.companyresults.search(query="Google", limit=3):
print(f"Company: {company.name}, Rating: {company.rating}, Reviews: {company.reviews_count}")
# Get salary info for a role
salary = client.salaryinfos.get(job_title="Data Analyst", location="New York NY")
print(f"Salary title: {salary.title_info}, Location: {salary.location_info}")
# Handle company not found gracefully
try:
profile = client.jobs.get(jk="0000000000000000")
print(f"Profile: {profile.title}")
except CompanyNotFound as exc:
print(f"Not found: {exc}")
print("Exercised: jobsearches.search, jobs.get, companyresults.search, salaryinfos.get")
Search for job listings on Indeed. Returns the full search results page data including job cards with metadata (titles, companies, locations, salary snippets), pagination links, and search metadata. The response is the server-side rendered page state containing all job card data for the current page of results.
| Param | Type | Description |
|---|---|---|
| jt | string | Job type filter: fulltime, parttime, contract, internship, temporary |
| queryrequired | string | Job title, keywords, or company name to search for |
| start | integer | Pagination offset in increments of 10 (0, 10, 20, ...) |
| explvl | string | Experience level filter: entry_level, mid_level, senior_level |
| fromage | string | Maximum days since the job was posted: 1, 3, 7, 14, or 30 |
| location | string | City, state, zip code, or 'remote' |
{
"type": "object",
"fields": {
"pageLinks": "array of pagination link objects with href and label",
"relatedQueries": "array of related search query suggestions",
"searchTitleBarModel": "object with totalNumResults count and search heading",
"jobKeysWithTwoPaneEligibility": "object mapping job keys to boolean eligibility"
},
"sample": {
"data": {
"pageLinks": [
{
"href": "/jobs?q=software+engineer&l=remote&radius=50",
"label": 1
}
],
"relatedQueries": [
{
"query": "software",
"canonicalRelatedQueryUrl": "/q-software-l-remote-jobs.html"
}
],
"searchTitleBarModel": {
"totalNumResults": 7098,
"serpVisualHeaderText": "software engineer jobs in Remote"
},
"jobKeysWithTwoPaneEligibility": {
"345959665b7dacec": true,
"84807fa146301852": true
}
},
"status": "success"
}
}About the Indeed API
Job Search and Details
The search_jobs endpoint accepts a required query string plus optional filters: location (city, state, zip, or 'remote'), jt for job type (fulltime, parttime, contract, internship, temporary), explvl for experience level (entry_level, mid_level, senior_level), fromage to cap results by posting age (1–30 days), and a start offset for pagination in increments of 10. The response includes searchTitleBarModel with a totalNumResults count, pageLinks for navigating result pages, relatedQueries for suggested search variants, and jobKeysWithTwoPaneEligibility mapping each job key to its eligibility flag — those keys feed directly into get_job_details.
get_job_details takes a single jk parameter (the 16-character hex job key from search results) and returns a detailed object: jobTitle, a salaryInfoModel with salaryMin, salaryMax, salaryType, and salaryText, a hiringInsightsModel covering posting age and candidate count, and a jobInfoWrapperModel containing the full job description. Additional structured fields in hostQueryExecutionResult include employer info, location, and benefits.
Company Profiles and Search
search_companies takes a query string and returns an array of company objects, each with name, rating, reviewsCount, companyUrl, sectors, and logoUrl. The companyUrl field carries the slug needed for get_company_profile. That endpoint returns aboutSectionViewModel (description, CEO, industry, headquarters, revenue), reviewsSectionViewModel with recent employee reviews, interviewsSectionViewModel with interview questions and difficulty/duration summaries, salarySectionViewModel with salary data by role category, and reviewRatingOverallSectionViewModel with historical overall ratings and category breakdowns (workLifeBalance, culture, management, and others).
Salary Data
get_salary_info accepts a required job_title and an optional location. It returns localSalaryAggregate and nationalSalaryAggregate, each containing salary statistics — median, mean, and standard deviation — broken out by period: HOURLY, DAILY, WEEKLY, MONTHLY, and YEARLY. salaryMapInfo provides a state-by-state salary breakdown with percentChangeFromBase values, and titleInfo confirms the normalized title that was resolved.
The Indeed API is a managed, monitored endpoint for indeed.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when indeed.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official indeed.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Aggregate job listings by role and location for a custom job board using
search_jobswithlocationandjtfilters - Build a salary benchmarking tool using
get_salary_infoto compare local vs. national median pay by period - Monitor hiring volume for target companies by polling
get_job_detailsand trackinghiringInsightsModelcandidate counts - Enrich company research workflows with
get_company_profilerating breakdowns covering culture, management, and work-life balance - Generate geographic salary heatmaps using the state-by-state
salaryMapInfodata fromget_salary_info - Identify related job titles and search demand using
relatedQueriesreturned fromsearch_jobs - Qualify employer targets for recruiting outreach by combining
search_companiesratings and sector data with fullget_company_profiledetails
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Indeed have an official developer API?+
How do I paginate through `search_jobs` results?+
start parameter in increments of 10 (0, 10, 20, ...). The response includes a searchTitleBarModel.totalNumResults count so you can calculate how many pages are available, and pageLinks provides the labeled href objects for each page.What salary periods does `get_salary_info` return?+
localSalaryAggregate and nationalSalaryAggregate include statistics — median, mean, and standard deviation — for five periods: HOURLY, DAILY, WEEKLY, MONTHLY, and YEARLY. The salaryMapInfo field adds a state-by-state breakdown with a percentChangeFromBase value for each state.Does the API return job application tracking data or saved job lists for Indeed user accounts?+
How current are the job listings returned by `search_jobs`?+
fromage parameter, which limits results to jobs posted within 1, 3, 7, 14, or 30 days. The hiringInsightsModel in get_job_details also returns a posting age field for individual listings.