Shorts API
Pull data from YouTube Shorts with one URL: metadata, engagement insights, transcript (captions or Whisper), frames at any sampling rate, and the on-screen text burned into them. Same clean JSON schema as long-form YouTube.
What you get
For Shorts, FrameFetch returns metadata, insights, transcript, parametric frames, and on-screen text (OCR) per frame. One JSON response, billed per call — every response includes a cost block.
Quickstart
curl -X POST https://framefetch.net/v1/extract \
-H "Authorization: Bearer <your-key>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.youtube.com/shorts/VIDEO_ID",
"fields": ["metadata", "transcript"]
}'Get a key with POST /v1/keys (free credit). Full reference in the docs. Agents can pay per call with x402 (USDC) — no account.
Under the hood, a Short is a YouTube video
Worth saying plainly rather than implying otherwise: FrameFetch has no separate code path for Shorts. A /shorts/ URL resolves through the exact same platform detection as any other YouTube URL — detectPlatform() maps it straight to "youtube" (FrameFetch's own test suite checks this explicitly: a dedicated test asserts that a youtube.com/shorts/… URL detects as platform "youtube", no different from a youtube.com/watch?v=… one) — and from there it runs the identical extraction pipeline as a 90-minute upload: the same captions-first-then-Whisper transcript logic, the same metadata/insights probe, the same frame sampler, the same capability matrix, the same pricing formula. There is no narrower "Shorts" row in the platform capability table and no Shorts-specific branch anywhere in the extraction code.
So this page is not going to invent a technical difference that does not exist. What is genuinely different about a Short is not the pipeline — it is the shape of the content: a clip a couple of minutes long or less, usually meant to be read fast, often one of many from the same channel. That changes what is worth building around it, covered below, even though the API call underneath is identical to the YouTube Transcript API's.
Also from Python or Node
Same call, a /shorts/ URL instead of a /watch?v= one — nothing else changes. From Node, the framefetch npm package:
import { FrameFetch } from 'framefetch';
const ff = new FrameFetch({ apiKey: process.env.FRAMEFETCH_API_KEY });
const result = await ff.extract({
url: 'https://www.youtube.com/shorts/VIDEO_ID',
fields: ['metadata', 'transcript'],
});
console.log(result.metadata.durationSec, result.transcript.source);
console.log(result.transcript.text);From Python, plain requests (no official SDK, same as every FrameFetch call):
import requests
resp = requests.post(
"https://framefetch.net/v1/extract",
headers={"Authorization": "Bearer <your-key>"},
json={"url": "https://www.youtube.com/shorts/VIDEO_ID", "fields": ["metadata", "transcript"]},
timeout=180,
)
data = resp.json()
print(data["metadata"]["durationSec"], data["transcript"]["source"])npm install framefetch — zero dependencies, Node 18+. See the Transcript API page for the full breakdown of transcript.source, segments, and how captions vs. Whisper are chosen — identical mechanics here.
Why the captions-vs-Whisper price gap barely matters for a clip this short
FrameFetch bills Whisper transcription at $0.0015 per audio-minute and floors every call at $0.002 minimum — captions cost nothing beyond that floor (see the Transcript API page for the full mechanism). Work that out and there is a crossover: a Whisper-transcribed call stays pinned at the $0.002 floor for anything under about 74 seconds of audio; only past that does its price actually start climbing above what a caption-sourced call costs. A Short sits squarely in the length range where that crossover lives.
| Clip length | Whisper-sourced transcript | Caption-sourced transcript |
|---|---|---|
| 0:30 | $0.002 (floor) | $0.002 (floor) — identical |
| 1:00 | $0.002 (floor) | $0.002 (floor) — identical |
| 2:00 | $0.00315 | $0.002 — ~1.6× |
| 3:00 | $0.00465 | $0.002 — ~2.3× |
Compare that to a 20-minute video, where the same Whisper-vs-captions gap is roughly 15× (worked out on the Transcript API page). For a short clip, whether it happens to have captions or not is close to a rounding error on cost either way — so on this page it is not the pitch. Speed still favors captions (no audio download needed) and exactness still favors captions (nothing re-recognized), but the price gap that matters a lot on a feature-length upload barely registers on a clip this short.
What's in the response
Identical schema to any other YouTube extraction — see the Transcript API page for the full field-by-field table. Shape-wise, the only thing that actually looks different is a shorter durationSec:
{
"platform": "youtube",
"url": "https://www.youtube.com/shorts/VIDEO_ID",
"captionsAvailable": true,
"metadata": { "title": "...", "uploader": "...", "durationSec": 47, "uploadDate": "...", "sourceFps": 30, "thumbnail": "https://i.ytimg.com/..." },
"insights": { "views": 48200, "likes": 3100, "commentCount": 96 },
"transcript": { "text": "...", "source": "captions", "lang": "en", "segments": [ { "start": 0, "end": 2.1, "text": "..." } ] },
"cost": { "totalMicros": 2000 }
}Schema illustration built from the real ExtractResult / TranscriptResult contract (see docs) — not a re-run against a specific clip, so free-text fields show as "...". durationSec: 47 and the insight counts are just plausible placeholders for a short clip, not measured values.
Built for clip workflows
Where a Short-specific workflow actually differs from a single long-form lookup is volume: you are rarely after one clip, you are after a channel's last dozen, or a saved list, or a batch someone just sent you. POST /v1/batch takes up to 10 URLs in one call and returns one result per URL in the same order — each validated and billed independently (a failing URL comes back as { "url", "ok": false, "error" } without taking the rest of the batch down, and only successful items are charged):
curl -X POST https://framefetch.net/v1/batch \
-H "Authorization: Bearer <your-key>" -H "Content-Type: application/json" \
-d '{
"urls": [
"https://www.youtube.com/shorts/ID_ONE",
"https://www.youtube.com/shorts/ID_TWO"
],
"fields": ["metadata", "transcript"]
}'One caveat carried over from /v1/extract: frames/text_overlay need a per-URL spec, so pull those one clip at a time rather than through batch. fields otherwise applies to every URL in the batch alike. Full shape in the docs.
And because a Short is short, reading it does not take long once you have the transcript — but for triaging a lot of them, skip reading altogether: add "digest" to fields for a 2-3 sentence gist plus topic tags ($0.00045/clip), or a top-level ask question ("does this clip mention the product name?") for a direct answer with timestamped quotes ($0.0075/clip, never cached — every question gets a fresh answer). Both ride on the same transcript this page already covers; neither needs a separate call.
Use it from an AI agent (MCP)
FrameFetch ships an MCP server at POST https://framefetch.net/mcp with the tools framefetch_extract, framefetch_search, framefetch_account and framefetch_platform_capabilities — point your agent at a YouTube URL directly. See the MCP setup guide for a working Claude Desktop / Cursor config.
FAQ
Is a Shorts URL different from a normal YouTube URL?
The path differs (/shorts/ID) but FrameFetch handles both — just pass the URL.
Can I sample one frame per second of a Short?
Yes — set frames.mode = "fps" with frames.fps = 1.
Can I read the on-screen captions of a Short?
Yes — add text_overlay alongside frames to run OCR and get back the on-screen text, per frame, with confidence and position.
Does a Short actually get processed differently than a long video?
No, and this page will not pretend otherwise. A /shorts/ URL resolves to the same "youtube" platform as any other YouTube URL and runs the identical extraction pipeline — same captions-first/Whisper logic, same capability matrix, same pricing formula. There is no separate Shorts code path.
Is captions-first still worth it on a clip this short?
For speed and exactness, yes — captions skip the audio download and are not re-recognized. For price specifically, often not by much: a Whisper-transcribed call only exceeds the $0.002 floor past about 74 seconds of audio, so most Shorts cost the same either way. See the breakdown above.
Can I pull data for several Shorts in one call?
Yes — POST /v1/batch takes up to 10 URLs and returns one result per URL, billed only for the ones that succeed. frames/text_overlay still need a per-URL spec via /v1/extract, one clip at a time. Full shape in the docs.
Can I get a quick summary of a Short instead of the full transcript?
Yes — add "digest" to fields for a short gist and topic tags ($0.00045), or a top-level ask question for a direct, timestamped answer ($0.0075, never cached). Both are built on the same transcript.