Send the link
A YouTube, TikTok, Twitch, Kick or X link, or your own file. You never download or store the video.
Send a video link. One call returns what was said, a second call returns what happened on screen. Both come back with timestamps.
$5 in free credits to start. No card and no platform API key.
Speech and picture are read by two models. You call each one with the same link and join the results on the timestamps.
A YouTube, TikTok, Twitch, Kick or X link, or your own file. You never download or store the video.
Every spoken line with a start and an end time. Speaker labels and a time on every word are optional.
Events on screen, each with a start, an end and a description, plus scene boundaries.
Both results count seconds from the start of the video, so a quote lines up with the picture behind it.
A transcript holds the speech. Products, overlays, scores and reactions exist only in the picture. Video understanding turns them into a visual timeline you can search.
Time
What was said
What was on screen
Said “I have put 300 km on these.”
On screen Close-up of a running shoe on a treadmill. Text on screen reads “20% OFF, CODE RUN20”.
Said “Quick shout-out to tonight's sponsor.”
On screen The streamer lifts a drink can toward the camera and smiles.
Said No speech
On screen A scoreboard fills the screen, then four players jump up from their chairs.
Said “Okay, let me show you how this works.”
On screen A code editor fills the screen. The cursor scrolls to a function and three lines are highlighted.
Illustrative output. Small text and brand names are read best on the detail preset.
The transcript and the visual timeline are separate jobs. Each call returns a request ID right away, and the result arrives on the job or on your webhook.
curl -X POST 'https://api.deapi.ai/api/v2/audio/transcriptions' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-d '{
"source_url": "https://www.youtube.com/watch?v=VIDEO_ID",
"model": "WhisperLargeV3Ct2",
"include_ts": true
}'
# → {"data": {"request_id": "c08a339c-…"}}
# Poll GET /api/v2/jobs/{request_id} or pass webhook_url.
curl -X POST 'https://api.deapi.ai/api/v2/videos/descriptions' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer YOUR_API_TOKEN' \
-F 'video_url=https://www.youtube.com/watch?v=VIDEO_ID' \
-F 'model=Marlin_2B' \
-F 'preset=balanced'
# → {"data": {"request_id": "7d1e52aa-…"}}
# Same link, same job endpoint, same webhook.
// 1 · transcript
{
"language": "en",
"segments": [
{ "start": 2712.4, "end": 2716.9,
"text": "Quick shout-out to tonight's sponsor." }
]
}
// 2 · visual timeline
{
"events": [
{ "start": 2712.0, "end": 2721.0,
"description": "The streamer lifts a drink can
toward the camera and smiles." }
],
"scenes": [
{ "idx": 41, "start": 2690.0, "end": 2745.0,
"text": "Streamer at a desk, gameplay paused." }
],
"meta": { "duration": 7214, "preset": "balanced" }
}
Illustrative values. Times are seconds from the start of the video in both results.
Reference: transcription and video description.
The preset parameter sets how closely each frame is read. A closer read costs more and catches smaller things.
Small frames over long windows. The cheapest way to index long video.
From $0.073 per hour of video
Used when you leave the preset out. A middle point between price and how much of each frame is read.
From $0.104 per hour of video
Large frames over short windows. Reads more of what is on screen, including small text and brand names.
From $0.216 per hour of video
Once speech and picture are text on one timeline, the video works like any other document.
Brand and sponsor tracking
Search the transcript for the sponsor's name. Read the same seconds on the visual timeline to confirm the product was on screen.
Video search
Index both results, and a query like “unboxing” or “whiteboard” returns a time range, even when nobody said the word.
Highlights and clipping
Scene boundaries and event times are your cut points. Pick the events you care about and clip from start to end.
Agents and RAG
Hand a language model two timestamped text files in place of a 2-hour video. It can answer questions and cite the second it quotes.
The full analysis is the transcript plus the visual timeline, at one of three detail levels. They are billed as two jobs, per second of video, and the fee per request is already included.
Source
Transcript only
Full analysis: transcript + visual timeline
Fast
Balanced
Detail
YouTube
per hour of video
$0.052
$0.12
$0.16
$0.27
File upload
per hour of video
$0.052
$0.12
$0.16
$0.27
Twitch
per hour of video
$0.150
$0.30
$0.38
$0.65
Kick
per hour of video
$0.151
$0.33
$0.41
$0.69
X
per hour of video
$0.264
$0.45
$0.48
$0.58
TikTok
per clip, up to 1 minute
$0.015
$0.026
$0.030
$0.038
Balanced is the default preset. A 2-hour Twitch VOD with a balanced timeline costs $0.75. Speaker labels or a time on every word add 50% to the transcript. Source metadata adds $0.005 per request. Longer TikTok clips cost more per clip, and the visual timeline takes TikTok clips up to 10 minutes. All rates on the pricing page.
Build it yourself and you run a downloader, storage, a speech model and a video model. Here it is two requests. Read the API docs.
Two signals, one link
Transcription returns the words. The visual timeline returns what the camera saw. Both count seconds from the start of the video.
One key, one bill
YouTube, TikTok, X, Twitch and Kick links run on the same two endpoints. Your own files do too.
A public link is enough
You don't register an app or keep a login alive. We fetch the video and you never store it.
From $0.16 per hour for both
Up to 2 hours of video per timeline call. In our production test a 2-hour Twitch VOD came back in about 9 minutes.
Send one link through both endpoints and read the results before you build anything.
Only need the speech? See video to text. Short clips? See TikTok video analysis.
Video analysis, transcripts and pricing
source_url to POST /api/v2/audio/transcriptions for the transcript, and as video_url to POST /api/v2/videos/descriptions for the visual timeline. Each call returns a request ID. Read the result from GET /api/v2/jobs/{request_id} or receive it on your webhook.
Quick check before we generate