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.
1.0.20 — a run that runs out of time now says so on every job row
A job whose full description the run ran out of time to fetch now says so on its own
row. Turn on "Fetch the full description" and hit "Max run seconds" mid-batch, and those
rows used to arrive with no description, no explanation and no charge — indistinguishable
from a job that has none. Each now carries a plain sentence naming the time limit and what
to change. No Full description charge applies to any of them, exactly as before.
If our description provider ever refuses our key, the run stops asking straight away
instead of trying once per job and telling you each time that re-running might help. That
was our problem to fix, never a temporary one on your side, and you were never charged for
it either way.
A run that is moved to another server keeps the same description pricing it started
under, rather than switching part-way through its own life.
1.0.18 — full descriptions are available now
"Fetch the full description for every job" is live. Turn on includeDescription and
every remaining listing's complete description is fetched from Indeed's own job panel and
delivered on its row, at the current price shown on the Pricing tab.
Every honesty rule the option shipped with holds exactly as documented: a description is
charged only when it is actually delivered, every job row carries chargedDescription
so the invoice reconciles from the dataset, a description that cannot be fetched is
reported on its row uncharged, and each description is verified to belong to the exact job
on the row before it is delivered.
Nothing changes for runs that leave the option off.
1.0.17 — a dropped connection no longer ends a search with "not found"
A dropped or refused connection no longer ends a search with "Indeed answered 'not found' — check the country and search term". Indeed had answered nothing. The search now retries on a fresh connection, and if it still cannot get through you get an uncharged row saying the problem was temporary and asking you to re-run.
Searches that used to stop on the first network hiccup now recover on their own, so a good query no longer comes back empty because of one bad moment on the way out.
Unchanged: when Indeed itself answers "not found" for a page, that is still reported as a real answer, and a search that genuinely matches no jobs is still a clean, uncharged result.
1.0.16 — a typo in an input field name now gets a helpful pointer instead of sample rows
A misspelled input field is named back to you instead of quietly running the sample. If you
send your search terms under a field this actor does not have — query instead of queries, say —
the run used to look identical to an empty run and answered with the uncharged sample rows, so a
typo looked like it had worked. It now returns one uncharged row that names the field it did not
recognise, names the field your search terms belong in, and shows the exact shape to send. Sample
rows are reserved for a genuinely untouched input, and nothing is charged either way.
1.0.15 — large runs finish faster: same rows, same prices
Results are now delivered a whole search page at a time instead of one row at a time,
and each page is billed in one step after it lands. Runs with many searches spend less
of their time (and their timeout) on delivery overhead and more on the searches themselves.
Nothing about the rows or the prices changes: the same listings arrive in the same order,
a delivered listing is still charged only after it is in your dataset, and misses,
off-country listings and per-search summaries still arrive uncharged alongside it.
Every interruption guarantee holds: a run moved to another server or resurrected from the
Runs tab still continues from what is already delivered, never delivers a row twice, and
never charges twice — including for a page delivered in the instant before an interruption.
1.0.14 — the full-description option returns, rebuilt on a route that works
"Fetch the full description for every job" is back (includeDescription, off by
default). The old option relied on each job's own page, which Indeed refuses to serve;
the rebuilt option reads the full description from Indeed's job panel, which does answer.
Delivered descriptions are marked descriptionSource: "job-panel".
Charged only when a description is delivered. Every job row now carries
chargedDescription, so the invoice reconciles from the dataset. A description that
cannot be fetched is reported on its row, uncharged, and the listing itself still ships.
Verified before charged. Each description is checked against the exact job on the row
before it is delivered — a blocked or mismatched answer becomes an uncharged miss, never
the wrong job's text.
If the option is not yet active on this listing, a run that asks for it is told once in
its log and charged nothing extra; everything else behaves exactly as before.
The option can only switch on at its current price. If a run's price list still
carries an out-of-date figure for the description fee, the option stays off for that
run and charges nothing — it activates only once the current price is in place, so no
run is ever billed at a stale number.
A description skipped by the run's cost allowance says so on its own row — and the
listings keep coming. When your maximum cost per run leaves no room to fetch a job's
description, that row carries the same "allowance reached" note as every other unfetched
description, uncharged, and the run's miss count includes it. The run keeps delivering the
job listings your cost allowance still covers, without their descriptions, instead of
stopping at the first one it could not afford.
Description fetching respects the run's time limit. A run out of time stops fetching
further descriptions instead of overrunning maxRunSeconds or the run timeout; the job
listings still ship, and every unfetched description stays uncharged.
A run interrupted by a server move no longer records a partial search summary. The
per-search summary row is written once, with the true figures, by the run that finishes
the search — an interrupted attempt can no longer freeze "delivered 0" into your dataset.
The free search-page description and every snippet are untouched.
1.0.13 — the full-description option is withdrawn
Removed the "Fetch the full description for every job" option. Indeed blocks the job
page it relied on, so it never delivered a description — and every blocked attempt slowed
the search itself down. The option is gone rather than left on the form returning nothing.
The option was never charged. A description was only ever billable when one actually
came back, and none ever did.
Nothing else about descriptions changes. Every job row still carries Indeed's own search
summary, and the one listing Indeed pre-opens on each search still ships its complete
description at no extra charge, marked descriptionSource: "search-page".
A saved task that still sends the old setting keeps running exactly as before — the setting
is ignored, not an error.
1.0.12 — French and Swiss salaries are read the way those pages write them
A French salary is no longer inflated 100×. France writes decimals with a comma, so
11,88 € an hour was being read as 1188. France now joins the countries whose comma is a
decimal point, and the number on the row is the number on the page.
Switzerland's apostrophe no longer splits a salary in two.CHF 50'000 (either
apostrophe character) is one number, not 50 and 000.
par heure and par an are recognised, so French listings get hour and year in
salaryPeriod instead of nothing.
A run that stopped at your row cap or deadline no longer tells you to re-run with
resumeCursor. It is a field on the summary row, not something you can pass in, so the
summary now says what actually works: narrow the search or raise the caps and run again.
1.0.11 — a run that is interrupted never charges you twice
If Apify moves your run to another server part-way through — or you resurrect a finished
run — the run now continues from what is already in your dataset. Jobs it already
delivered are not fetched again, not delivered again, and not charged again, and any
charge that was interrupted mid-way is completed rather than repeated.
maxItems and maxRunSeconds are limits on the run, not on one attempt: an
interrupted run can no longer deliver up to twice your row cap, or run for twice the time
you allowed.
If the run cannot read its own delivery record, it delivers results and charges nothing
rather than risk billing you twice, and the run summary says so.
Clearer counts in run messages ("1 job" / "2 jobs", "1 search" / "2 searches").
1.0.10 — pre-publish sweep: charged now reports what actually happened
The charging regime is read from the run's own price list, so an actor that is not set up
to bill — or is set up to bill an event that does not exist — no longer pushes a row
claiming it was charged, and no longer calls the charge API. charged and
chargedDescription on every row now report what happened rather than what was intended.
If the actor is ever mis-priced so that pushing a row would itself bill you, the run stops
before pushing anything and says so, instead of billing for the uncharged miss rows this
actor is built around.
README leads with the output row, states the price up front, names the two misses you are
most likely to see, and carries the full steadyfetch shelf.
1.0.9 — initial release
Search Indeed by keyword or by pasting a search URL, and pay only for the job listings
that are delivered.
One row per delivered listing with title, company, location, remote flag, employment
type, salary as Indeed printed it, posted date, Indeed's own search summary, a canonical
job link and an apply link — plus one row per search and one summary row per run.
Search several terms across several Indeed country sites in one run. Indeed returns about
15 listings per search and its results pages cannot be walked further, so the actor says
so in every run summary instead of quietly under-delivering against a large row cap.
Country comes from Indeed's own country site, and every listing's country is checked
against the one you asked for. Anything outside it is reported uncharged, never sold as a match.
Full descriptions are optional and off by default: the search page carries a short summary
for every listing and the complete description for only one of them. When switched on, a
description is charged only when one actually comes back.
Nothing is charged for an access check, a rate limit, an unreadable page, a search that
matched nothing, a listing outside your country, an input we could not read, or a run that
stopped at one of your limits.
maxItems and maxRunSeconds are hard limits: the run stops cleanly, tells you which
limit bound, and hands back a resume cursor.
Every row carries charged and missReason so the invoice reconciles from the dataset.
Running with no input returns uncharged sample rows showing the exact output shape.