# Changelog of TikTok/Reels/Shorts Format Analyzer: hook, structure, score (`frameprobe/reel-teardown`) Actor

- **URL**: https://apify.com/frameprobe/reel-teardown/changelog.md
- **Full Actor documentation**: https://apify.com/frameprobe/reel-teardown.md

## Changelog

### 2026-09-23 (listing, not the Actor)

Nothing about how this Actor runs changed.

- **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.
