Video annotation API
Your video, as a time-coded annotation
For world-model, VLA / robot-learning and video-generation teams. Send a video you own and get back the speech as timed text, a frame every 4 seconds described in words, the text on screen with its time, and key points with quotes checked against the speech — as JSON, or JSONL across a batch. From $0.92 an hour of video, and the video file itself never leaves your machine.
What one call returns
The annotation
The shape, with illustrative values (a real read fills every array): speech segments with start, end and an approx flag; frames with their time, a short description and the text visible in them; on-screen text spans; chapters when the source has them; key points each tied to a quote and a time; and a coverage receipt that says what was and was not read.
{
"version": "1",
"source": "upload",
"duration_seconds": 600,
"speech": [{ "start": 12.0, "end": 18.5, "text": "…", "approx": true }],
"frames": [{ "t": 4.0, "description": "at most 12 words: what is in view", "ocr": "text on screen" }],
"on_screen": [{ "start": 8.0, "end": 16.0, "text": "…" }],
"chapters": [],
"key_points": [{ "text": "…", "quote": "words from the speech", "t": 40.0, "verified": true }],
"coverage": { "seconds_transcribed": 600, "largest_frame_gap_seconds": 4 }
}Send your own video
Upload, CLI or the console
# the CLI extracts the sound and frames on your machine, then calls the API
pip install linkdigest-mcp # needs ffmpeg + ffprobe on PATH
LINKDIGEST_API_KEY=ld_live_... linkdigest capture ./clip.mp4 --json
# or over HTTP: one audio part, one frames part per JPEG, one meta part
curl -X POST https://linkdigest.dev/api/v1/capture \
-H "Authorization: Bearer ld_live_..." \
-F "audio=@audio.mp3;type=audio/mpeg" \
-F "frames=@frame_00.jpg;type=image/jpeg" \
-F 'meta={"page_url":"https://linkdigest.dev/app/upload","duration_seconds":600,"frame_times":[4]}'
# 202 {"id":"…","poll":"/api/v1/capture/…"}
curl "https://linkdigest.dev/api/v1/capture/JOB_ID?format=annotation" \
-H "Authorization: Bearer ld_live_..."Or drop a file on /app/upload in the console. Links work too: a public Xiaohongshu, Douyin, Bilibili or YouTube video can be read straight from its link with POST /api/v1/digest and format: "annotation"; a batch of links exports as JSONL, one video per line. Full reference: docs.
Price
Per hour of video
An upload is read in pieces of up to 10 minutes; each piece costs 11 credits, so an hour of video is 66 credits. What that is in dollars depends on how you buy credits:
| buying | credits | per hour of video |
|---|---|---|
| Studio plan | $49 a month for 3,500 credits | $0.92 |
| Volume pack | $39 once for 2,000 credits | $1.29 |
| Dev plan | $9 a month for 500 credits | $1.19 |
| Credit pack | $5 once for 250 credits | $1.32 |
10 free credits on sign-up, no card. A piece that yields nothing readable is not charged for its length. Above a few hundred hours a month, ask in the pilot form. All prices: /pricing.
Limits, said plainly
What it does not do yet
- Uploads are up to 10 minutes per call; split longer footage (a pilot can take it whole).
- On uploads, one frame every 4 seconds (at most 36 per call) is described; motion between frames is not.
- Speech times are estimated within the pieces the speech model hears, and marked approx.
- No action or task labels, no hand or pose tracking, no depth. Tell us your schema in the pilot request.
- The video file never leaves your machine; the extracted sound and frames are deleted when the job ends, and the annotation stays private to your account.
A real sample
One clip, annotated
🇦🇺此时一位留子正在制作她的下午茶 · video © Glen啦 on Xiaohongshu, linked, not copied; the descriptions are LinkDigest's own read · read 2026-11-07 · 2 credits · 40 s · source
16 of 40 frames shown, spread over the clip. Not captured, in the read's own words: no speech transcript: no speech was recognised in the audio; comments: the top 5 of 32 read from the share page; the rest of the thread not read.
| time | frame |
|---|---|
| 0:00 | A hand drops sliced ginger into a white pot containing fried shallots on a stove. |
| 0:03 | A metal spoon stirs raw chicken pieces and ginger slices inside the cooking pot. |
| 0:05 | A hand places large morel mushrooms on top of the cooked chicken in the pot. |
| 0:08 | A hand adjusts a round, textured brown mushroom among the chicken and other fungi in the pot. |
| 0:10 | Clear water is poured from a container into the pot, submerging the mushrooms and chicken pieces. |
| 0:13 | A metal spoon stirs the mushroom and chicken soup inside the white enameled pot. |
| 0:16 | The soup simmers in the pot now containing morel mushrooms, chicken, and added red dates. |
| 0:18 | A white pot on a stove contains boiling soup with mushrooms, red dates, and chicken. |
| 0:21 | A hand wearing a white oven mitt lifts the pink lid off the steaming pot. |
| 0:23 | A metal spoon scoops broth from the pot filled with cooked chicken, mushrooms, and dates. |
| 0:26 | A bowl of white rice is held in front of a steaming pot on the stove. |
| 0:29 | A spoon adds a piece of chicken and broth to a bowl of rice topped with mushrooms. |
| 0:31 | Broth is poured from a metal ladle into a ceramic bowl containing chicken, mushrooms, and rice over a pot. |
| 0:34 | A hand holds up a finished bowl of chicken soup featuring a drumstick, red date, and textured mushroom. |
| 0:36 | A hand uses a spoon to scoop broth from a bowl of chicken soup with rice and mushrooms. |
| 0:39 | A close-up of a spoon holding rice and broth lifted from a bowl of chicken stew. |
The same read as the API returns it, frames cut to the first three:
{
"version": "1",
"source": "https://www.xiaohongshu.com/explore/6941175d000000001e02a118",
"platform": "xiaohongshu",
"title": "🇦🇺此时一位留子正在制作她的下午茶",
"duration_seconds": 40,
"depth": "full",
"speech": [],
"frames": [
{
"t": 0,
"description": "A hand drops sliced ginger into a white pot containing fried shallots on a stove.",
"ocr": "Glen啦\n小红书"
},
{
"t": 1,
"description": "Raw chicken pieces are poured from a white bowl into the pot with ginger and shallots.",
"ocr": "Glen啦\n小红书"
},
{
"t": 2,
"description": "Raw chicken pieces fill the bottom of the white enameled pot on the stovetop.",
"ocr": "Glen啦\n小红书"
}
],
"on_screen": [],
"chapters": [],
"key_points": [
{
"text": "视频展示了在澳大利亚的留学生制作菌菇鸡汤饭的过程。",
"quote": "此时一位留子正在制作她的下午茶",
"t": null,
"verified": true
},
{
"text": "这是一段关于做饭和美食制作的Vlog。",
"quote": "#菌菇鸡汤饭[话题]#",
"t": null,
"verified": true
},
{
"text": "作者认为这道菜味道无敌好吃。",
"quote": "今天做鸡汤泡饭~ 无敌好吃",
"t": null,
"verified": true
}
],
"coverage": {
"seconds_transcribed": 0,
"duration_seconds": 40,
"largest_frame_gap_seconds": 1,
"images_read": null,
"images_total": null,
"transcript_source": "none",
"not_captured": [
"no speech transcript: no speech was recognised in the audio",
"comments: the top 5 of 32 read from the share page; the rest of the thread not read"
],
"links_found": 0
}
}Pilot
Send us a clip of your own footage
Tell us what you are training, roughly how many hours a month, and the schema you need. A person replies, usually the same day, and annotates a short clip of your own footage as the pilot.
Questions
Before you send footage
What does the annotation contain, and in what format?
One JSON object per video: the speech as timed segments, a frame every 4 seconds with a short description of what is in view and the text visible in it, on-screen text with its start and end, and key points each backed by a quote that is checked against the speech. A batch exports as JSONL, one video per line.
How much does an hour of video cost?
An upload is read in pieces of up to 10 minutes; a piece costs 11 credits, so an hour is 66 credits — $0.92 on the studio plan, $1.29 on the volume pack, $1.19 on the dev plan, $1.32 on the credit pack. A piece that yields nothing readable is not charged for its length. 10 free credits on sign-up, no card.
Do you keep our video?
No. The video file never leaves your machine: the browser page or the CLI extracts the soundtrack and the frames, and only those are sent. The engine deletes them when the job ends. The annotation is stored privately for your account — never shared, never served to anyone else.
Can you do long videos, action labels or hand tracking?
Today an upload is up to 10 minutes per call — split longer footage, or ask for a pilot and we will take it whole. Speech times are estimated within the pieces the speech model hears (marked approx). There are no action or task labels yet and no hand or pose tracking; if your schema needs them, say so in the pilot request — that is what decides what gets built next.
Does it work on Chinese video?
Yes — speech in Chinese, English and other languages is transcribed, and Chinese on-screen text is read. The same engine also reads public Xiaohongshu, Douyin, Bilibili and YouTube links, if your data is already online.
Platforms and live read status: /platforms · 中文:视频标注 API