changedInput schema / properties / fields / description
Previous value: -"Which data to return. Default [\"metadata\"]. Request the minimum you need. \"digest\" is an LLM summary ({ gist, topics, state? }) of the transcript and automatically pulls in \"transcript\" (its input) — it degrades gracefully (omitted with a warning) if no transcript is available. \"audio_digest\" is a spoken audio briefing of the video: it speaks the digest gist as an mp3 and returns { url, seconds, voice, provider, lang? } (mp3, signed URL, 24h TTL); it automatically pulls in \"digest\" (and thus \"transcript\"), and when \"translate\" is also set the digest is generated directly in that target language so the audio speaks it — combine \"audio_digest\" with \"translate\" for foreign-language audio, and pick the voice with the \"voice\" param. It degrades gracefully (omitted with a warning, never charged) if no digest is available or TTS fails. \"text_overlay\" (on-screen text via OCR) requires \"frames\" to also be requested, and is auto-skipped (with a warning, not an error) above 200 estimated frames — OCR runs a subprocess per frame, so keep the frames spec narrow (fps/range) when you want it. \"structured\" is the video, understood: a vision LLM reads the transcript AND sampled keyframes and returns typed JSON — chapters ({ start_sec, end_sec, title, summary }), entities ({ name, type }), products shown ({ name, evidence: visual|spoken|both }), claims ({ text, timestamp_sec? }), and key moments ({ timestamp_sec, description }). It automatically pulls in \"transcript\" (one of its inputs) and also downloads the video for its own keyframe pass, so it works even on caption-less sources. Deterministic and cacheable; a flat per-video price. It degrades gracefully (omitted with a warning, never charged) if the model/parse fails. \"delta\" tracks a video over time: it compares this fetch against the previous one of the SAME url and returns { hasPrior, sinceTs, viewsPerHr, likesPerHr, commentsPerHr, titleChanged, thumbnailChanged } — the first fetch of a url just seeds the baseline (hasPrior:false); call again later to get the per-hour velocity and creator-edit flags."New value: +"Which data to return. Default [\"metadata\"]. Request the minimum you need. \"digest\" is an LLM summary ({ gist, topics, state? }) of the transcript and automatically pulls in \"transcript\" (its input) — it degrades gracefully (omitted with a warning) if no transcript is available. \"audio_digest\" is a spoken audio briefing of the video: it speaks the digest gist as an mp3 and returns { url, seconds, voice, provider, lang? } (mp3, signed URL, 24h TTL); it automatically pulls in \"digest\" (and thus \"transcript\"), and when \"translate\" is also set the digest is generated directly in that target language so the audio speaks it — combine \"audio_digest\" with \"translate\" for foreign-language audio, and pick the voice with the \"voice\" param. It degrades gracefully (omitted with a warning, never charged) if no digest is available or TTS fails. \"text_overlay\" (on-screen text via OCR) requires \"frames\" to also be requested, and is auto-skipped (with a warning, not an error) above 200 estimated frames — OCR runs a subprocess per frame, so keep the frames spec narrow (fps/range) when you want it. \"structured\" is the video, understood: a vision LLM reads the transcript AND sampled keyframes and returns typed JSON — chapters ({ start_sec, end_sec, title, summary }), entities ({ name, type }), products shown ({ name, evidence: visual|spoken|both }), claims ({ text, timestamp_sec? }), and key moments ({ timestamp_sec, description }). It automatically pulls in \"transcript\" (one of its inputs) and also downloads the video for its own keyframe pass, so it works even on caption-less sources. Deterministic and cacheable; a flat per-video price. It degrades gracefully (omitted with a warning, never charged) if the model/parse fails. \"comments\" returns up to comments_cap top-level comments per video ({ items: [{ text, author?, like_count?, reply_count? }], total_fetched, cap_applied, sort:\"top\" }); it is INDEPENDENT of the transcript (no download) and available on YouTube and Reddit only — TikTok/Instagram/Pinterest return it as a warning, never a charge (check GET /v1/platforms). Author is a display handle only (no user ids/urls). \"comment_sentiment\" is aggregated audience sentiment: percentages, themes, summary — ONE LLM pass over the comments returns { positive_pct, neutral_pct, negative_pct (they sum to 100), summary (2-3 English sentences), top_themes (up to 5), representative { positive?, negative? } }. It automatically pulls in \"comments\" (its input; same YouTube/Reddit-only availability) and needs at least 5 comments — fewer, or a model failure, omits it with a warning and is never charged. No competitor offers this rollup. \"delta\" tracks a video over time: it compares this fetch against the previous one of the SAME url and returns { hasPrior, sinceTs, viewsPerHr, likesPerHr, commentsPerHr, titleChanged, thumbnailChanged } — the first fetch of a url just seeds the baseline (hasPrior:false); call again later to get the per-hour velocity and creator-edit flags."
changedInput schema / properties / fields / items / enum
Previous value: -[
- "metadata",
- "insights",
- "transcript",
- "frames",
- "text_overlay",
- "digest",
- "audio_digest",
- "structured",
- "delta"
-]New value: +[
+ "metadata",
+ "insights",
+ "transcript",
+ "frames",
+ "text_overlay",
+ "digest",
+ "audio_digest",
+ "structured",
+ "comments",
+ "comment_sentiment",
+ "delta"
+]