TikTok and Reels video analyzer for direct video file links, not page links, or a TikTok, Instagram or YouTube scraper dataset. No key: scenes and cuts for up to 3 videos, $0.01 a run plus any scraper run. Your Anthropic key: up to 100 videos, how each opens, on-screen text, a score, $0.04 a video.
The page now opens with what this Actor takes, what it returns and what it costs, with a working example input you can copy. It used to open by repeating its own title back to you.
The price is on the page, not only on the Pricing tab.
There is a ready-made example in the Examples tab, so you can run a real configuration without filling anything in.
The first screen says the no-key preview is free of per-video charges. It always was; the page did not say so until now.
0.8 - 2026-09-13
Links to private or internal addresses are now refused before anything is fetched, page links
included. A page link used to reach the page-to-video lookup before the address check ran, so a
link to an internal host could make that lookup open a connection to it. The check now runs
first. A link must be https, and a host that is, or looks up to, localhost, a private network, a
cloud metadata address or 100.64.x.x is refused.
100.64.x.x addresses are now refused on every link, direct media links included. It is a
shared address range used inside some networks, and it was not on the refused list before.
README: a new limit says what the check still cannot see. A host that gives a public address
when checked and a private one when the download connects (DNS rebinding), and a redirect or link
that the page-to-video lookup follows on its own.
Nothing else changes: the same inputs, the same output fields, the same prices.
0.7, platform build 0.7.6 - 2026-09-11 (run 18)
README: "free" no longer describes a run that charges $0.01. "Free preview" in the opening
reads "No-key preview", the heading "Try it free, no key" reads "Try it with no key", and "the free
keyless preview" reads "the keyless preview". The pricing section already stated the $0.01 start
event and is unchanged. "Pay nothing per video" is true and is kept.
README: one em dash removed, in the cutTimestampsSeconds paragraph.
0.7, platform build 0.7.6 - 2026-09-11 (run 16)
.actor/actor.json now carries the live title and description (read from the Actor's own
record and the Store search index on 2026-09-11, identical on both). It still carried the
pre-2026-09-11 text ("hook style", "full AI teardown"), which a future push could have shipped
back over the live copy. checks/check_vocab.py now reads every actor.json, so that text would
fire.
0.7, platform build 0.7.4 - written 2026-09-10, pushed 2026-09-11
Corrected run 15. This entry was headed "0.8 - 2026-09-10 (WRITTEN, NOT PUSHED)" and its last
bullet said the push was step 1.5. Once it shipped, all of that was false: .actor/actor.json carries
version 0.7, so the platform built 0.7.4, there is no 0.8, and the push was step 2.5b.
cutTimestampsSeconds: the cut positions the detector already found, returned instead of
discarded.detect_scenes parsed every pts_time out of ffmpeg's scene filter, sorted them,
reduced them to sceneCount and cutCadenceSeconds, and threw the list away. It is now on every
record, including the free keyless preview, at no extra compute, no model call and no charge.
A preview row now says where the cuts are rather than only how many there were.
null means scene detection did not run; [] means it ran and found none. Capped at 500 entries
against crafted media, while sceneCount stays uncapped so a truncation is detectable rather
than silent.
Pushed 2026-09-11 as build 0.7.4, RUNBOOK-2026-09-11.md step 2.5b. Read back from the
build, not from this repo: cutTimestampsSeconds is present in the dataset schema's properties
and in the measured view. Not yet proven on a row. The next keyless auto-test dataset is the
free proof, and it had not been read when this entry was corrected.
Then the prefill changed (step 2.6, the last change to this Actor that day): videoUrls now
prefills a clip we host instead of media.w3.org's trailer, so the daily auto-test no longer
depends on someone else's file staying up. That was a separate build after 0.7.4: 0.7.5,
finished 2026-09-11T04:53:01Z, read from the Actor's public record in run 15.
0.7 - 2026-08-13
An Actor with no pricing applied no longer returns an empty dataset. Pricing on Apify is
account state applied separately from the code, so every Actor passes through a "deployed but
not yet priced" window, and a failed or forgotten apply_pricing.py leaves it there. In that
state Actor.charge() does not raise: it logs a warning and reports zero charged. That was
being read as "the buyer's maximum charge is exhausted", which stopped the run before it
delivered anything. Caught on the platform on the sibling Scene Splitter Actor, which has the
same charging shape.
A run now decides once whether it is billing and never gates delivery on charging when it is
not: a missing price degrades to "analyze everything, bill nothing", never to "bill nothing,
deliver nothing". Nothing changes while pricing is applied, which is proven by
scripts/prove_no_behavior_change.py across seven priced scenarios including the maximum-charge
and migrated-resume paths that share the modified branch.
0.6 - 2026-08-12
A run with no visionApiKey is now a free preview instead of an error. It downloads, probes
and scene-detects each video and writes the measured record plus the sampled frames, with
status: preview, and charges no per-video event. Capped at 3 videos, because the preview
does the expensive half of the pipeline against a single $0.01 start event.
This is also what makes the Actor survive Apify's daily automated test, which runs the input
schema's prefill values, cannot supply a credential, and labels an Actor under maintenance
after three consecutive failures. visionApiKey is no longer in the schema's required list
(which would have failed the run at the API layer) and videoUrls now prefills a stable
public demo clip.
Records no model ever read now carry blank productionStack, structureStyle and
confidence rather than the fail-closed defaults 'mixed', 'unclassified' and 'low'. Those
defaults are answers, and a video that was never analyzed has none. Applies to preview rows
and failed rows alike.
0.5 - 2026-08-12
Renamed every output dataset field to camelCase (productionStack, cutCadenceSeconds,
formatScore, onScreenText and the rest). This matches Apify's own convention and the
scraper Actors buyers chain this one behind, so a record joins theirs without a rename step.
Applied across the records, the dataset schema and all three views, and the docs.
0.4 - 2026-08-12
Added an Apify output schema declaring both places output lands: the teardown records in the
default dataset and the sampled frames in the key-value store. Required before publication,
and it is what lets an AI agent calling this Actor know what it will get back.
The dataset schema now documents all 26 fields with a title, description, example and, where
the value is a closed set, the enum. Added a third "Measured from file" view alongside
Overview and Craft detail.
0.3 - 2026-08-12
Repositioned around dataset chaining. Validation on the platform showed TikTok, Instagram and
YouTube all block video fetching from cloud servers, so a scraper's dataset is the primary
input and pasted page links are documented as not working.
Default run memory raised to 4096 MB. At 1024 MB the container gets a quarter of a CPU core,
which starved ffmpeg and cost frames the buyer had paid for. Confirmed on the platform: 9 of 9
videos now deliver the full 6 frames with no timeouts, and per-video compute fell 38% on the
comparable run because wall time dropped faster than memory rose.
v1 supports Anthropic only. The OpenAI adapter is built and unit-tested but has not been
validated against a live account, so selecting it returns a clear message instead of running
an unproven path.
0.2 - 2026-08-10
Default model is now the balanced tier on each provider: claude-sonnet-5 and
gpt-5.6-terra. The most capable options stay one field away on visionModel.
Added a preflight that checks your key and model id against your own account before the run
starts. An invalid model now fails once, for free, listing the models you can use, instead of
failing per video after each download.
0.1 - 2026-08-09
First build. Downloads short-form video, samples frames, and returns one structured teardown
record per video: production stack, hook style, structure style, on-screen text, asset kit,
measured scene count and cut cadence.
Buyer-supplied vision API key, Anthropic or OpenAI. You pay your model provider directly.
Pay-per-event: $0.01 per run at start, $0.04 per video that produced a record. Videos that
fail are reported in the dataset and are not charged.
Accepts direct media URLs, page links (resolved automatically), or a dataset id from any
upstream scraper Actor.