Indeed Jobs — Stops at Your Limit
Pricing
from $1.50 / 1,000 job listings
Indeed Jobs — Stops at Your Limit
Never pay for a job we did not deliver. Set a row cap and a deadline and the run stops exactly there — no runaway bills. Exact-country search: UK means UK. Title, company, location, salary, posted date and apply link on every row. Type a keyword or paste an Indeed search URL.
Pricing
from $1.50 / 1,000 job listings
Rating
0.0
(0)
Developer
Steadyfetch Team
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 hours ago
Last modified
Categories
Share
Never pay for a job we didn't deliver. Set a row cap and a deadline and the run stops exactly there — no runaway bills. Exact-country search: UK means UK.
From $1.50/1,000 job listings — all-inclusive pay per event, no start fee, charged only on delivery.
Unofficial. This actor is not affiliated with, endorsed by, or sponsored by Indeed. "Indeed" and all related marks are trademarks of Indeed, Inc. It reads only the public search pages an ordinary browser sees.
Every row carries charged and missReason, so you can reconcile the invoice from the
dataset itself without opening the console. Only rows with charged: true were billed.
Output — a real row
{"source": "indeed","sourceJobId": "c1e2f8002d59802e","jobUrl": "https://uk.indeed.com/viewjob?jk=c1e2f8002d59802e","title": "Software Engineer III - AI/ML Platform Reliability","company": "JPMorganChase","location": { "raw": "Glasgow G2", "city": "Glasgow G2", "region": null, "country": null },"isRemote": false,"employmentType": "Full-time","salary": null,"salaryText": null,"postedAt": "2026-08-11T05:00:00.000Z","postedRelative": "15 days ago","snippet": "Formal training or certification on software engineering concepts and proficient applied experience…","companyRating": 3.9,"companyReviewCount": 20415,"sponsored": false,"query": "software engineer","country": "GB","dedupeKey": "indeed:c1e2f8002d59802e","charged": true,"missReason": null}
Browse the full live example dataset → — one real run, unedited: five delivered US listings capped at maxItems: 5, the search row that reconciles them, and the run's own summary row last. Five listings delivered, five charged.
Plus one search row per search term and country — query, country, delivered,
outcome — and one summary row with delivered, stoppedBy, resumeCursor and
chargedEvents.
jobUrl is the canonical Indeed link built from the job's own key: identical across runs,
with no ad or tracking token in it, so it is safe to use as a join key.
Agent / API paste-block
Actor: steadyfetch/indeed-jobs-scraperRequired: queries (array of job titles/keywords, or full Indeed search URLs)Optional: countries (array of ISO-2, default ["US"] — each is its own search)location (string, e.g. "Austin, TX")radiusKm (integer, needs a location)postedWithinDays (integer, 1-30)sortBy (relevance | date)remoteOnly (boolean, default false — filtered rows are never charged)includeDescription (boolean, default false — fetch every job's full description)maxItems (integer, default 100 — hard cap for the whole run)maxRunSeconds (integer, default 900 — clean stop, never a timeout kill)Charges: job-listing once per delivered job listingjob-description once per DELIVERED full description (only withincludeDescription: true; misses are never charged)Note: omit a field to use its default — do NOT send null.Build spec: https://apify.com/steadyfetch/indeed-jobs-scraper/apiToken: https://console.apify.com/settings/integrations
curl -X POST "https://api.apify.com/v2/acts/steadyfetch~indeed-jobs-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H 'Content-Type: application/json' \-d '{"queries":["software engineer","data analyst"],"countries":["GB"],"maxItems":30}'
How many jobs one search returns
About 15. Indeed's results page holds roughly 15 listings and its "next page" no longer
returns results — asking for page two lands on a sign-in wall. So a bigger maxItems does
not produce more rows on its own: more rows come from more search terms and more
countries. Two terms across three countries is six searches, or roughly 90 listings.
We say this plainly because the alternative is you paying for a run that quietly returns 15 rows when you asked for 500. The summary row repeats it every run.
Descriptions: what is free, and what the option adds
Every search ships two things at no extra cost:
- a short plain-text summary for every listing (
snippet, measured 121–163 characters), and - the complete description for exactly one listing per search — the job Indeed pre-opens
in its side panel, around 6,000 characters, marked
descriptionSource: "search-page".
"Fetch the full description for every job" (includeDescription, off by default) is
available now: it fetches each remaining listing's complete description from Indeed's own
job panel, marked descriptionSource: "job-panel". The honesty rules are the same as
everywhere else here:
- a description is charged only when it actually comes back — every row carries
chargedDescription, so the invoice reconciles from the dataset; - a description we could not fetch is reported on its own row, uncharged, and the listing itself is unaffected;
- we verify each description belongs to the exact job on the row before delivering it — a wrong or blocked answer becomes an uncharged miss, never someone else's text;
- if the option is ever not active on a run, that run tells you once in its log and charges nothing extra.
The per-description price is on the Pricing tab, as the Full description charge.
Countries
countries picks Indeed's own country sites. United States, United Kingdom and Germany
are verified end to end. Other countries use the same mechanism, and every listing's
country is checked against what you asked for: anything that comes back outside it is
reported as an uncharged GEO_MISMATCH row instead of being sold to you as a match.
What you are never charged for
| situation | missReason | run status |
|---|---|---|
| Indeed answered with an access check | CHALLENGED | SUCCEEDED — re-runnable, and the row says so |
| Indeed rate-limited us | THROTTLED | SUCCEEDED — re-runnable |
| Indeed returned a page we could not read | SOURCE_UNAVAILABLE | SUCCEEDED — re-runnable |
| The search ran and matched nothing | CLEAN_EMPTY | SUCCEEDED — a real answer |
| A listing outside the country you asked for | GEO_MISMATCH | SUCCEEDED — reported, not sold |
| A search term or URL we could not read | USER_INPUT | SUCCEEDED — the row names the fix |
| A full description that could not be fetched | (reported on its job row) | SUCCEEDED — the listing still ships; no Full description charge |
Your own maxItems / maxRunSeconds / cost cap | STOPPED_AT_LIMIT | SUCCEEDED — summary row + resumeCursor |
We never guess. An access check is reported as an access check, not as "no jobs found" — a temporary problem is never dressed up as a permanent verdict, and it is never charged.
This actor may fail when Indeed changes things. The two you are most likely to see are
CHALLENGED (Indeed answered with an access check) and THROTTLED (Indeed rate-limited
us). Both ship as a row with charged: false, the run still SUCCEEDS, and the row says
re-running can help.
Limits are hard limits
maxItems and maxRunSeconds stop the run exactly where you set them. The run still
finishes successfully, the summary row names which limit bound, and resumeCursor lists
the searches that were not reached — so you continue from there instead of paying to re-walk
what you already have.
They are limits on the run, not on a container. If Apify moves your run to another server
part-way through, or you resurrect a finished run, it picks up from what is already in your
dataset: the same job is never delivered twice and never charged twice, and maxItems still
means what you typed.
FAQ
Why did I get 15 rows when I asked for 100? Because you gave one search term in one country. See "How many jobs one search returns" — add terms or countries, not a bigger cap.
Can I paste an Indeed search URL?
Yes. A pasted search keeps its own country, location and filters, and is not crossed with
your countries list. A link to a single job posting is refused with a guidance row.
Why is salary empty on so many rows?
Because Indeed did not show one. salaryText is the exact string Indeed printed, and
salary is our parse of it; when there is no salary on the listing both stay null rather
than being estimated.
Does {} charge anything?
No job listings are charged. With no search terms the run returns uncharged sample rows that
show the exact output shape, and it contacts Indeed not at all.
Steadyfetch jobs suite
One actor per source, one job each, the same row shape — so a pipeline built on one source takes the next without a rewrite. All-inclusive pay per event, no start fee, charged only on delivery.
| Source | Actor |
|---|---|
| Indeed | this actor |
| A company's own career site (paste a domain) | Career-Site Jobs — Paste a Domain |
| Glassdoor, with the employer rating | Glassdoor Jobs + Employer Rating |
| Several boards at once, de-duplicated | Multi-Board Jobs — No Duplicates |
The rest of the steadyfetch shelf — same contract everywhere: all-inclusive pay per event, no start fee, charged only on delivery.
| Family | Actors |
|---|---|
| Ad creative intelligence | Facebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR |
| Trends & keywords | Google Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends |
| YouTube transcripts | YouTube videos · YouTube channels |
| Reel transcripts · Profile posts | |
| Jobs | Indeed · Career sites by domain · Glassdoor · Multi-board |
| Amazon | Products · Search · Bestsellers · Sellers |
| Any media file | Speech to Text · any link or file |
Unlinked names are publishing shortly on the same account — search steadyfetch on Apify Store.