Indeed job postings API
Search by keywords and location on any Indeed country site, or paste a search URL. Each posting comes back as one record, and you can ask for the full description and the employer profile.
- Record types
job- Fields
- 65
- From
- $4.30 per 1,000 records
- Country sites
- 51
What you can request
Every request reads the inputs below.
| Request | What comes back | Inputs | Billed as |
|---|---|---|---|
| Default | One record per job posting in the results for each search. With | searchQueries location searchUrls | job |
Every request also takes maxItems (records for the whole request) and maxItemsPerInput (records per search, URL or name).
51 country sites (the country field)
US UK CA AU IN DE FR ES IT NL IE SG MY PH AE ZA BR MX JP HK NZ BE CH AT SE NO DK FI PL PT AR CL CO PE ID TH VN KR TW TR PK NG SA QA KW IL CZ HU RO GR LU
Example request and record
The request below is the one this example record answers. The names, usernames, photos and contact details of people in it are fictional. Long values in the record are shortened.
curl
curl -X POST https://api.urakimon.com/records/indeed \
-H "x-api-key: $URAKIMON_API_KEY" \
-H "content-type: application/json" \
-d '{
"searchQueries": ["software engineer"],
"location": "New York, NY",
"country": "US",
"maxItemsPerInput": 25,
"sortBy": "date",
"fetchJobDetails": true
}'Python
import os
import requests
res = requests.post(
"https://api.urakimon.com/records/indeed",
headers={"x-api-key": os.environ["URAKIMON_API_KEY"]},
json={
"searchQueries": [
"software engineer"
],
"location": "New York, NY",
"country": "US",
"maxItemsPerInput": 25,
"sortBy": "date",
"fetchJobDetails": True
},
)
res.raise_for_status()
records = res.json()["records"]Node
const res = await fetch("https://api.urakimon.com/records/indeed", {
method: "POST",
headers: {
"x-api-key": process.env.URAKIMON_API_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"searchQueries": ["software engineer"],
"location": "New York, NY",
"country": "US",
"maxItemsPerInput": 25,
"sortBy": "date",
"fetchJobDetails": true
}),
});
const { records } = await res.json();{ "source": "indeed", "type": "job", "id": "c80b716ab53b9509", "url": "https://www.indeed.com/viewjob?jk=c80b716ab53b9509", "title": "Software Engineer III, Infrastructure, Geo", "normalizedTitle": "Senior Software Engineer", "company": "Google", "companyUrl": "https://www.indeed.com/cmp/Google", "companyId": "a5b4499d9e91a5c6", "companyRating": 4.3, "companyReviewCount": 6265, "location": "New York, NY", "city": "New York", "state": "NY", "postalCode": null, "country": "US", "locationDetails": { "formatted": "New York, NY", "city": "New York", "state": "NY", "postalCode": null, "country": "US", "extras": null }, "locationCount": 1, "isRemote": false, "remoteType": null, "remoteText": null, "salary": { "min": 147000, "max": 210000, "period": "YEARLY", "currency": "USD", "text": "$147,000 - $210,000 a year", "source": "EXTRACTION" }, "jobTypes": [ "Full-time" ], "attributes": { "job-types": [ "Full-time" ], "shifts": [], "remote": [], "benefits": [], "job-types-cc": [ "Full-time" ], "schedules": [] }, "snippet": "• We're looking for engineers who bring fresh ideas from all areas, including information retrieval, distributed computing, large-scale s…", "postedAt": "2026-09-17T05:00:00.000Z", "postedRelative": "2 days ago", "createdAt": "2026-09-18T02:17:59.241Z", "isNew": true, "isSponsored": false, "isUrgentlyHiring": false, "hiringMultipleCandidates": false, "isHighVolumeHiring": false, "isTopRatedEmployer": false, "isFeaturedEmployer": false, "isEmployerResponsive": false, "hasOpenInterviews": false, "isHiringEvent": false, "isNoResumeJob": false, "isExpired": false, "event": "job-detail", "collectedAt": "2026-09-20T19:44:41.320Z"}Fields
Every record starts with the same envelope: source, type, event, id, url, collectedAt. What the envelope means. The tables below list the fields after it, read from real Indeed records. Where a field does not apply to an item it is null or an empty list, not left out. "Present on" names the billed events a field comes with when it is not on every record of that type.
job records
One job listing, from a search results page or its own job page. Billed as job or job-detail.
| Field | Type | What it holds | Present on |
|---|---|---|---|
title | string | The job title. | All |
normalizedTitle | string | Indeed's normalized job title, used for grouping similar listings. Only on job listing records; null when absent. | All |
company | string | The employer's display name. | All |
companyUrl | null | string | URL of the employer's Indeed company page. Null when absent. | All |
companyId | null | string | Indeed's encrypted identifier for the employer, from the search card. Null when absent. | All |
companyRating | integer | null | number | The employer's average Indeed review rating out of 5. Null when absent. | All |
companyReviewCount | integer | null | Number of Indeed reviews for the employer. Null when absent. | All |
location | string | The job's location as a single display line. | All |
city | null | string | The job's city, from the search card. Only on job listing records; null when absent. | All |
state | null | string | The job's two-letter state code, from the search card. Only on job listing records; null when absent. | All |
postalCode | null | string | The job's postal code, from the search card. Only on job listing records; null when absent. | All |
country | string | ISO country code of the job listing. Null when absent. | All |
locationDetails | object | The job's location broken out, with keys formatted, city, state, postalCode, country, extras. | All |
locationCount | integer | Number of locations this listing covers, when Indeed groups several postings together. Null when not given. | All |
isRemote | boolean | Whether the job is remote. | All |
remoteType | null | string | Indeed's remote-work type code. Null when the job is not flagged remote. | All |
remoteText | null | string | Human-readable remote-work text, for example "Hybrid work in Austin, TX". Null when not flagged remote. | All |
salary | null | object | The salary range, with keys min, max, period, currency (ISO 4217 code), text, source. Null when no salary is shown. | All |
jobTypes | array | All job type labels for the listing, for example ["Full-time"]. Empty when none are listed. | All |
attributes | object | Job attribute groups on the search card, keyed by group label to a list of attribute labels. Empty when none. | All |
snippet | string | A short plain-text excerpt of the job description, from the search card. Only on job listing records. | All |
postedAt | string | When the job was posted, ISO 8601 date-time. Null when Indeed gives no date. | All |
postedRelative | string | The posted date as Indeed's own relative text, for example "Posted 3 days ago". Null when absent. | All |
createdAt | string | When the listing was first created, ISO 8601 date-time. Only on job listing records; null when absent. | All |
isNew | boolean | Whether Indeed marks the listing as new. Only on job listing records. | All |
isSponsored | boolean | Whether the listing is a paid, sponsored placement. | All |
isUrgentlyHiring | boolean | Whether the listing is flagged as urgently hiring. | All |
hiringMultipleCandidates | boolean | Whether the listing is hiring for multiple openings. Only on job listing records. | All |
isHighVolumeHiring | boolean | Whether the listing is flagged as high-volume hiring. Only on job listing records. | All |
isTopRatedEmployer | boolean | Whether the listing is from a top-rated employer. Only on job listing records. | All |
isFeaturedEmployer | boolean | Whether the listing is from a featured employer. Only on job listing records. | All |
isEmployerResponsive | boolean | Whether Indeed marks the employer as responsive to applicants. Only on job listing records. | All |
hasOpenInterviews | boolean | Whether the listing advertises open interviews. Only on job listing records. | All |
isHiringEvent | boolean | Whether the listing is a hiring-event posting. Only on job listing records. | All |
isNoResumeJob | boolean | Whether the listing accepts applications without a resume. Only on job listing records. | All |
isExpired | boolean | Whether the listing has expired. | All |
workingHours | null | object | Working-hours range from the search card, with keys min, max, period, source. Null when the card shows none. | All |
indeedApply | boolean | Whether the job can be applied to through Indeed's own Apply flow. | All |
applyUrl | string | URL to apply outside Indeed. Null when applying happens on Indeed itself. | All |
benefitCodes | array | Benefit codes shown on the search card. Empty when the card lists none. | All |
requirements | array | Labelled requirements on the search card, each with label and strictness. Empty when the card lists none. | All |
applyCount | integer | Number of people who started applying, from the search card. Only on job listing records; null when unknown. | All |
hiresNeeded | integer | null | Number of hires the listing says it needs. Only on job listing records; null when not given. | All |
sourceId | integer | Indeed's internal source identifier for the listing. Only on job listing records; null when absent. | All |
searchQuery | string | The search keyword that produced this record. | All |
searchLocation | null | string | The location the search was run with. Null when the search had none. | All |
totalJobCount | integer | Total number of jobs Indeed reports for the search, across all pages. Null when Indeed reports no total. | All |
parentCompany | null | string | The employer's parent company name. Only on job-detail records; null when absent. | Only job-detail |
companyReviewsUrl | null | string | URL of the employer's Indeed reviews page. Only on job-detail records; null when absent. | Only job-detail |
companyLogo | null | string | URL of the employer's logo on the job page. Only on job-detail records; null when absent. | Only job-detail |
companyHeaderImage | null | string | URL of the employer's header banner image on the job page. Only on job-detail records; null when absent. | Only job-detail |
jobType | null | string | The job type headline, for example "Full-time". Only on job-detail records; null when absent. | Only job-detail |
shiftsAndSchedule | array | Shift and schedule labels on the job page, for example "Monday to Friday". Empty when none are given. | Only job-detail |
benefits | array | Benefit labels listed on the job page, for example "401(k)". Empty when the page lists none. | Only job-detail |
descriptionHtml | string | The job description as sanitized HTML. Only on job-detail records; null otherwise. | Only job-detail |
description | string | The plain-text job description. Only on job-detail records; null otherwise. | Only job-detail |
expirationDate | null | string | When the listing expires, ISO 8601 date-time, from the page's own metadata. Only on job-detail records; null when absent. | Only job-detail |
applicants | null | string | Applicant-count text from the job's hiring insights. Only on job-detail records; null when absent. | Only job-detail |
originalJobUrl | null | URL of the original posting on the employer's own site. Only on job-detail records; null when absent. | Only job-detail |
occupationCodes | array | Occupation classification codes for the job. Only on job-detail records; empty when none are given. | Only job-detail |
language | string | Language code of the job posting. Only on job-detail records; null when absent. | Only job-detail |
qualifications | array | Qualification requirements on the job page, for example work-authorization text. Empty when none are given. | Only job-detail |
occupationCount | integer | Number of occupation codes on the job. Only on job-detail records; 0 when none are given. | Only job-detail |
postedToday | boolean | Whether the job was posted today. Only on job-detail records. | Only job-detail |
companyDetails | null | object | The employer's company-page profile, with keys id, name, industry, size, revenue, founded, rating. Only with fetchCompanyDetails: true. | Only job-detail |
Indeed data pricing
You pay once for each record you receive, at the price of the event it carries. A request that returns nothing costs nothing.
| Event | Per 1,000 records | Per record |
|---|---|---|
job | $4.30 | $0.00430 |
job-detail | $5.25 | $0.00525 |
Freshness and limits
- Records are collected when you send the request. Each one carries
collectedAt, the UTC time it was read. POST /records/indeedreturns up to 500 records in one response. Ask for more and it answers413; send the same body toPOST /jobs/indeedinstead.- A request without
maxItemsreturns up to 100 records. - Your key's rate limit and quotas apply to every source.