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:

buyingcreditsper 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.

timeframe
0:00A hand drops sliced ginger into a white pot containing fried shallots on a stove.
0:03A metal spoon stirs raw chicken pieces and ginger slices inside the cooking pot.
0:05A hand places large morel mushrooms on top of the cooked chicken in the pot.
0:08A hand adjusts a round, textured brown mushroom among the chicken and other fungi in the pot.
0:10Clear water is poured from a container into the pot, submerging the mushrooms and chicken pieces.
0:13A metal spoon stirs the mushroom and chicken soup inside the white enameled pot.
0:16The soup simmers in the pot now containing morel mushrooms, chicken, and added red dates.
0:18A white pot on a stove contains boiling soup with mushrooms, red dates, and chicken.
0:21A hand wearing a white oven mitt lifts the pink lid off the steaming pot.
0:23A metal spoon scoops broth from the pot filled with cooked chicken, mushrooms, and dates.
0:26A bowl of white rice is held in front of a steaming pot on the stove.
0:29A spoon adds a piece of chicken and broth to a bowl of rice topped with mushrooms.
0:31Broth is poured from a metal ladle into a ceramic bowl containing chicken, mushrooms, and rice over a pot.
0:34A hand holds up a finished bowl of chicken soup featuring a drumstick, red date, and textured mushroom.
0:36A hand uses a spoon to scoop broth from a bowl of chicken soup with rice and mushrooms.
0:39A 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.

No account needed. We only use your email to reply.

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