Skip to main content
Indeed

Indeed Scraper API
for jobs, companies and salaries

Send an Indeed URL and get clean data back: every job on a search page, the full description of a single job, company pages and salaries. Take our structure, or ask for exactly the fields you want.

300 free credits included. No credit card required.

You send
URL
indeed.com/jobs?q=merchandiser&l=Ohio&fromage=1

Search page, last 24 hours

43 jobs36 marked sponsored1 credit3.4 s
You get (example output, trimmed)
{
"type": "search",
"jobCount": 43,
"sponsoredCount": 36,
"jobs": [
{
"title": "Merchandiser Supervisor",
"company": "Example Retail Co.",
"location": "Columbus, OH 43214",
"salaryMin": 22,
"salaryMax": 24,
"salaryPeriod": "HOURLY",
"sponsored": false
},
...42 more
]
}
1 credit

per page, and a US search page holds about 40 jobs

3 to 5 s

typical time to read a page

59 of 60

Indeed country sites returned results in our tests

$0

for a page that cannot be delivered

Every kind of Indeed page

One call, whichever page you point it at.

Job search results

Every job on the page as structured data: title, company, location, posted date, pay, job type and more.

indeed.com/jobs?q=nurse&l=Texas

Single job pages

The full job description and details. Paste a link as it came from Indeed, tracking tokens and all.

indeed.com/viewjob?jk=...

Company pages

Company overview, reviews, salaries, jobs and FAQs, as markdown plus the structured data on the page.

indeed.com/cmp/Example-Co/reviews

Salary and career pages

Average pay by job title and place, with the structured data Indeed publishes alongside it.

indeed.com/career/cashier/salaries

Search landing pages

Indeed's own pages for a job title in a place, read the same way as a search.

indeed.com/q-merchandiser-l-Ohio-jobs.html

Country sites

uk.indeed.com, ca.indeed.com, de.indeed.com, ng.indeed.com, jp.indeed.com and the rest, in their own languages.

de.indeed.com/jobs?q=verkaeufer

Indeed in every country

Each country site has its own language and its own jobs. They all go through the same call.

59 / 60
Indeed country sites that returned results in our tests
Hover a country
ae
ar
at
au
bh
be
br
ca
ch
cl
cn
co
cr
cz
de
dk
ec
eg
es
fi
fr
gr
hk
hu
id
ie
il
in
it
jp
kr
kw
lu
ma
mx
my
ng
nl
no
nz
om
pa
pe
ph
pk
pl
pt
qa
ro
sa
se
sg
th
tr
tw
ua
uk
ve
vn
za

Paste the link you have

Copy a job link from Indeed and it comes with a thousand characters of tracking. You do not have to clean it up first.

A link copied straight from an Indeed results page: 1,357 characters
https://www.indeed.com/viewjob?jk=b3adf4be198fb48e&q=merchandiser&l=Ohio&tk=1k4d46mr3gf96806&from=web&advn=9860947418372500&adid=463415567&ad=-6NYlbfkN0CLrjnr7_AtlgJe2NwBDYV-5q2w... (696 characters)&sjdu=xDFBOJ5u1PRrp_ABFefefqHn1ioxDb... (299 characters)&acatk=1k4d4ano4gmni801&pub=4a1b367933fd867b19b072952f68dceb&camk=C3EPSzFlQw9vVIub9Ez-lg==&xkcb=SoBi6_M2dNAVO-ATN70XbzkdCdPP&xpse=SoAb6_I2dNAlI3S4w50IbzkdCdPP&xfps=03d0770d-9a1f-4740-9e97-c881c9b362fb&vjs=3

Blue is what identifies the job. Red is click and ad tracking that never changes what the page shows. Spidra keeps the first and drops the second before it opens the job.

One call, structured jobs

Point the scrape call at an Indeed URL. With JSON output and no prompt, you get the structured job data straight from the page for 1 credit, with no AI cost.

Paste links exactly as Indeed gives them. Spidra removes the tracking tokens, so a 1,000-character job link works as it is.

import { SpidraClient } from "spidra";
 
const spidra = new SpidraClient({
apiKey: process.env.SPIDRA_API_KEY,
});
 
const url =
"https://www.indeed.com/jobs?q=merchandiser&l=Ohio&fromage=1";
 
const result = await spidra.scrape({
urls: [{ url }],
output: "json",
});
 
console.log(result.content);
Response (trimmed, example data)
{
"source": "indeed",
"type": "search",
"page": {
"what": "merchandiser",
"where": "Ohio"
},
"jobCount": 43,
"sponsoredCount": 36,
"jobs": [
{
"id": "ae1d27e8b8f083f1",
"title": "Merchandiser Supervisor",
"company": "Example Retail Co.",
"location": "Columbus, OH 43214",
"postedAt": "2026-10-07T04:00:00.000Z",
"salaryText": "$22 - $24 an hour",
"salaryMin": 22,
"salaryMax": 24,
"salaryPeriod": "HOURLY",
"jobTypes": ["Full-time"],
"sponsored": false,
"url": "https://www.indeed.com/viewjob?jk=ae1d..."
}
]
}

Your schema, your prompt

The structured data is a starting point, not a mold. Describe the answer you want, as a prompt, a JSON schema or both, and Spidra reads the page and returns exactly that. It works the same on Indeed as on any other page.

Request
const result = await spidra.scrape({
urls: [{
url: "https://www.indeed.com/jobs?q=barista&l=Ohio",
}],
prompt: "Summarize the hiring market on this page.",
schema: {
type: "object",
properties: {
total_jobs_seen: { type: "number" },
how_many_mention_hourly_pay: {
type: "number",
},
top_three_employers: {
type: "array",
items: { type: "string" },
},
one_sentence_summary: { type: "string" },
},
},
});
What comes back (example data)
{
"total_jobs_seen": 44,
"how_many_mention_hourly_pay": 13,
"top_three_employers": [
"Cafe Chain A",
"Cafe Chain B",
"Retailer C"
],
"one_sentence_summary": "Mostly hourly roles, $8 to $28."
}

AI answers add the cost of the tokens they use on top of the page's 1 credit. A full US search page is a large input, so for plain data use JSON output with no prompt.

Need more than one page?

Indeed shows one page per search. To collect a lot of listings, search many narrow combinations, such as every job title in every city. Bulk search does that in one call, then merges the results and removes the duplicates.

It costs 1 credit per page, and you can see the total before you run anything.

80
searches
1,430
unique listings
80
credits
2 min
start to finish

From one of our own test runs: 4 job titles across 20 US cities.

Node.js, also in the Python SDK
const params = {
template:
"https://www.indeed.com/jobs?q={title}&l={location}",
variables: {
title: ["warehouse associate", "forklift operator"],
location: ["Columbus, OH", "Dallas, TX", "Atlanta, GA"],
},
itemsPath: "jobs",
dedupeBy: "id",
};
 
spidra.estimateBulk(params);
// { pages: 6, credits: 6 } before you spend anything
 
const { items, stats } = await spidra.bulkScrape(params);
// items: one merged list, duplicates removed

What you get for each job

Nothing is filtered out. You decide what to keep.

One job on a search page (illustration)
The same job, as data
{
1"title": "Merchandiser Supervisor",
2"company": "Example Retail Co.",
3"location": "Columbus, OH 43214",
4"salaryMin": 22, "salaryMax": 24, "salaryPeriod": "HOURLY",
5"jobTypes": ["Full-time"],
6"postedAt": "2026-10-08T04:00:00.000Z",
7"companyRating": 3.9, "companyReviewCount": 1204,
8"sponsored": false,
"...": "plus everything else on the page"
}
Title, company, location
Including state, city and postal code
Posted date
An exact timestamp, plus whether it falls outside your date window
Pay
The text as shown, plus minimum, maximum and the period (hourly, yearly)
Job type and remote
Full-time, part-time, contract, remote
Sponsored flag
Sponsored jobs are marked, never hidden, so you decide what to keep
Requirements
Skills and certifications marked required or preferred, on listings that include them
Benefits and schedule
The benefits list and shift pattern, when the employer lists them
Description
A snippet on search pages, the full description on a single job page
Address and coordinates
Street address and latitude and longitude, when the employer publishes an address
Company profile
CEO and approval, size, revenue range, founded, headquarters, industry, website and rating
Everything else on the page
Nothing is filtered out: the full page comes back as markdown too

What teams build with it

Hiring data is a signal for recruiters, sellers and analysts alike.

You only pay for pages you get

Indeed does not make this easy for scripts. Spidra takes care of proxies, CAPTCHAs and retries, so you send a URL and get data back.

  • A page that cannot be delivered is never charged, including any CAPTCHA solved along the way.
  • Pages Indeed keeps behind sign-in are refused instantly, with a clear message.
  • No browsers or proxies to run, and nothing to maintain on your side.
What each request costs
A page that is delivered1 credit
Plain JSON, no prompt or schema1 credit, no AI cost
With a prompt or a schema1 credit + AI tokens
A page that cannot be delivered0 credits
A page Indeed keeps behind sign-inRefused instantly, 0 credits

One credit covers one page, however many jobs are on it.

How Spidra compares

There are good Indeed scrapers. Here is an honest look at when each one is the better choice.

Apify Indeed actorsBright DataSpidra
Price as published$0.07 to $5.00 per 1,000 results, depending on the actor$1.30 to $1.50 per 1,000 records1 credit per page. About $0.11 to $0.21 per 1,000 listings, and $2 to $4 per 1,000 with full descriptions
Results from one inputUp to about 1,000 per searchNo limit statedOne page per URL. Bulk search runs many narrow searches and merges them
Pages it readsSearch and job pages, some company detailsJob, search and company pagesSearch, job, company, salary and career pages, and any other site
OutputFixed fieldsFixed fieldsYour own schema or prompt, or the structured data as it is
A page that failsPay per delivered resultNot statedNever charged
Free to tryVaries by actor5,000 free credits a month300 free credits

Choose an Apify actor if

You want thousands of listings from one search at the lowest possible price, and fixed output fields suit you.

Choose Spidra if

You want Indeed and other sites through one API, output in the shape you define, single pages with full detail, or an AI agent that can read any page.

Competitor details are as published on their own pages on 8 October 2026 and may have changed. Sources: Apify: Vali G, Apify: Curious Coder, Apify: borderline, Bright Data.

What to know before you build

We would rather you hear the limits from us than find them in production.

  • Only the first page of each search. Indeed asks visitors who are not signed in to sign in before page 2, and Spidra does not try to get around that. Use narrower searches instead: a place, a title variant, or the last 24 hours.
  • Most jobs on a search page are sponsored. They come back marked as sponsored so you can drop them, but they count toward the page.
  • Not every posting lists pay, benefits or requirements, and coordinates appear only when an employer publishes an address. Missing fields come back empty, never guessed.
  • Jobs expire. If a job has been removed, the request fails with a clear message and costs nothing.
  • Very generic searches in big cities can fill a page. Split them by city or by a more specific title.

What it costs

1 credit per page. Failed pages are free. Work out your own monthly volume below.

Monthly credits
3,600
Fits the Starter plan ($19/mo)

Example: 40 cities and 3 job titles searched once a day is 120 pages a day, about 3,600 credits a month. Plain JSON output uses no AI tokens. Pages that need a CAPTCHA solved add 5 credits per solve; proxies are included.

PlanPriceCreditsPer 1,000 pages
Free$0300 (one time)Free to try
Starter$19/mo5,000$3.80
BuilderPopular$79/mo25,000$3.16
Pro$249/mo125,000$1.99

A page holds many jobs, so the cost per job is a fraction of the cost per page.

FAQs

Common questions about scraping Indeed with Spidra.

No. Spidra reads the public pages that anyone can open in a browser without signing in. You only need a Spidra API key. Pages that need an Indeed login, such as page 2 and beyond of a search, are not available.

Start scraping Indeed for free.

Get 300 free credits and read your first Indeed page in minutes. Use the dashboard Playground or the API.

We build features around real workflows. Usually within days.

Spidra is not affiliated with, endorsed by, or sponsored by Indeed. Indeed is a trademark of its owner. Check Indeed's terms of service and the laws that apply to you before you collect data, and use the data responsibly.