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.

RequestWhat comes backInputsBilled as
DefaultOne record per job posting in the results for each search.

With fetchJobDetails: true, each posting's own page is merged in (description, salary, benefits, qualifications) and billed as job-detail. fetchCompanyDetails: true also adds the employer profile.

searchQueries location searchUrlsjob

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();
Example Indeed recordDownload
{  "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.

65 fields on job records, besides the envelope
FieldTypeWhat it holdsPresent on
titlestringThe job title.All
normalizedTitlestringIndeed's normalized job title, used for grouping similar listings. Only on job listing records; null when absent.All
companystringThe employer's display name.All
companyUrlnull | stringURL of the employer's Indeed company page. Null when absent.All
companyIdnull | stringIndeed's encrypted identifier for the employer, from the search card. Null when absent.All
companyRatinginteger | null | numberThe employer's average Indeed review rating out of 5. Null when absent.All
companyReviewCountinteger | nullNumber of Indeed reviews for the employer. Null when absent.All
locationstringThe job's location as a single display line.All
citynull | stringThe job's city, from the search card. Only on job listing records; null when absent.All
statenull | stringThe job's two-letter state code, from the search card. Only on job listing records; null when absent.All
postalCodenull | stringThe job's postal code, from the search card. Only on job listing records; null when absent.All
countrystringISO country code of the job listing. Null when absent.All
locationDetailsobjectThe job's location broken out, with keys formatted, city, state, postalCode, country, extras.All
locationCountintegerNumber of locations this listing covers, when Indeed groups several postings together. Null when not given.All
isRemotebooleanWhether the job is remote.All
remoteTypenull | stringIndeed's remote-work type code. Null when the job is not flagged remote.All
remoteTextnull | stringHuman-readable remote-work text, for example "Hybrid work in Austin, TX". Null when not flagged remote.All
salarynull | objectThe salary range, with keys min, max, period, currency (ISO 4217 code), text, source. Null when no salary is shown.All
jobTypesarrayAll job type labels for the listing, for example ["Full-time"]. Empty when none are listed.All
attributesobjectJob attribute groups on the search card, keyed by group label to a list of attribute labels. Empty when none.All
snippetstringA short plain-text excerpt of the job description, from the search card. Only on job listing records.All
postedAtstringWhen the job was posted, ISO 8601 date-time. Null when Indeed gives no date.All
postedRelativestringThe posted date as Indeed's own relative text, for example "Posted 3 days ago". Null when absent.All
createdAtstringWhen the listing was first created, ISO 8601 date-time. Only on job listing records; null when absent.All
isNewbooleanWhether Indeed marks the listing as new. Only on job listing records.All
isSponsoredbooleanWhether the listing is a paid, sponsored placement.All
isUrgentlyHiringbooleanWhether the listing is flagged as urgently hiring.All
hiringMultipleCandidatesbooleanWhether the listing is hiring for multiple openings. Only on job listing records.All
isHighVolumeHiringbooleanWhether the listing is flagged as high-volume hiring. Only on job listing records.All
isTopRatedEmployerbooleanWhether the listing is from a top-rated employer. Only on job listing records.All
isFeaturedEmployerbooleanWhether the listing is from a featured employer. Only on job listing records.All
isEmployerResponsivebooleanWhether Indeed marks the employer as responsive to applicants. Only on job listing records.All
hasOpenInterviewsbooleanWhether the listing advertises open interviews. Only on job listing records.All
isHiringEventbooleanWhether the listing is a hiring-event posting. Only on job listing records.All
isNoResumeJobbooleanWhether the listing accepts applications without a resume. Only on job listing records.All
isExpiredbooleanWhether the listing has expired.All
workingHoursnull | objectWorking-hours range from the search card, with keys min, max, period, source. Null when the card shows none.All
indeedApplybooleanWhether the job can be applied to through Indeed's own Apply flow.All
applyUrlstringURL to apply outside Indeed. Null when applying happens on Indeed itself.All
benefitCodesarrayBenefit codes shown on the search card. Empty when the card lists none.All
requirementsarrayLabelled requirements on the search card, each with label and strictness. Empty when the card lists none.All
applyCountintegerNumber of people who started applying, from the search card. Only on job listing records; null when unknown.All
hiresNeededinteger | nullNumber of hires the listing says it needs. Only on job listing records; null when not given.All
sourceIdintegerIndeed's internal source identifier for the listing. Only on job listing records; null when absent.All
searchQuerystringThe search keyword that produced this record.All
searchLocationnull | stringThe location the search was run with. Null when the search had none.All
totalJobCountintegerTotal number of jobs Indeed reports for the search, across all pages. Null when Indeed reports no total.All
parentCompanynull | stringThe employer's parent company name. Only on job-detail records; null when absent.Only job-detail
companyReviewsUrlnull | stringURL of the employer's Indeed reviews page. Only on job-detail records; null when absent.Only job-detail
null | stringURL of the employer's logo on the job page. Only on job-detail records; null when absent.Only job-detail
companyHeaderImagenull | stringURL of the employer's header banner image on the job page. Only on job-detail records; null when absent.Only job-detail
jobTypenull | stringThe job type headline, for example "Full-time". Only on job-detail records; null when absent.Only job-detail
shiftsAndSchedulearrayShift and schedule labels on the job page, for example "Monday to Friday". Empty when none are given.Only job-detail
benefitsarrayBenefit labels listed on the job page, for example "401(k)". Empty when the page lists none.Only job-detail
descriptionHtmlstringThe job description as sanitized HTML. Only on job-detail records; null otherwise.Only job-detail
descriptionstringThe plain-text job description. Only on job-detail records; null otherwise.Only job-detail
expirationDatenull | stringWhen the listing expires, ISO 8601 date-time, from the page's own metadata. Only on job-detail records; null when absent.Only job-detail
applicantsnull | stringApplicant-count text from the job's hiring insights. Only on job-detail records; null when absent.Only job-detail
originalJobUrlnullURL of the original posting on the employer's own site. Only on job-detail records; null when absent.Only job-detail
occupationCodesarrayOccupation classification codes for the job. Only on job-detail records; empty when none are given.Only job-detail
languagestringLanguage code of the job posting. Only on job-detail records; null when absent.Only job-detail
qualificationsarrayQualification requirements on the job page, for example work-authorization text. Empty when none are given.Only job-detail
occupationCountintegerNumber of occupation codes on the job. Only on job-detail records; 0 when none are given.Only job-detail
postedTodaybooleanWhether the job was posted today. Only on job-detail records.Only job-detail
companyDetailsnull | objectThe 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.

EventPer 1,000 recordsPer 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/indeed returns up to 500 records in one response. Ask for more and it answers 413; send the same body to POST /jobs/indeed instead.
  • A request without maxItems returns up to 100 records.
  • Your key's rate limit and quotas apply to every source.

Next steps