Charged only when a transcript is delivered — removed and music-only ads are free rows. Google Ads Transparency Center video ads → transcript, first-3s hook, advertiser metadata. By advertiser, domain, YouTube ad URL, pasted ad link, or chained dataset. No start fee.
A resumed run cannot bill you twice for the same transcript. When an interrupted run picks up where it left off, it reconciles what was already charged. If it cannot confirm those numbers, it now charges nothing and leaves the settlement for later, instead of guessing from a count that may be stale — and if the run's own delivery record comes back missing rows it has already charged for, the run stops cleanly rather than re-delivering and re-charging them.
A run revived after its own processing window has already ended now says so and stops clean. Nothing further is fetched and nothing further is charged — instead of a stall that suggested raising a timeout that could not have helped.
Clearer wording on uncharged no-speech rows: an ad whose audio turns out to be music-only or silent now says exactly that in statusReason, in plain language. The same ads are recognised as before, and they are still never charged.
1.0.25 — 2026-08-29
Ad previews are checked before they are read, so a blocked preview no longer reads as an ad with no video.
A preview that comes back as a block page, a consent page, an error page or a cut-short download is now reported as a temporary fetch problem you can re-run — instead of "this ad exposes no fetchable media", a permanent-sounding verdict that told you not to bother with that ad again.
An ad whose listing arrives without its preview details is likewise reported as re-runnable. Ads that really are screenshot or iframe ads keep the straightforward "no video to transcribe" answer.
A results page that returns no ads while still reporting that ads matched your target now ships an uncharged, re-runnable row rather than "no video ads currently listed for this target".
All of the above stay free: nothing is charged for a row that carries no transcript.
1.0.24 — 2026-08-29
A typo in an input field name now gets a helpful pointer instead of a sample row. A field the actor does not recognise is ignored by the platform, so an input like advertiser used to look exactly like a blank run and came back with the free demo row — as if the typo had worked. Such a run now returns one free row that names the field it could not recognise, names the field to use instead (advertisers, with the shape to paste) and the other ways in. Nothing is charged, and a genuinely blank run still returns the demo row exactly as before.
1.0.23 — 2026-08-29
A speech-to-text outage on our side no longer makes the rest of the run pay for it. If the transcription service refuses this actor's access mid-run, ads that would need speech-to-text now come back immediately as uncharged asr_unavailable rows that say plainly the problem is ours — instead of each one downloading its video first and then failing one by one. Ads with captions keep delivering normally, and ordinary rate-limit blips keep their usual retries.
1.0.22 — 2026-08-28
An interrupted or resurrected run never delivers or charges the same ad twice. The platform
occasionally moves a long run to another server mid-flight, and any finished run can be
resurrected from the console. Both used to start over from the top — re-transcribing ads the run
had already delivered and charging for them again. A restarted run now recognises everything
already in its results: delivered ads are skipped without a duplicate row or a second charge, a
charge interrupted mid-settlement is finished exactly once, and only the unfinished work runs.
maxItems now counts the whole run, not the current attempt. A run moved to another server
mid-flight could previously deliver up to twice the limit; the limit now holds across the
interruption.
Runs stop cleanly at the timeout instead of being cut off. An ad started close to the run
timeout could blow through it mid-download or mid-transcription, ending the run in a TIMED-OUT
state with no closing summary. Such ads are now left unstarted — uncharged, counted in the
"stopped before the run timeout" tally — and the run finishes with its usual honest summary;
re-run, or raise the run timeout, to pick them up.
1.0.21 — 2026-08-27
A capped run now looks at more candidate ads than its budget strictly pays for. Removed, music-only and media-less ads are free and hand their budget straight back, so a run that lined up exactly as many candidates as its cap covered could finish with money unspent and nothing left to spend it on. It now keeps a cushion of candidates in hand — the free ones cost nothing either way — so a $0.05 cap reliably delivers the three transcripts it pays for. Anything past the cap is still reported as left over, and the cap is still never exceeded.
1.0.20 — 2026-08-27
Your max total charge is now spent in full. A run capped at $0.05 delivered a single transcript and then stopped; the same cap now delivers three. The cap is still never exceeded — the run simply stops holding back money it was never going to need.
The closing line no longer says the cap was reached when it wasn't. When free results hand budget back and ads are still left over, the run now says how much room is left and that a re-run will pick them up, instead of telling you to raise a cap you never hit.
A dataset ID the actor can't read now tells you so. Chaining a run with a mistyped or unreachable Dataset ID used to finish quietly with an empty result and no explanation at all. The run now returns one free row naming the ID and what to do about it — check the ID, pick it with the "Dataset ID" field (which grants read access), or paste the rows into "Dataset items". Nothing is charged either way.
A long ad that finishes first can no longer take budget another ad in the same run still needs, so a capped batch of long videos stays inside your max charge.
1.0.19 — 2026-08-27
A long ad whose speech sits in one stretch now delivers a transcript. A three-minute talking
section inside a fifteen-minute ad was measured against the whole running time, came out looking
too sparse to be speech, and the ad was handed back as "no speech" — uncharged, but with no
transcript either. Speech is now judged against a bounded window, so those ads deliver. Ads that
really are music or silence are still caught and still cost nothing.
A nonsense reported length is now ignored everywhere, not only in billing. Some videos — live
recordings especially — report a length of years. That figure could still steer the no-speech
check even after it had been ruled out of the surcharge; it is now discarded outright and the
ad is judged on what was actually transcribed.
A row's charge summary never lists long-video minutes that were not billed. On a run where the
long-video surcharge is not in effect, rows no longer record surcharge minutes against
themselves, so the per-row summary always matches the invoice.
1.0.18 — 2026-08-27
A long ad with no captions now gets an honest, permanent answer instead of being told to try again.
Fixed: a caption-less ad longer than a few minutes came back as a temporary problem that a
re-run would clear. It will not clear. Past roughly a few minutes YouTube stops releasing a
video's audio to anything but its own player, so speech-to-text cannot reach enough of it for a
complete transcript — and a partial transcript is never sold as a whole one. Those ads now come
back as audio_too_long_for_speech: permanent, uncharged, and saying so plainly rather than
sending you to re-run something that can never succeed. Short caption-less ads transcribe as
before, and ads that carry captions — the large majority, and nearly every spoken one — are
unaffected at any length.
Changed: when the video service refuses an ad's audio, the run now works out whether it is
refusing that particular video or simply throttling this run, and reports the two differently. A
throttle is still reported as temporary and still worth re-running — and it no longer spends a
second attempt on a refusal that a second attempt cannot fix.
The page now says plainly which claims belong to the caption route and which to the speech-to-text
fallback, instead of promising "any length" for both.
1.0.17 — 2026-08-27
Ads without captions transcribe again. The speech-to-text fallback's audio download was being refused by the video service, so ads with no caption track came back as uncharged misses instead of transcripts. Those ads now deliver.
language reads the same on every row. Rows from the speech-to-text route reported a language name ("English") while caption rows reported a code ("en"). Both now report the code, so the column can be filtered without knowing which route produced the row.
A wrong reported duration can no longer inflate a surcharge. Some videos — live recordings especially — report a nonsense length (one real example claims 3.8 years). Durations are now sanity-checked before billing, and no single row can bill more than an hour's worth of surcharge minutes however long the video is. Videos of any length still transcribe in full.
A max cost per run that affords exactly one transcript now delivers one instead of stopping with nothing delivered and nothing charged.
The charged field reports what the run actually billed. On a run with no pricing in effect, a delivered row now correctly says charged: false.
The internal spend reserve was re-derived for the new tier prices, so runs near your max cost stop cleanly on their own.
1.0.16 — 2026-08-27
Price cut. A delivered transcript now costs $0.020 down to $0.008 depending on your Apify plan tier — the volume price was $0.015. The free-plan price and the $0.005 long-video surcharge are unchanged, and you are still charged only when a transcript lands in your dataset.
The pricing block in this page now shows the new figures.
1.0.15 — 2026-08-27
Added a plain note that this is an independent actor — unofficial, and not affiliated with or endorsed by Google.
The directory of other steadyfetch actors now covers every family (ad creatives, trends and keywords, YouTube, Instagram, jobs, Amazon, and general media) and names each one exactly as it appears on the Store, so a link always lands where the name says. It now sits at the end of the page, just above support.
1.0.14 — 2026-08-27
The README now opens with an Output section — a sample results table, a screenshot of a real run's output, and the full JSON row — so you can see exactly what you get back before spending anything.
Added a copy-and-paste block for AI agents and LLM clients: actor id, a complete input example, every output field, and the exact event prices.
Added a directory of the other steadyfetch ad-intelligence actors (Facebook & Instagram, TikTok, LinkedIn, Instagram Reels, Google Ads creative text, Google Trends) with their free n8n templates.
The example dataset linked from the README is now permanent, so it will not expire.
1.0.13 — 2026-08-25
Pasted ad links now honor the link's own ?region=, so the ad is looked up where you actually saw it rather than in the run's default region.
Ads from very large advertisers no longer get a false "no media" verdict when the ad sits beyond the newest listings this actor searches — the row now says exactly that, uncharged.
Capped runs acknowledge every pasted link you asked for: links left unattempted are counted in the run summary, a link whose video another input already delivered comes back as a free duplicate row, and an outage on ad-page lookups no longer stops advertiser and domain enumeration (or vice versa).
Web links pasted into the Advertisers field get clear guidance (YouTube ad links are re-routed automatically) instead of being searched as an advertiser name.
1.0.12 — 2026-08-25
Pasted Transparency Center links now work whatever their casing (chat apps and link shorteners often lowercase a URL), and Transparency Center links that don't point at an ad get the same clear guidance in either input field instead of being searched as an advertiser name.
A lookup interrupted by a temporary Transparency Center outage or the run's time limit is now reported as retryable, instead of stating the ad has no video — both cases stay uncharged.
1.0.11 — 2026-08-25
You can now paste Ads Transparency Center ad page links directly — the URL you get browsing adstransparency.google.com (…/advertiser/AR…/creative/CR…, any region) works in the video-URLs field and is looked up and transcribed on the spot. Advertiser page links pasted into the Advertisers field are understood too, and mixed-up pastes come back as clear uncharged guidance.
A pasted ad is tried every way it can render — each of its preview variations, then its entry in the advertiser's public listing — so it delivers a transcript whenever a playable video exists, and comes back as an honest uncharged row when none does.
1.0.8 — 2026-08-21
Added a ready-made n8n workflow and a live example dataset to the README.
Capped runs now always say how many ads were left when your max charge stopped the run.
1.0.7 — 2026-08-21
Billing accuracy: the same creative reached through different targets is delivered and charged once; long-video surcharge charges always match the per-row ledger, and batches near the spend cap stop honestly; improved music-only detection (still never charged).
Reliability: some longer video ads that were wrongly skipped are now transcribed; captions with very short spoken text are delivered instead of reported as music-only; broken media files come back as uncharged failed_processing rows; sturdier retries and timeouts throughout.
1.0.6 — 2026-08-21
Initial release: transcripts + first-3-seconds hooks for Google Ads Transparency Center video ads — by advertiser name, AR… advertiser ID, domain, YouTube ad video URL/ID, or chained after any Google Ads scraper run (dataset ID or pasted rows), region-aware.
Charged only on delivery: removed videos, music-only creatives, media-less creatives, and empty lookups arrive as free rows with the reason stated. The first 3 minutes of each video are included; longer videos add a small per-started-minute surcharge.