FrameFetch
For agents → Try it free
Answers, not dumps

Video Question Answering API

Ask a direct question about any YouTube, TikTok, Instagram Reels, Reddit, or Pinterest video URL and get a short, grounded answer back — with timestamped quotes lifted straight from the transcript. No file upload, no 25,000-token transcript to paste into your own model: send the URL and the question in one call.

Read the docs Pricing

Agents don't want the transcript, they want the answer

A raw transcript of even a short video can run thousands of tokens — expensive to move through an agent's context window, and the agent still has to do the reading itself. FrameFetch does that reading server-side: add a top-level "ask" question to the same /v1/extract call you'd already make for a transcript, and get back a <=500-token answer instead. One Groq chat-completion call reads the transcript so your agent doesn't have to.

The arithmetic, shown honestly

No latency or accuracy numbers here — those would need to be measured, and they haven't been. What can be shown honestly is the token-count argument, worked out step by step instead of asserted:

StepValueBasis
Assumed speaking rate130-150 words/minA commonly cited average range for spoken English — an assumption stated here, not something FrameFetch measured
20-minute talk → words~2,600-3,000 words20 min × the rate range above
Words → tokens~3,500-4,000 tokensUsing the common approximation of ~1.3 tokens per English word (an approximation, not this video's actual tokenization)
ask answer size≤500 tokensHard cap on the answer + quotes payload

Read this as an order-of-magnitude illustration, not a benchmark: an ask answer for a 20-minute video is roughly a tenth the size of the transcript it's grounded in — and that transcript estimate doesn't even include the JSON structure, per-segment timestamps, or punctuation overhead a real transcript payload adds on top of the raw word count. Your actual numbers will vary with the video's real pace, pauses, and topic.

Built for a tool loop, not a paste-a-link box
Consumer chat tools

Paste a link, get a chat reply

Built for one human asking one question in one chat session. The video link still has to resolve to a transcript from somewhere before the model can answer, the answer comes back as prose meant for reading, not parsing, and there's no per-call cost breakdown or stable error code when it fails — just a chat message that didn't work.

FrameFetch ask

Called by a program, in a loop

  • Typed JSON out — { answer, quotes, confidence, based_on } — an agent can parse without another LLM call
  • Same /v1/extract call an agent already makes for metadata or a transcript — one integration, not a second API to learn
  • Flat $0.0075 per call with an exact cost block every time — predictable at 1 call or 10,000
  • Typed error codes (PAYMENT_REQUIRED, EXTRACTION_FAILED, ...) instead of a dead-end chat message
One call, a grounded answer out

Add "ask": "<question>" (3–500 characters) at the top level of /v1/extract (or /v1/batch) and FrameFetch auto-includes "transcript" as the answer's source, then runs one Groq chat-completion (llama-3.3-70b-versatile, temperature 0, JSON mode) over the transcript — with per-segment timestamps when available. The response carries an ask object with the answer plus its supporting evidence.

curl -X POST https://framefetch.net/v1/extract \
  -H "Authorization: Bearer <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.youtube.com/watch?v=jNQXAC9IVRw",
    "ask": "What animal does the narrator point out?"
  }'
"ask": {
  "answer": "The narrator points out the elephants and their very long trunks.",
  "quotes": [ { "t_sec": 4, "text": "they have really really really long trunks" } ],
  "confidence": "high",
  "based_on": ["transcript"]
}
What's in the response
FieldShapeWhat it captures
answerstringA short, direct answer to the question — in whatever language the question was asked in
quotes{ t_sec, text }[]Excerpts quoted verbatim from the transcript that support the answer; t_sec is the supporting segment's start time in seconds, or null when unknown
confidence"high" | "medium" | "low"How well the transcript actually supports the answer — forced to "low" when every quote fails verification
based_onstring[]Which inputs were actually used, e.g. ["transcript"] or ["transcript","chapters"]

Grounded, not guessed: quotes are instructed to be verbatim from the transcript, and every quote is additionally POST-validated against the actual transcript text (a fuzzy substring check) before it's ever returned — a quote the model couldn't back up is dropped rather than shipped as evidence.

Feeds on structured chapters too, when you have them

ask deliberately does not auto-include the pricier "structured" field — that stays an explicit, separate opt-in. But if you request (or already have cached) "structured" in the same call, its chapters are handed to the answer as extra grounding, and based_on reflects it: ["transcript","chapters"]. Ask once for chapters + Q&A in the same call and the answer can reference where in the video something happens, not just what was said.

Flat, honest pricing

One bounded Groq chat-completion call, regardless of how complex the question is — that's why it's priced flat rather than per-token: $0.0075 per call, charged only when an answer is actually produced. See the full rate card.

Never cached — a fresh answer every time

Unlike digest or structured, an ask call is never served from FrameFetch's result cache: a different question about the same video must never get a stale cached answer to a PRIOR question. Every call with ask set gets a genuinely fresh answer — while the underlying transcript and metadata it draws on still cache normally for every other (non-ask) request to the same video, so you're not paying to re-download or re-transcribe the source on every question.

Best-effort, never charged on failure

ask is treated exactly like digest: best-effort, never a hard failure of the whole call. If no transcript is available to answer from, or the model's output can't be parsed, ask is simply omitted, a plain-English string is appended to the top-level warnings array, and the call is not billed for it — the rest of the response (transcript, metadata, frames) stays intact. These degrade cases never surface as an HTTP error code, only as a warning string.

Use it from an AI agent (MCP)

FrameFetch ships an MCP server at POST https://framefetch.net/mcp. The framefetch_extract tool takes the same top-level ask argument — identical behavior to the HTTP API, so an agent can ask a question about a video the same way it asks for a transcript or a digest, and get back evidence instead of a wall of text.

FAQ
What is the ask param?

A top-level request option (not a fields entry): pass a 3-500 character question and FrameFetch returns ask: { answer, quotes, confidence, based_on } — a short, direct answer to that question, grounded in the video's transcript, with timestamped supporting quotes. Set it on /v1/extract or /v1/batch.

Do I need to upload the video file or send the transcript myself?

No. Send the same social-video URL you'd send for a transcript or metadata call, plus your question. FrameFetch fetches (or reuses a cached) transcript itself and answers directly — you never have to paste a 25,000-token transcript into your own model's context window.

How does it work under the hood?

One Groq chat-completion call (llama-3.3-70b-versatile, JSON mode, temperature 0) reads the transcript — with per-segment timestamps when available — plus the structured field's chapters when that was also requested, and returns strict JSON matching the ask schema. Every quote is additionally checked against the actual transcript text before it's ever returned.

How is it priced?

A flat $0.0075 per call, charged only when an answer is actually produced. It is never served from the result cache — a repeat call with a different question always gets a genuinely fresh answer, even though the underlying transcript stays cached for every other request.

What happens if the answer can't be grounded?

ask degrades gracefully: if no transcript is available, or the model's output can't be parsed, the field is omitted, a warning is added to the response's warnings array, and the call is not charged. If every quote fails verification against the transcript, the answer is still returned but confidence is forced to "low".

Which platforms does it work on?

Any platform FrameFetch can get a transcript from: YouTube (incl. Shorts), TikTok, Instagram Reels, Reddit, and Pinterest.