{"openapi":"3.0.3","info":{"title":"LinkDigest","version":"1.0.0","description":"把抖音、小红书、TikTok、YouTube、X 的链接变成 AI 能读的文本：逐字稿、画面文字、逐图描述、要点，可选爆款拆解和翻译。Turns social links into LLM-ready text — transcript, on-screen text, images, key points, and an optional viral breakdown. 10 free credits when you sign up; a post is 1 credit, video 1 per started minute, or 1 per started 2 minutes read transcript-first (depth=transcript); cached links are free. Key: https://linkdigest.dev/app/keys"},"servers":[{"url":"https://linkdigest.dev"}],"security":[{"bearer":[]}],"paths":{"/api/v1/digest":{"post":{"operationId":"digest_url","summary":"Read a social link as text","description":"Returns the digest, or 202 with a jobId when it takes longer than ~20 s (long videos, many images) — then call get_digest with that jobId and wait=20 until it is done.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"What to read.","properties":{"url":{"type":"string","description":"The post link, or the whole share text that contains it."},"format":{"type":"string","description":"json (default) or markdown. Use json in Coze and read raw_markdown.","enum":["json","markdown"]},"breakdown":{"type":"boolean","description":"Also take the post apart (爆款拆解), +1 credit."},"translate_to":{"type":"string","description":"Also translate, e.g. en or zh-CN, +1 credit.","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"max_credits":{"type":"integer","description":"Your own ceiling for this one link: over it, a link is refused for free (402). YouTube is the exception: its length is known only after the read, so it is read and billed at most this ceiling.","minimum":1},"partial_ok":{"type":"boolean","description":"Read the opening minutes the budget affords instead of refusing a long video; of an image post, its first images."},"depth":{"type":"string","description":"full (default) or transcript. transcript reads a long video transcript-first: the whole transcript plus about a frame a minute (one per chapter when it has chapters), 1 credit per started 2 minutes instead of 1 per minute, up to 120 minutes on a paid plan (60 free). YouTube read by Gemini has no transcript-only form: it is read and priced in full.","enum":["full","transcript"]}},"required":["url"]}}}},"responses":{"200":{"description":"The digest.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Digest"}}}},"202":{"description":"Still working — poll get_digest with the jobId.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pending"}}}},"400":{"description":"The request was malformed (for example, not a link).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of credits; the body carries pay links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wall"}}}},"422":{"description":"The link could not be read — removed, private or walled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests; honour Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/digest/{jobId}":{"get":{"operationId":"get_digest","summary":"Collect a digest by job id","description":"Pass wait=20 to hold the request until the job finishes (at most 20 s), then call again if still 202.","parameters":[{"name":"jobId","in":"path","required":true,"description":"The jobId from digest_url.","schema":{"type":"string"}},{"name":"format","in":"query","required":false,"description":"json (default) or markdown.","schema":{"type":"string","enum":["json","markdown"]}},{"name":"wait","in":"query","required":false,"description":"Seconds to wait for the job, 0-20.","schema":{"type":"integer","minimum":0,"maximum":20}}],"responses":{"200":{"description":"The digest.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Digest"}}}},"202":{"description":"Still working.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pending"}}}},"400":{"description":"The request was malformed (for example, not a link).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of credits; the body carries pay links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wall"}}}},"422":{"description":"The link could not be read — removed, private or walled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests; honour Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/digest/batch":{"post":{"operationId":"digest_batch","summary":"Read up to 50 links at once","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"The links to read.","properties":{"urls":{"type":"array","items":{"type":"string","description":"A post link."},"description":"Up to 50 links."},"breakdown":{"type":"boolean","description":"Take every post apart, +1 credit each."},"translate_to":{"type":"string","description":"Translate every digest, e.g. en.","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"webhook_url":{"type":"string","description":"A public https URL to POST the finished batch to (signed)."},"partial_ok":{"type":"boolean","description":"Read long videos to budget instead of failing them."},"depth":{"type":"string","description":"full (default) or transcript: read every video transcript-first.","enum":["full","transcript"]}},"required":["urls"]}}}},"responses":{"200":{"description":"Every link was already cached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"202":{"description":"Started; poll get_batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"The request was malformed (for example, not a link).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of credits; the body carries pay links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wall"}}}},"422":{"description":"The link could not be read — removed, private or walled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests; honour Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/digest/batch/{batchId}":{"get":{"operationId":"get_batch","summary":"A batch's progress and results","parameters":[{"name":"batchId","in":"path","required":true,"description":"The batch_id from digest_batch.","schema":{"type":"string"}},{"name":"include","in":"query","required":false,"description":"digests to include every finished digest.","schema":{"type":"string","enum":["digests"]}}],"responses":{"200":{"description":"The batch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Batch"}}}},"400":{"description":"The request was malformed (for example, not a link).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"Out of credits; the body carries pay links.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Wall"}}}},"422":{"description":"The link could not be read — removed, private or walled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests; honour Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Your API key (ld_live_…) from https://linkdigest.dev/app/keys."}},"schemas":{"Digest":{"type":"object","description":"A post as LLM-ready text. chapters, chapter_source, category, music, image_count, images_read, coverage and key_point_support (added 2026-10-05) may be absent from links cached before then, as may links (added the same day).","properties":{"platform":{"type":"string","description":"xiaohongshu, douyin, tiktok, youtube, x or web."},"author":{"type":"string","description":"The author's display name."},"title":{"type":"string","description":"The post's title. On Douyin its own title (item_title) when it has one, else the caption's first 120 characters; on YouTube the watch page's title when the page can be read, else Gemini's reading of the video."},"posted_at":{"type":"string","description":"When it was posted (YYYY-MM-DD), when known."},"caption":{"type":"string","description":"The post's own text."},"transcript":{"type":"array","items":{"type":"object","description":"One transcript segment.","properties":{"t":{"type":"number","description":"Start time in seconds."},"text":{"type":"string","description":"What was said."}}},"description":"What is said in the video, with times. Empty for image notes."},"transcript_source":{"type":"string","description":"native_captions, asr or none."},"ocr_text":{"type":"array","items":{"type":"string","description":"A piece of on-screen text."},"description":"Every distinct piece of text read from the images or frames."},"on_screen":{"type":"array","items":{"type":"object","description":"Text on screen at a time.","properties":{"t":{"type":"number","description":"Approximate time in seconds."},"text":{"type":"string","description":"The text on screen."}}},"description":"Video only: on-screen text with roughly when it appeared."},"images":{"type":"array","items":{"type":"object","description":"One post image.","properties":{"description":{"type":"string","description":"What the image shows."},"ocr":{"type":"string","description":"The text inside it, verbatim."}}},"description":"Each post image described and read (image notes)."},"key_points":{"type":"array","items":{"type":"string","description":"A takeaway."},"description":"The substantive takeaways, in the post's language."},"key_point_support":{"type":"array","items":{"type":"object","description":"The words behind one key point.","properties":{"point_index":{"type":"integer","description":"0-based index into key_points."},"kind":{"type":"string","description":"Where the quote was found: transcript, on_screen, image, caption or chapter.","enum":["transcript","on_screen","image","caption","chapter"]},"t":{"type":"number","description":"Seconds into the video where the quote is (transcript, on-screen text, chapter).","nullable":true},"image_index":{"type":"integer","description":"0-based index into images, when the quote is in one image.","nullable":true},"quote":{"type":"string","description":"A short phrase, verbatim from the post."},"verified":{"type":"boolean","description":"True when the engine found the quote word for word in the post; false rows are kept."}}},"description":"One quote per key point the model could quote, checked against the post by code. A point with no verified row has no evidence in the post's own words."},"stats":{"type":"object","description":"Engagement counts as the platform reported them at fetch time.","properties":{"likes":{"type":"integer","description":"Likes (点赞) the platform showed when the post was read.","nullable":true},"comments":{"type":"integer","description":"Comments (评论).","nullable":true},"shares":{"type":"integer","description":"Shares (分享).","nullable":true},"collects":{"type":"integer","description":"Saves (收藏).","nullable":true},"plays":{"type":"integer","description":"Plays (播放), when the platform reports them.","nullable":true},"as_of":{"type":"string","description":"The day the counts were read (YYYY-MM-DD) — a snapshot, not a live figure."}},"nullable":true},"tags":{"type":"array","items":{"type":"string","description":"A hashtag, without #."},"description":"The post's hashtags."},"chapters":{"type":"array","items":{"type":"object","description":"One chapter.","properties":{"t":{"type":"number","description":"When the chapter starts, in seconds."},"title":{"type":"string","description":"The chapter's title, as marked."},"summary":{"type":"string","description":"Douyin's one-line summary of a chapter it generated, or empty."}}},"description":"Chapters marked on the video by its author or the platform — never inferred. On a partial read, only those in the part read. Empty when the video has none."},"chapter_source":{"type":"string","description":"Who marked the chapters: \"author\", \"platform\" (generated by Douyin), or empty."},"category":{"type":"array","items":{"type":"string","description":"One level, broadest first."},"description":"The platform's own category for the post, e.g. 财经 › 投资理财 › 股票 on Douyin, Education on YouTube."},"music":{"type":"string","description":"The soundtrack (title — artist) when it is not the poster's own voice; else empty."},"links":{"type":"array","items":{"type":"object","description":"A link the post points to. Nothing behind it was read.","properties":{"url":{"type":"string","description":"The address as found, scheme and host lower-cased. wxp://, alipays:// and other app links are kept."},"found_in":{"type":"string","description":"Where it was found: caption, description (YouTube), wechat_read_more (a WeChat article's 阅读原文), qr_code (decoded from an image or frame the read downloaded), on_screen (a well-formed URL in the on-screen or image text) or chapter.","enum":["caption","description","wechat_read_more","qr_code","on_screen","chapter"]},"label":{"type":"string","description":"What it is when known (\"WeChat Pay\", \"QQ group\", \"阅读原文\"), else the words before it in the post, or empty."},"kind":{"type":"string","description":"What opening it would do: web, payment (a WeChat Pay, Alipay or other payment code), group_invite (joins a WeChat, QQ, Telegram… group), app_deeplink (opens an app) or other (a contact card, an account to follow).","enum":["web","payment","group_invite","app_deeplink","other"]}}},"description":"The links the post points to — in its caption or description, WeChat's 阅读原文, QR codes in its images or frames, on-screen text and chapters — deduplicated, at most 20, and never opened: a link worth reading is a separate digest. Payment codes and group invites are labelled by kind."},"breakdown":{"type":"object","description":"爆款拆解 — how the post is built. Present only when breakdown=true (+1 credit). Quotes are checked against the post; engagement and tags come from the platform, never the model.","properties":{"language":{"type":"string","description":"The language the analysis is written in, e.g. zh-CN or en."},"format":{"type":"string","description":"The kind of post, e.g. 口播 talking head, 图文笔记 image note, 教程 tutorial."},"hook":{"type":"object","description":"How the post holds people in its first seconds (first image for an image note).","properties":{"spoken":{"type":"string","description":"The opening words, verbatim from the transcript, or empty."},"on_screen":{"type":"string","description":"The opening on-screen or cover text, verbatim, or empty."},"visual":{"type":"string","description":"What is shown at the start."},"why":{"type":"string","description":"Why the opening holds attention."}}},"beats":{"type":"array","items":{"type":"object","description":"One step of the post's structure.","properties":{"t":{"type":"number","description":"Start time in seconds, approximate to a keyframe (video).","nullable":true},"image":{"type":"integer","description":"1-based image number (image notes).","nullable":true},"label":{"type":"string","description":"The step, e.g. 痛点 pain point, 方法 method, 行动号召 call to action."},"summary":{"type":"string","description":"What happens in this step."},"quote":{"type":"string","description":"A short line copied verbatim from the post, or empty."}}},"description":"The structure, 3 to 10 steps in order."},"title_formula":{"type":"string","description":"The pattern behind the title, e.g. 数字 + 结果 + 人群."},"cover_text":{"type":"string","description":"Cover or first-frame text, verbatim, or empty."},"cta":{"type":"string","description":"The call to action, verbatim, or empty."},"audience":{"type":"string","description":"Who the post is made for."},"tags":{"type":"array","items":{"type":"string","description":"A hashtag, without #."},"description":"The post's own hashtags, from the platform."},"engagement":{"type":"object","description":"Engagement counts as the platform reported them at fetch time.","properties":{"likes":{"type":"integer","description":"Likes (点赞) the platform showed when the post was read.","nullable":true},"comments":{"type":"integer","description":"Comments (评论).","nullable":true},"shares":{"type":"integer","description":"Shares (分享).","nullable":true},"collects":{"type":"integer","description":"Saves (收藏).","nullable":true},"plays":{"type":"integer","description":"Plays (播放), when the platform reports them.","nullable":true},"as_of":{"type":"string","description":"The day the counts were read (YYYY-MM-DD) — a snapshot, not a live figure."}},"nullable":true},"template":{"type":"array","items":{"type":"string","description":"One step with [placeholders]."},"description":"4 to 8 steps to make your own version."},"remix_ideas":{"type":"array","items":{"type":"string","description":"An angle."},"description":"2 or 3 angles for a different version of the same idea."},"missing":{"type":"array","items":{"type":"string","description":"A missing signal."},"description":"What the analysis could not see (no speech, a partial read…)."}},"nullable":true},"translation":{"type":"object","description":"Present only when translate_to was given (+1 credit). The originals are always kept.","properties":{"language":{"type":"string","description":"The language it was translated into."},"title":{"type":"string","description":"Translated title."},"caption":{"type":"string","description":"Translated caption."},"key_points":{"type":"array","items":{"type":"string","description":"A translated takeaway."},"description":"Translated key points."},"transcript_text":{"type":"string","description":"Translated transcript, as one text."},"ocr_text":{"type":"array","items":{"type":"string","description":"Translated on-screen text."},"description":"Translated on-screen text."},"image_descriptions":{"type":"array","items":{"type":"string","description":"Translated description."},"description":"Translated image descriptions."},"note":{"type":"string","description":"What the translation leaves out, else empty. A transcript past 24,000 characters is translated from its start only, said here and in coverage.not_captured, e.g. \"translation covers the first 27:12 of 60:00 of the transcript\". The original transcript is always whole. Added 2026-10-06."}},"nullable":true},"raw_markdown":{"type":"string","description":"The whole digest as Markdown, including any breakdown and translation."},"credits":{"type":"integer","description":"What this call cost. 0 when served from cache."},"cached":{"type":"boolean","description":"True when someone had already read this link — free."},"degraded":{"type":"array","items":{"type":"string","description":"A note."},"description":"Anything that did not read fully, said plainly."},"duration_seconds":{"type":"number","description":"Media length, when it has one.","nullable":true},"read_seconds":{"type":"number","description":"How much of the media was read.","nullable":true},"partial":{"type":"object","description":"Present only when partial_ok was set and the budget did not cover the whole video, or (since 2026-10-06) the whole image post: then image_count and images_read say how many images were taken.","properties":{"read_seconds":{"type":"number","description":"Seconds read from the start; 0 for an image post read in part."},"duration_seconds":{"type":"number","description":"The whole video's length; 0 for an image post read in part."},"read_credits":{"type":"integer","description":"What this read cost."},"full_credits":{"type":"integer","description":"What a complete read costs — a fresh digest, not a top-up."},"transcript_credits":{"type":"integer","description":"What a transcript-first read (depth=transcript) of the whole video costs — the cheaper read to ask for next. Equal to full_credits on a transcript-first partial; null when the video is past the transcript-first length cap too.","nullable":true}},"nullable":true},"depth":{"type":"string","description":"How the video was read: full (frames sampled densely) or transcript (transcript-first: the whole transcript plus about a frame a minute, which coverage.not_captured says). A YouTube video read by Gemini is always full. Absent on links cached before 2026-10-05, which were all full.","enum":["full","transcript"]},"image_count":{"type":"integer","description":"How many images the post has, on posts with images.","nullable":true},"images_read":{"type":"integer","description":"How many of them were taken and priced: every one up to 60; past that the first 60, and with partial_ok the first ones the budget covers; degraded says so. Taken is not read: a failed download or vision read still counts here; coverage.images_read is how many were actually read.","nullable":true},"coverage":{"type":"object","description":"How much of the post this digest captured, computed in code. Null on links cached before 2026-10-05.","properties":{"seconds_transcribed":{"type":"number","description":"Video: seconds whose speech is in the transcript; 0 when there is none.","nullable":true},"duration_seconds":{"type":"number","description":"Video: its length.","nullable":true},"largest_frame_gap_seconds":{"type":"number","description":"Video: the longest stretch of the part read with no new sampled frame, start and end included.","nullable":true},"images_read":{"type":"integer","description":"Image posts: images that came back read.","nullable":true},"images_total":{"type":"integer","description":"Image posts: how many images the post has.","nullable":true},"transcript_source":{"type":"string","description":"native_captions, asr, gemini_video or none."},"not_captured":{"type":"array","items":{"type":"string","description":"A plain statement, e.g. \"minutes 12:00-43:58 not read (budget)\" or \"3 of 21 images skipped\"."},"description":"What was not read, and why. Always names comments, which are never read."},"links_found":{"type":"integer","description":"How many distinct links the post points to; links lists the first 20.","nullable":true}},"nullable":true},"source_url":{"type":"string","description":"The link as resolved."}}},"Breakdown":{"type":"object","description":"爆款拆解 — how the post is built. Present only when breakdown=true (+1 credit). Quotes are checked against the post; engagement and tags come from the platform, never the model.","properties":{"language":{"type":"string","description":"The language the analysis is written in, e.g. zh-CN or en."},"format":{"type":"string","description":"The kind of post, e.g. 口播 talking head, 图文笔记 image note, 教程 tutorial."},"hook":{"type":"object","description":"How the post holds people in its first seconds (first image for an image note).","properties":{"spoken":{"type":"string","description":"The opening words, verbatim from the transcript, or empty."},"on_screen":{"type":"string","description":"The opening on-screen or cover text, verbatim, or empty."},"visual":{"type":"string","description":"What is shown at the start."},"why":{"type":"string","description":"Why the opening holds attention."}}},"beats":{"type":"array","items":{"type":"object","description":"One step of the post's structure.","properties":{"t":{"type":"number","description":"Start time in seconds, approximate to a keyframe (video).","nullable":true},"image":{"type":"integer","description":"1-based image number (image notes).","nullable":true},"label":{"type":"string","description":"The step, e.g. 痛点 pain point, 方法 method, 行动号召 call to action."},"summary":{"type":"string","description":"What happens in this step."},"quote":{"type":"string","description":"A short line copied verbatim from the post, or empty."}}},"description":"The structure, 3 to 10 steps in order."},"title_formula":{"type":"string","description":"The pattern behind the title, e.g. 数字 + 结果 + 人群."},"cover_text":{"type":"string","description":"Cover or first-frame text, verbatim, or empty."},"cta":{"type":"string","description":"The call to action, verbatim, or empty."},"audience":{"type":"string","description":"Who the post is made for."},"tags":{"type":"array","items":{"type":"string","description":"A hashtag, without #."},"description":"The post's own hashtags, from the platform."},"engagement":{"type":"object","description":"Engagement counts as the platform reported them at fetch time.","properties":{"likes":{"type":"integer","description":"Likes (点赞) the platform showed when the post was read.","nullable":true},"comments":{"type":"integer","description":"Comments (评论).","nullable":true},"shares":{"type":"integer","description":"Shares (分享).","nullable":true},"collects":{"type":"integer","description":"Saves (收藏).","nullable":true},"plays":{"type":"integer","description":"Plays (播放), when the platform reports them.","nullable":true},"as_of":{"type":"string","description":"The day the counts were read (YYYY-MM-DD) — a snapshot, not a live figure."}},"nullable":true},"template":{"type":"array","items":{"type":"string","description":"One step with [placeholders]."},"description":"4 to 8 steps to make your own version."},"remix_ideas":{"type":"array","items":{"type":"string","description":"An angle."},"description":"2 or 3 angles for a different version of the same idea."},"missing":{"type":"array","items":{"type":"string","description":"A missing signal."},"description":"What the analysis could not see (no speech, a partial read…)."}},"nullable":true},"Pending":{"type":"object","description":"The digest is still running; collect it by job id.","properties":{"pending":{"type":"boolean","description":"True: still working."},"jobId":{"type":"string","description":"Collect it with GET /api/v1/digest/{jobId}."},"poll":{"type":"string","description":"The path to poll."},"retryAfter":{"type":"integer","description":"Seconds to wait before polling (or poll with wait=20)."},"stage":{"type":"string","description":"What the job is doing now."},"error":{"type":"string","description":"A sentence saying it is still running."}}},"Wall":{"type":"object","description":"Out of credits, or this link costs more than is left. Nothing was spent.","properties":{"error":{"type":"string","description":"What happened, in a sentence."},"error_code":{"type":"string","description":"quota_exceeded, insufficient_credits or media_too_long."},"buy_url":{"type":"string","description":"Opens checkout for 250 credits ($5, once) for this key's account — no sign-in. Show it to the person."},"subscribe_url":{"type":"string","description":"Opens checkout for Dev ($9/month, 500 credits) — no sign-in."},"upgradeRequired":{"type":"boolean","description":"True when paying would let this call go through."}}},"Error":{"type":"object","description":"An error.","properties":{"error":{"type":"string","description":"What went wrong, in a sentence."}}},"Batch":{"type":"object","description":"A batch of links.","properties":{"batch_id":{"type":"string","description":"The batch id."},"status":{"type":"string","description":"running or done."},"total":{"type":"integer","description":"Links in the batch."},"done":{"type":"integer","description":"Finished."},"failed":{"type":"integer","description":"Failed."},"credits_total":{"type":"integer","description":"Credits spent so far."},"poll":{"type":"string","description":"The path to poll."},"breakdown":{"type":"boolean","description":"Whether every link is taken apart."},"depth":{"type":"string","description":"full or transcript: how every video in the batch is read.","enum":["full","transcript"]},"items":{"type":"array","items":{"type":"object","description":"One link.","properties":{"url":{"type":"string","description":"The link."},"status":{"type":"string","description":"queued, running, done or error."},"cache_key":{"type":"string","description":"Where the digest is stored."},"credits":{"type":"integer","description":"What it cost."},"error":{"type":"string","description":"Why it failed, if it did."}}},"description":"Every link and its state."}}}}}}