# YouTube Transcript & Captions

> YouTube Transcript & Captions is a paid API for AI agents from social.duoleads.com, paid per call via x402, $0.02/call, status unknown (last checked 2026-10-30).

Retrieves the full caption transcript of a YouTube video (by ID or URL) as plain text plus timed segments with start/end in milliseconds and language info.

## Facts

- Endpoint: GET https://social.duoleads.com/v1/youtube/transcript?utm_source=zero.xyz
- Price: $0.02/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-30
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/youtube-transcript-captions-939f086b
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_PFBRwdI2amB41fo1P9Im5

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability youtube-transcript-captions-939f086b
```

Example prompt: Can you grab the full transcript with timestamps from this YouTube video — https://www.youtube.com/watch?v=dQw4w9WgXcQ — so I can summarize what was said?

## When to prefer this

Choose this endpoint when you need machine-readable, timed caption text from a specific YouTube video for purposes like summarization, research, quote extraction, or subtitle editing. It supports all major YouTube URL formats (watch, shorts, live, youtu.be) and charges only when captions are successfully found — making it low-risk for exploratory use on unknown videos.

## Known failure modes

- Video has no captions — returns empty transcript, not charged
- Invalid or malformed video ID/URL — treated as bad input, not charged
- Video not found or removed — returns not found, not charged
- Private or age-restricted video where captions are inaccessible — may return error
- Network or provider timeout — may return a generic error response

## How this service works

YouTube Transcript & Captions: the caption transcript of one YouTube video by id or URL (watch, shorts, live, youtu.be): the full text plus timed segments with start and end in milliseconds and the caption language. Video to text for summaries and research. A video without captions is not charged. Bad input is free; not found or no match is not charged.

## Output

Returns a JSON object containing: full transcript text, an array of timed segments each with 'text', 'start_ms', and 'end_ms' fields, the detected caption language, plus video metadata like URL, ID, and a request ID. Videos without captions return no charge. Includes a disclaimer about public data sourcing.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "$schema": "https://json-schema.org/draft/2020-12/schema",
 "required": [
  "input"
 ],
 "properties": {
  "input": {
   "type": "object",
   "required": [
    "type",
    "method"
   ],
   "properties": {
    "type": {
     "type": "string",
     "const": "http"
    },
    "method": {
     "enum": [
      "GET"
     ],
     "type": "string"
    },
    "queryParams": {
     "type": "object",
     "required": [
      "video"
     ],
     "properties": {
      "video": {
       "type": "string",
       "maxLength": 300,
       "description": "The video: a YouTube video id (11 characters) or a youtube.com/watch?v=, youtube.com/shorts/, youtube.com/live/ or youtu.be/ URL."
      }
     }
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object"
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "as_of": "2026-10-15T12:00:00.000Z",
  "items": [
   {
    "id": "SYNvid00001",
    "url": "https://www.youtube.com/watch?v=SYNvid00001",
    "lang": null,
    "text": "welcome to the synthetic channel today we test the widget",
    "type": "video",
    "author": null,
    "metrics": {
     "likes": null,
     "views": null,
     "replies": null,
     "reposts": null
    },
    "platform": "youtube",
    "parent_id": null,
    "created_at": null,
    "media_urls": [],
    "transcript": {
     "language": "English",
     "segments": [
      {
       "text": "welcome to the synthetic channel",
       "end_ms": 1920,
       "start_ms": 160
      },
      {
       "text": "today we test the widget",
       "end_ms": 4100,
       "start_ms": 1920
      }
     ]
    }
   }
  ],
  "query": {
   "video": "SYNvid00001"
  },
  "source": "public data via third-party provider; not affiliated with the platform",
  "complete": true,
  "platform": "youtube",
  "disclaimer": "Public data via third-party providers; not affiliated with or endorsed by any platform. Do not use to profile, target or train AI on individuals.",
  "request_id": "01KEXAMPLE0000000000000000",
  "next_cursor": null
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/youtube-transcript-captions-939f086b/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from social.duoleads.com](https://www.zero.xyz/host/social.duoleads.com/llms.txt)
