Indeed Jobs — Stops at Your Limit avatar

Indeed Jobs — Stops at Your Limit

Pricing

from $1.50 / 1,000 job listings

Go to Apify Store
Indeed Jobs — Stops at Your Limit

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

Steadyfetch Team

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

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 countryquery, 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-scraper
Required: 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 listing
job-description once per DELIVERED full description (only with
includeDescription: 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/api
Token: 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

situationmissReasonrun status
Indeed answered with an access checkCHALLENGEDSUCCEEDED — re-runnable, and the row says so
Indeed rate-limited usTHROTTLEDSUCCEEDED — re-runnable
Indeed returned a page we could not readSOURCE_UNAVAILABLESUCCEEDED — re-runnable
The search ran and matched nothingCLEAN_EMPTYSUCCEEDED — a real answer
A listing outside the country you asked forGEO_MISMATCHSUCCEEDED — reported, not sold
A search term or URL we could not readUSER_INPUTSUCCEEDED — 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 capSTOPPED_AT_LIMITSUCCEEDED — 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.

SourceActor
Indeedthis actor
A company's own career site (paste a domain)Career-Site Jobs — Paste a Domain
Glassdoor, with the employer ratingGlassdoor Jobs + Employer Rating
Several boards at once, de-duplicatedMulti-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.

FamilyActors
Ad creative intelligenceFacebook · Google Ads video · TikTok · LinkedIn · Google Ads text & OCR
Trends & keywordsGoogle Trends · Trends Now · Breakout keywords · Autocomplete keywords · Keyword volume & CPC · Social trends
YouTube transcriptsYouTube videos · YouTube channels
InstagramReel transcripts · Profile posts
JobsIndeed · Career sites by domain · Glassdoor · Multi-board
AmazonProducts · Search · Bestsellers · Sellers
Any media fileSpeech to Text · any link or file

Unlinked names are publishing shortly on the same account — search steadyfetch on Apify Store.