A media link that does not come from TikTok's own servers is now refused before it is fetched,
instead of being downloaded, transcribed and charged. Every link this actor opens for a
transcript is written by the data feed it buys from, not by you: the video's playback renditions,
TikTok's own caption file, the video page address handed to the fallback resolver, and the address
that resolver prints back. Nothing checked where any of them pointed, so a wrong or tampered
answer would have been downloaded from whatever host it named, sent to the speech service and
billed to you as a transcript. All four are now checked against TikTok's own servers first, and a
link that is not one is never opened: the video row is still delivered, the transcript is
uncharged, and the row says the link was refused and names the host — it does not say the video
has no audio, because those are two different things. The checks are independent, so a refused
playback link on a real TikTok video page still gets the fallback resolver, and a refused caption
file still falls through to speech: nothing that used to produce a transcript stops producing one.
No price, input field, output column or charged event changed.
A run that collected nothing now tells you what to change, instead of only that it collected
nothing. A handle this actor could not read ended the run cleanly, so the run page said
"Delivered 0 videos of 1 asked for across 0 profiles." and stopped there — 52 characters, no
cause and no next step. Two things were wrong. The count of values it could not read was kept on
the run's own record and never printed, so a run whose only fault was a mistyped handle named
nothing at all. And nothing on the page said what to put there instead. The line now carries that
count, in words rather than internal codes, and on a run that delivered nothing it adds one plain
sentence for the biggest cause: the box to use and a working handle to copy, what a private or
deactivated account means, what a creator TikTok lists no videos for means, and which of those a
second run would change. An order the run could not use gets its own sentence naming the two that
work, rather than advice about handles that were never the problem. A feed read that did not go
through is still never reported as "this creator has no videos" — it does not know. A run that
did deliver is unchanged. No price, input field, output column or charged event changed.
The page now opens with the name you clicked, the price, and a real video row. The first line of the page called this actor something other than its store title, what a run costs was four screens down, and the page listed every column without ever showing one. The heading is now the store title, the opening paragraph carries the per-1,000 price on the cheapest paid tier and on the Apify free plan, and a real delivered row — the caption, hashtags, post date, duration, plays, likes, comments, shares, saves and the sound — sits above the column table, built by this actor's own parser from a harvested profile feed. No price, input field, output column or charged event changed.