API 키
API 레퍼런스

Transcripts V2

V2는 사용자가 소유하는 간소화된 스크립트 모델입니다. 빠른 캐시 적중과 일관된 응답을 우선하며, 언어를 요청하지 않는 한 예상치 못한 번역은 하지 않습니다.

새 기능: 모든 스크립트 소스를 위한 단일 mode 매개변수

source와 allow_asr를 조합하는 대신 auto, captions_only, human_captions_only, speech_to_text_only 중에서 선택하세요. 기존 요청은 이전과 똑같이 작동합니다. 작동 방식 보기

OpenAPI 명세

YAML을 다운로드해 Postman, Insomnia로 가져오거나, 클라이언트를 생성하거나, ChatGPT / Claude에 붙여 넣으세요.

OpenAPI 3.0: V2 (권장)

단일 동영상 스크립트 생성

동영상을 한 번에 하나씩 처리하는 가장 빠른 방법입니다. 자막 기반 스크립트는 몇 초 안에 반환되며, ASR은 비동기로 실행되어 /api/v2/jobs/{job_id}로 폴링합니다.

동영상 스크립트 생성

Transcribe a single YouTube video. Returns immediately for caption-based videos. With mode=auto it falls back to ASR (async) when captions are unavailable: you get status processing and a job_id to poll at /api/v2/jobs/{job_id}, or the result is POSTed to webhook_url if you set one. Responses include the mode the request ran with.

POST/api/v2/transcribe
파라미터
videostring필수

YouTube URL or 11-character video ID. Required unless upload_id is set.

upload_idstring

Transcribe an uploaded media file instead of a YouTube video (see /uploads). Forces the ASR path (mode must be omitted or speech_to_text_only); webhook_url required. The upload id is returned as video_id in results.

modeauto | captions_only | human_captions_only | speech_to_text_only

Where the transcript comes from (recommended). auto: captions first, speech-to-text (ASR) only if the video has none. captions_only: any captions, never ASR. human_captions_only: human-made captions only. speech_to_text_only: always transcribe the audio. auto and speech_to_text_only can charge ASR credits. Replaces source + allow_asr; cannot be combined with them. Note: mode=auto is not the same as legacy source=auto (captions only, which is mode=captions_only). When omitted, your account default from the API Dashboard applies: auto for accounts created from October 2026, captions_only for older accounts unless changed. ASR modes work without webhook_url: poll the returned job_id.

languageISO 639-1

Preferred transcript language (e.g. en). If unavailable, captions in another language may be returned: transcript.language reports the actual language.

sourceauto | manual | asr

Legacy, still supported: use mode instead. Default: auto. asr transcribes the audio (async, requires webhook_url).

allow_asrboolean

Legacy, still supported: use mode=auto instead. Falls back to ASR if captions fail.

formatobject

{ timestamp, paragraphs, words }: include extra structure in the transcript.

webhook_urluri

When set, ASR results are POSTed to your URL. Optional with mode (poll the job_id instead); required for legacy source=asr. Ignored by captions_only and human_captions_only, which never use ASR.

asr_optionsobject

Rich ASR config: language (+ codeSwitching, medicalMode, keyTerms), translateTo, speaker diarization (speakerLabels, speakerId + type/known values, multichannel, exact or min/max expected speakers), speech understanding (topics, summary, moderation, PII, profanity, sentiment), and formatting (punctuation, text formatting, filler words, custom date/phone/email patterns). Billable add-ons increase cost: preview with /transcribe/estimate. See the AsrOptions schema in the OpenAPI spec.

curl -X POST https://www.youtubetranscript.dev/api/v2/transcribe \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video": "dQw4w9WgXcQ",
    "mode": "auto",
    "language": "en",
    "format": { "timestamp": true, "paragraphs": true }
  }'
응답 (200)
{
  "request_id": "req_abc123",
  "status": "completed",
  "data": {
    "video_id": "dQw4w9WgXcQ",
    "video_title": "Example video",
    "transcript": {
      "text": "Welcome to this tutorial...",
      "language": "en",
      "source": "auto",
      "segments": [
        { "text": "Welcome to this tutorial.", "start": 0, "end": 2500 }
      ]
    }
  },
  "credits_used": 1,
  "mode": "auto"
}

인스타그램 릴스 전사

Transcribe an Instagram Reel. Uses the Reel's captions when it has them, otherwise transcribes its audio (about 15 to 20 seconds). The transcript is saved like a YouTube one with video_id instagram_<code>: read it with GET /api/v2/transcripts/{video_id} and file it in folders. Transcribing a Reel you already have is free.

POST/api/v2/social/transcribe1 credit with captions; otherwise 1 credit per 2 minutes of audio (minimum 1). Refunded if it fails.
파라미터
urlstring필수

Instagram Reel or video post link, e.g. https://www.instagram.com/reel/C9xYz12AbCd/

languageISO 639-1

Preferred transcript language.

curl -X POST https://www.youtubetranscript.dev/api/v2/social/transcribe \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://www.instagram.com/reel/C9xYz12AbCd/" }'
응답 (200)
{
  "request_id": "5b0e1c2d-3f4a-4b5c-8d6e-7f8a9b0c1d2e",
  "transcript": {
    "id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f",
    "video_id": "instagram_C9xYz12AbCd",
    "language": "en",
    "source_kind": "auto"
  },
  "credits_used": 1,
  "cached": false
}

비용 예상

Dry-run credit estimate. Returns the ASR base cost plus any add-on surcharge for the requested asr_options without creating a job or charging credits.

POST/api/v2/transcribe/estimate
파라미터
videostring필수

YouTube URL or 11-character video ID.

modeauto | captions_only | human_captions_only | speech_to_text_only

Same values as /transcribe. Use speech_to_text_only (or auto) to preview the ASR cost.

sourceauto | manual | asr

Legacy, still supported: use mode instead. Defaults to asr for cost preview.

asr_optionsobject

Same shape as /transcribe. Add-on charges are prorated by duration.

curl -X POST https://www.youtubetranscript.dev/api/v2/transcribe/estimate \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video": "dQw4w9WgXcQ",
    "mode": "speech_to_text_only",
    "asr_options": {
      "speakerLabels": true,
      "summarization": true,
      "translateTo": "es"
    }
  }'
응답 (200)
{
  "request_id": "req_abc123",
  "video_id": "dQw4w9WgXcQ",
  "source": "asr",
  "mode": "speech_to_text_only",
  "duration_seconds": 213,
  "duration_minutes": 4,
  "max_duration_minutes": 480,
  "exceeds_max_duration": false,
  "base_credits": 3,
  "addon_credits": 2,
  "estimated_credits": 5
}

작업 상태 확인

Poll a single transcription job. Use this for ASR jobs returned from /transcribe. Returns 202 while running and 200 when complete. Completed ASR jobs include asr_intelligence (summary, topics, sentiment, etc.) when those options were enabled. With speaker labels on (asr_options.speakerLabels or speakerId), every segment carries a speaker field ("A", "B", ... or a name or role with speakerId), and so does every word when you add include_words=true. There is no separate speakers or utterances object.

GET/api/v2/jobs/{job_id}
파라미터
job_idpath필수

Identifier returned in the original transcribe response.

include_segmentsboolean

Include segment-level timestamps in the transcript payload.

include_paragraphsboolean

Include paragraph groupings.

include_wordsboolean

Include word-level timestamps (ASR only). Each word carries a speaker field when speaker labels were on.

curl -X GET https://www.youtubetranscript.dev/api/v2/jobs/JOB_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200, speaker labels on)
{
  "request_id": "req_abc123",
  "status": "completed",
  "data": {
    "video_id": "dQw4w9WgXcQ",
    "transcript": {
      "text": "Welcome to this tutorial...",
      "language": "en",
      "source": "asr",
      "segments": [
        { "text": "Welcome to this tutorial.", "start": 0, "end": 2500, "speaker": "A" },
        { "text": "Thanks for having me.", "start": 2600, "end": 4100, "speaker": "B" }
      ]
    }
  },
  "credits_used": 6
}

직접 미디어 업로드

보유한 오디오 또는 동영상 파일을 ASR 파이프라인으로 스크립트화합니다. 업로드 등록, 서명된 URL로 바이트 PUT, 업로드 완료의 세 단계를 거친 뒤 upload_id와 함께 /transcribe를 호출하세요. 결과는 웹훅으로 전달되며 다른 ASR 작업처럼 폴링할 수 있습니다.

파일 업로드

Register an audio/video file upload and get a signed URL. PUT the raw file bytes to signed_url (with the file's Content-Type), finalize via /uploads/{upload_id}/complete, then transcribe with upload_id on /transcribe. Max 2GB and 8 hours per file.

POST/api/v2/uploads
파라미터
filenamestring필수

Original filename. The extension is preserved for content sniffing.

mime_typestring필수

Must start with audio/ or video/ (e.g. audio/mpeg, video/mp4).

size_bytesinteger필수

File size in bytes. Max 2147483648 (2GB).

duration_secinteger필수

Media duration in seconds. Max 28800 (8 hours). Used for the ASR credit estimate.

curl -X POST https://www.youtubetranscript.dev/api/v2/uploads \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "interview.mp3",
    "mime_type": "audio/mpeg",
    "size_bytes": 48211234,
    "duration_sec": 1820
  }'

# Then PUT the raw file bytes to the returned signed_url:
curl -X PUT "SIGNED_URL_FROM_RESPONSE" \
  -H "Content-Type: audio/mpeg" \
  --data-binary @interview.mp3

# Then finalize:
curl -X POST https://www.youtubetranscript.dev/api/v2/uploads/UPLOAD_ID/complete \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "upload_id": "up_a1B2c3D4",
  "bucket": "asr-media",
  "path": "user-uuid/up_a1B2c3D4/interview.mp3",
  "token": "eyJhbGciOiJIUzI1NiJ9...",
  "signed_url": "https://api.youtubetranscript.dev/storage/v1/object/upload/sign/asr-media/...?token=..."
}

업로드 완료

Finalize an upload after the PUT to signed_url succeeds. Verifies the file exists in storage and marks it ready. The upload can then be transcribed by passing upload_id to /transcribe (source="asr", webhook_url required).

POST/api/v2/uploads/{upload_id}/complete
파라미터
upload_idpath필수

Upload id returned by POST /uploads.

curl -X POST https://www.youtubetranscript.dev/api/v2/uploads/up_a1B2c3D4/complete \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "upload_id": "up_a1B2c3D4",
  "status": "uploaded",
  "filename": "interview.mp3",
  "duration_sec": 1820
}

배치 스크립트 생성

한 번의 요청으로 여러 동영상의 스크립트를 생성한 뒤, 폴링하거나 웹훅으로 결과를 받으세요.

여러 동영상 스크립트 생성

Submit up to 3,000 videos in one request. Returns within 2 seconds; poll the returned poll_url or wait for the webhook.

POST/api/v2/batch
파라미터
video_idsstring[]필수

Up to 3,000 IDs depending on plan. Free = 10, Basic = 500, Pro = 1,500, Business = 3,000.

languageISO 639-1

Preferred language for every video.

modeauto | captions_only | human_captions_only | speech_to_text_only

Where the transcript comes from (recommended). auto: captions first, speech-to-text (ASR) only if the video has none. captions_only: any captions, never ASR. human_captions_only: human-made captions only. speech_to_text_only: always transcribe the audio. auto and speech_to_text_only can charge ASR credits. Replaces source + allow_asr; cannot be combined with them. Note: mode=auto is not the same as legacy source=auto (captions only, which is mode=captions_only). For batch, auto and speech_to_text_only require webhook_url. When omitted, your API Dashboard default applies (an ASR default only when webhook_url is set).

sourceauto | manual | asr

Legacy, still supported: use mode instead. Default: auto. source=asr requires webhook_url.

allow_asrboolean

Legacy, still supported: use mode=auto instead. webhook_url is required.

formatobject

{ timestamp, paragraphs, words }: applied to every result.

webhook_urluri

Delivers the completed batch payload. Required for mode=auto or speech_to_text_only (legacy: allow_asr=true or source=asr).

asr_optionsobject

Rich ASR config applied to every video transcribed via ASR (same shape as /transcribe). Billable add-ons apply per video.

curl -X POST https://www.youtubetranscript.dev/api/v2/batch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_ids": ["dQw4w9WgXcQ", "jNQXAC9IVRw"],
    "mode": "auto",
    "webhook_url": "https://your-domain.com/webhook",
    "format": { "timestamp": true }
  }'
응답 (202)
{
  "batch_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "processing",
  "results": [],
  "summary": { "total": 2, "succeeded": 0, "failed": 0, "processing": 2 },
  "poll_url": "https://www.youtubetranscript.dev/api/v2/batch/550e8400-e29b-41d4-a716-446655440000",
  "created_at": "2026-05-15T10:00:00Z"
}

배치 상태 확인

Check the status of a batch. Returns 202 while processing and 200 when results are ready. Stop polling once status is "completed", "partial", or "failed": finished batches never change, and re-fetching one more than 60 times in 24h returns 429 with a Retry-After header.

GET/api/v2/batch/{batch_id}
파라미터
batch_idpath필수

Batch identifier returned from POST /batch.

curl -X GET https://www.youtubetranscript.dev/api/v2/batch/BATCH_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "batch_id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "completed",
  "summary": { "total": 2, "succeeded": 2, "failed": 0, "processing": 0 },
  "results": [
    { "request_id": "req_1", "status": "completed", "data": { "video_id": "dQw4w9WgXcQ" } },
    { "request_id": "req_2", "status": "completed", "data": { "video_id": "jNQXAC9IVRw" } }
  ],
  "credits_used": 2,
  "webhook_delivered": true,
  "completed_at": "2026-05-15T10:04:00Z"
}

스크립트 및 작업

저장된 스크립트를 조회, 가져오기, 번역, 삭제하고 비동기 작업 목록을 확인합니다. 모든 엔드포인트는 동일한 API 키 인증을 사용합니다.

작업 목록

List your transcription jobs, newest first. Filter by status and paginate. Use the returned job_id with GET /api/v2/jobs/{job_id} to fetch a transcript.

GET/api/v2/jobs
파라미터
pagequery

Page number (default 1).

limitquery

Items per page (default 50, max 100).

statusquery

completed | processing | failed | requires_asr_confirmation.

curl "https://www.youtubetranscript.dev/api/v2/jobs?status=processing&limit=25" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "jobs": [
    {
      "job_id": "9c2...",
      "video_id": "dQw4w9WgXcQ",
      "video_title": "Example video",
      "language": "en",
      "source": "asr",
      "status": "processing",
      "error": null,
      "credits_used": 0,
      "created_at": "2026-07-06T12:00:00Z",
      "started_at": "2026-07-06T12:00:01Z",
      "completed_at": null
    }
  ],
  "count": 1,
  "pagination": { "page": 1, "limit": 25, "total": 1, "totalPages": 1, "hasMore": false }
}

스크립트 목록

List stored transcripts with search, status, language, and date filters. Metadata only (no full text) unless include_segments=true.

GET/api/v2/transcripts
파라미터
pagequery

Page number (default 1).

limitquery

Items per page (default 50, max 100).

searchquery

Match video id, title, or transcript text.

statusquery

Filter by status; omit for succeeded.

languagequery

Filter by language code.

date_fromquery

ISO date-time lower bound.

date_toquery

ISO date-time upper bound.

include_segmentsquery

Include segments in each item.

curl "https://www.youtubetranscript.dev/api/v2/transcripts?page=1&limit=50&status=succeeded" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "history": [
    {
      "id": "b1f...",
      "video_id": "dQw4w9WgXcQ",
      "video_title": "Example video",
      "language": "en",
      "source_kind": "auto",
      "status": "succeeded",
      "created_at": "2026-07-06T12:00:00Z",
      "word_count": 1234,
      "segment_count": 88,
      "credits_used": 1
    }
  ],
  "count": 1,
  "pagination": { "page": 1, "limit": 50, "total": 1, "totalPages": 1, "hasMore": false }
}

스크립트 가져오기

Fetch the best owned transcript for a video, including asr_intelligence (summary, topics, sentiment, etc.), plus summary and mind_map when generated.

GET/api/v2/transcripts/{video_id}
파라미터
video_idpath필수

YouTube 11-character video ID.

idquery

Specific transcript/job id.

languagequery

Preferred language version.

sourcequery

auto | manual | asr.

include_timestampsquery

Include segments (default true).

curl "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ?language=en" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "id": "b1f...",
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "text": "Welcome to this tutorial...",
  "segments": [{ "text": "Welcome to this tutorial.", "start": 0, "end": 2500 }],
  "has_timestamps": true,
  "source_kind": "asr",
  "video_title": "Example video",
  "summary": null,
  "mind_map": null,
  "asr_intelligence": {
    "summary": "A short overview of the video...",
    "topics": [{ "text": "Technology", "relevance": 0.92 }],
    "sentiment": [{ "text": "Great tutorial", "sentiment": "POSITIVE" }]
  }
}

주제 및 키워드 가져오기

AI key moments, themes & keywords for a stored transcript: a short TL;DR, the key moments worth finding again (each a short label plus the exact quote, with where it starts and ends), its main themes, and each keyword with the timestamps where it's said. 1 credit per transcript, charged once: calling it again (or GET) is free. Waits up to ~25s; a 202 "processing" means it's paid for and still running, so poll GET. If detection fails the credit is refunded. Transcripts too short to analyse return empty themes for 0 credits. 402 without enough credits.

POST/api/v2/transcripts/{video_id}/themes
파라미터
video_idpath필수

YouTube 11-character video ID of a transcript you own.

idquery

Specific transcript/job id.

languagequery

Which language version to analyse.

sourcequery

auto | manual | asr.

curl -X POST "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ/themes?language=en" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "status": "completed",
  "credits_used": 1,
  "credits_remaining": 41,
  "tldr": "A promise of lifelong loyalty, sung as a list of things he'll never do.",
  "moments": [
    {
      "id": "m1",
      "theme_id": "t1",
      "label": "The six promises of the chorus",
      "quote": "Never gonna give you up, never gonna let you down",
      "color_hex": "#0d9488",
      "start": 43000,
      "end": 47500,
      "segment_start": 4,
      "segment_end": 5
    }
  ],
  "themes": [
    {
      "id": "t1",
      "name": "Commitment",
      "summary": "Promises never to leave or let the listener down.",
      "color": "teal",
      "color_hex": "#0d9488",
      "share": 0.62,
      "mention_count": 18,
      "moment_count": 3,
      "keywords": [
        {
          "id": "k1",
          "term": "never gonna give you up",
          "aliases": [],
          "definition": "The song's central promise.",
          "mention_count": 6,
          "mentions": [{ "segment_index": 4, "start": 43000 }]
        }
      ]
    }
  ]
}

잠금 해제된 주제 읽기

Read key moments, themes & keywords you've already unlocked. Never charges and never starts the AI: returns status "locked" (with credits_required) until you POST, then "completed" with the same body as POST, or 202 "processing" while detection is still running.

GET/api/v2/transcripts/{video_id}/themes
파라미터
video_idpath필수

YouTube 11-character video ID of a transcript you own.

idquery

Specific transcript/job id.

languagequery

Which language version to analyse.

sourcequery

auto | manual | asr.

curl "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ/themes?language=en" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200, not unlocked yet)
{
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "status": "locked",
  "credits_required": 1
}

스크립트 번역

Translate an owned transcript into a target language using YouTube captions or the AI provider. Returns free if you already own the translation.

POST/api/v2/transcripts/{video_id}/translate
파라미터
video_idpath필수

YouTube 11-character video ID.

target_languageISO 639-1필수

Language to translate into.

source_languageISO 639-1

Source transcript language to translate from.

providerai | youtube

Translation provider.

allow_ai_fallbackboolean

Fall back to AI when YouTube has no translation.

curl -X POST "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ/translate" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "target_language": "es", "provider": "ai" }'
응답 (200)
{
  "success": true,
  "message": "Translation completed",
  "language": "es",
  "credits_used": 4,
  "provider_used": "ai"
}

사용 가능한 언어

List the languages you already own for a video plus the YouTube translation targets available for it.

GET/api/v2/transcripts/{video_id}/languages
파라미터
video_idpath필수

YouTube 11-character video ID.

include_youtube_defaultquery

Include YouTube translation targets (default true).

curl "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ/languages" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "video_id": "dQw4w9WgXcQ",
  "languages": ["en", "es"],
  "youtube_translation_languages": ["fr", "de", "ja"]
}

스크립트 삭제

Delete owned transcript(s) for a video. Optional language/source query params narrow the deletion; otherwise every language/source is removed. Also deletes bulk by id via POST /api/v2/transcripts/bulk-delete.

DELETE/api/v2/transcripts/{video_id}
파라미터
video_idpath필수

YouTube 11-character video ID.

languagequery

Only delete this language.

sourcequery

Only delete this source (auto | manual | asr).

curl -X DELETE "https://www.youtubetranscript.dev/api/v2/transcripts/dQw4w9WgXcQ" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "success": true,
  "deleted": 2,
  "message": "Successfully deleted 2 transcripts"
}

폴더

스크립트를 추출한 동영상을 태그처럼 작동하는 단일 단계 폴더로 정리하세요. 동영상 하나를 여러 폴더에 넣을 수 있습니다. 모든 계정에서 무료이며 크레딧이 들지 않습니다. 이미 만든 결과물과 함께 동영상 목록을 가져오고 폴더별로 필터링할 수 있습니다.

폴더 목록

List your folders, alphabetically, with how many videos each holds. Folders are flat and work like tags: one video can be in many folders.

GET/api/v2/foldersFree: no credits
curl "https://www.youtubetranscript.dev/api/v2/folders" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "folders": [
    {
      "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
      "name": "Competitor research",
      "video_count": 12,
      "created_at": "2026-10-29T09:14:02Z",
      "updated_at": "2026-10-29T09:14:02Z"
    }
  ]
}

폴더 만들기

Create a folder. Names are unique per account, ignoring case (409 if you already have one with that name). Up to 200 folders.

POST/api/v2/foldersFree: no credits
파라미터
namestring필수

1 to 80 characters.

curl -X POST https://www.youtubetranscript.dev/api/v2/folders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Competitor research" }'
응답 (201)
{
  "folder": {
    "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "name": "Competitor research",
    "video_count": 0,
    "created_at": "2026-10-29T09:14:02Z",
    "updated_at": "2026-10-29T09:14:02Z"
  }
}

폴더 이름 바꾸기

Rename a folder. GET the same path returns one folder.

PATCH/api/v2/folders/{folder_id}Free: no credits
파라미터
folder_idpath필수

The folder's id.

namestring필수

1 to 80 characters.

curl -X PATCH https://www.youtubetranscript.dev/api/v2/folders/{folder_id} \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Competitors 2026" }'
응답 (200)
{
  "folder": { "id": "7c9e6679-...", "name": "Competitors 2026", "video_count": 12, "created_at": "...", "updated_at": "..." }
}

폴더 삭제

Delete a folder. Only the folder goes: its videos, transcripts and outputs stay in your account.

DELETE/api/v2/folders/{folder_id}Free: no credits
파라미터
folder_idpath필수

The folder's id.

curl -X DELETE https://www.youtubetranscript.dev/api/v2/folders/{folder_id} \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{ "deleted": true }

폴더에 동영상 추가

Add videos you've transcribed to a folder. Videos already in it are skipped; ids you have no transcript for come back in not_found. Every language and output of a video comes with it.

POST/api/v2/folders/{folder_id}/videosFree: no credits
파라미터
folder_idpath필수

The folder's id.

video_idsstring[]필수

Up to 100 video ids: YouTube ids, upload ids (upl_...) or Instagram ids (instagram_...).

curl -X POST https://www.youtubetranscript.dev/api/v2/folders/{folder_id}/videos \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "video_ids": ["dQw4w9WgXcQ", "jNQXAC9IVRw"] }'
응답 (200)
{
  "added": ["dQw4w9WgXcQ"],
  "already_in_folder": ["jNQXAC9IVRw"],
  "not_found": []
}

폴더에서 동영상 제거

Take videos out of a folder. Their transcripts are not touched. GET the same path lists the folder's videos, like GET /api/v2/videos?folder_id=.

DELETE/api/v2/folders/{folder_id}/videosFree: no credits
파라미터
folder_idpath필수

The folder's id.

video_idsstring[]필수

Up to 100 video ids.

curl -X DELETE https://www.youtubetranscript.dev/api/v2/folders/{folder_id}/videos \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "video_ids": ["dQw4w9WgXcQ"] }'
응답 (200)
{ "removed": ["dQw4w9WgXcQ"] }

내 동영상 목록

List your videos, one entry per video (its newest transcript), newest first, with the folders it's in and the outputs you've already made (summary, themes, mind_map, flashcards, notes, quiz, case_study), each with its languages.

GET/api/v2/videosFree: no credits
파라미터
folder_idquery

Only this folder's videos.

unfiledquery

true: only videos in no folder.

channelquery

Only this channel's videos (a channel_name from GET /api/v2/videos/channels).

sortquery

recent (default), oldest, longest, shortest or title.

searchquery

Title contains, or an exact video id.

pagequery

1-based. Default 1.

limitquery

1 to 100. Default 50.

# Every video, newest first
curl "https://www.youtubetranscript.dev/api/v2/videos?limit=50" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Only one folder's videos
curl "https://www.youtubetranscript.dev/api/v2/videos?folder_id={folder_id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

# One channel's videos, longest first
curl "https://www.youtubetranscript.dev/api/v2/videos?channel=TED&sort=longest" \
  -H "Authorization: Bearer YOUR_API_KEY"

# Videos that aren't in any folder yet
curl "https://www.youtubetranscript.dev/api/v2/videos?unfiled=true" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "videos": [
    {
      "video_id": "dQw4w9WgXcQ",
      "transcript": { "id": "0b6f...", "language": "en", "source_kind": "manual" },
      "title": "Example video",
      "duration_seconds": 212,
      "channel_name": "Example Channel",
      "last_transcribed_at": "2026-10-28T18:02:11Z",
      "folder_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"],
      "outputs": {
        "summary": ["en"],
        "flashcards": ["en"],
        "mind_map": ["en", "es"]
      }
    }
  ],
  "pagination": { "page": 1, "limit": 50, "total": 1, "total_pages": 1, "has_more": false }
}

내 채널 목록

The channels your videos come from, most videos first, for filtering GET /api/v2/videos?channel=.

GET/api/v2/videos/channelsFree: no credits
curl "https://www.youtubetranscript.dev/api/v2/videos/channels" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "channels": [
    { "channel_name": "TED", "video_count": 14 },
    { "channel_name": "Starter Story", "video_count": 9 }
  ]
}

동영상의 폴더 설정

Put one video in exactly these folders, adding and removing as needed ([] takes it out of all of them). GET the same path returns its folder_ids.

PUT/api/v2/videos/{video_id}/foldersFree: no credits
파라미터
video_idpath필수

A video you have a transcript of.

folder_idsstring[]필수

Your folder ids.

curl -X PUT https://www.youtubetranscript.dev/api/v2/videos/dQw4w9WgXcQ/folders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "folder_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"] }'
응답 (200)
{
  "video_id": "dQw4w9WgXcQ",
  "folder_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]
}

폴더에 맞는 영상 추천

Videos you've transcribed that look like they belong in this folder, picked by AI from their titles (up to 20, best first). Add them with POST /api/v2/folders/{folder_id}/videos.

GET/api/v2/folders/{folder_id}/suggestionsFree: no credits
파라미터
folder_idpath필수

One of your folders.

curl "https://www.youtubetranscript.dev/api/v2/folders/7c9e6679-7425-40de-944b-e07fc1f90ae7/suggestions" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "folder_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "videos": [
    { "video_id": "dQw4w9WgXcQ", "title": "Keyword research for beginners", "channel_name": "Backlinko", "duration_seconds": 912 }
  ]
}

영상에 맞는 폴더 추천

Which of your folders a video fits (up to 3), picked by AI from its title, and a name for a new folder when none fits well (new_folder, or null).

GET/api/v2/videos/{video_id}/folder-suggestionsFree: no credits
파라미터
video_idpath필수

A video you have a transcript of.

curl "https://www.youtubetranscript.dev/api/v2/videos/dQw4w9WgXcQ/folder-suggestions" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "video_id": "dQw4w9WgXcQ",
  "folders": [{ "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "name": "SEO Hacks" }],
  "new_folder": null
}

재생목록

재생목록을 동영상 ID로 변환하고 /api/v2/batch로 스크립트를 생성한 뒤, 재생목록 배치와 기록을 확인하세요.

재생목록 동영상 목록

Resolve a YouTube playlist by URL or ID into its video list (metadata only). Pair the returned video_id values with /api/v2/batch to transcribe them.

POST/api/v2/playlists/resolve유료 플랜
파라미터
playlist_urlstring

Playlist URL. One of playlist_url or playlist_id is required.

playlist_idstring

Playlist ID (the list= value).

limitinteger

Max videos returned (1-100).

curl -X POST https://www.youtubetranscript.dev/api/v2/playlists/resolve \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "playlist_url": "https://www.youtube.com/playlist?list=PLxxxx", "limit": 100 }'
응답 (200)
{
  "playlist_id": "PLxxxx",
  "title": "My playlist",
  "total": 42,
  "truncated": false,
  "items": [
    { "video_id": "dQw4w9WgXcQ", "title": "Example video" }
  ]
}

재생목록 작업 상태

Fetch a playlist batch and per-video transcription job status. For overall batch progress, poll GET /api/v2/batch/{batch_id}.

GET/api/v2/playlists/{playlist_id}
파라미터
playlist_idpath필수

Batch ID returned from /playlists/resolve.

curl "https://www.youtubetranscript.dev/api/v2/playlists/{playlist_batch_id}" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "playlist": { "id": "3f1...", "playlist_id": "PLxxxx", "title": "My playlist" },
  "videos": [
    { "video_id": "dQw4w9WgXcQ", "video_title": "Example video", "status": "succeeded" }
  ]
}

최근 재생목록 작업

List recent playlist batches for the authenticated user.

GET/api/v2/playlists/history
curl "https://www.youtubetranscript.dev/api/v2/playlists/history" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "history": [
    { "id": "3f1...", "playlist_id": "PLxxxx", "title": "My playlist", "total_videos": 42 }
  ],
  "count": 1
}

채널

채널 스크립트 생성 흐름:1. POST /api/v2/channels/resolve: 채널의 업로드 동영상을 가져옵니다(동영상 메타데이터만).2. POST /api/v2/batch: 반환된 video_id 값을 보내 스크립트 생성을 시작합니다. 완료 시 결과를 받으려면 webhook_url을 사용하세요.3. GET /api/v2/batch/{batch_id}: 배치를 폴링해 전체 진행 상황과 집계 결과를 확인합니다.4. GET /api/v2/channels/{channel_id}: 동영상별 작업 상태가 포함된 채널 배치를 가져옵니다. /channels/history는 지난 채널 배치 목록을 반환합니다.

채널 동영상 목록

Fetch the uploads of a YouTube channel by URL, channel ID, or @handle. Returns video metadata only: pair the returned video_id values with /api/v2/batch to transcribe them.

POST/api/v2/channels/resolve유료 플랜
파라미터
channel_urlstring필수

YouTube channel URL, channel ID, or @handle. One of channel_url, channel_id, or handle must be provided. Handles are the public ID without the @ (for https://www.youtube.com/@jawed, the ID is jawed).

limitinteger

Maximum uploads returned. Defaults to the plan maximum.

Per-request cap: Basic 500 videos · Pro 1,500 videos · Business 3,000 videos. Monthly job cap: Basic 3 · Pro 8 · Business unlimited.

요청 한도

Plan-based: Free 1 req/s · Basic 25 req/s · Pro 50 req/s · Business 100 req/s. Exceeding the limit returns 429 with a Retry-After header.

curl -X POST https://www.youtubetranscript.dev/api/v2/channels/resolve \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "handle": "@youtube",
    "limit": 50
  }'
응답 (200)
{
  "channel_id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
  "channel_title": "YouTube",
  "subscriber_count": 42000000,
  "video_count": 1200,
  "total": 1,
  "truncated": false,
  "items": [
    {
      "video_id": "dQw4w9WgXcQ",
      "title": "Latest upload",
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "published_at": "2026-05-01T12:00:00Z",
      "duration_seconds": 420
    }
  ]
}

채널 작업 상태

Fetch a channel batch and the per-video transcription job status. For overall batch status (counts + progress), poll GET /api/v2/batch/{batch_id} instead: use this endpoint when you also need each video's individual job state.

GET/api/v2/channels/{channel_id}
파라미터
channel_idpath필수

Batch ID returned from /channels/resolve.

curl -X GET https://www.youtubetranscript.dev/api/v2/channels/CHANNEL_BATCH_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "channel": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "channel_id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
    "channel_title": "YouTube",
    "total_videos": 2,
    "completed_count": 1,
    "failed_count": 0,
    "status": "processing",
    "created_at": "2026-05-15T10:00:00Z"
  },
  "videos": [
    {
      "id": "job_123",
      "video_id": "dQw4w9WgXcQ",
      "video_title": "Latest upload",
      "status": "succeeded",
      "created_at": "2026-05-15T10:00:00Z",
      "finished_at": "2026-05-15T10:00:10Z"
    }
  ]
}

최근 채널 작업

List recent channel batches for the authenticated user.

GET/api/v2/channels/history
파라미터
limitquery

Max items (default 50, max 100).

curl -X GET "https://www.youtubetranscript.dev/api/v2/channels/history?limit=50" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "history": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "channel_id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "channel_title": "YouTube",
      "total_videos": 25,
      "completed_count": 25,
      "failed_count": 0,
      "status": "completed",
      "created_at": "2026-05-15T10:00:00Z",
      "completed_at": "2026-05-15T10:12:00Z"
    }
  ],
  "count": 1
}

api-docs.docs.nav.endpoints.recommendations-videos

Newest uploads from the channels you transcribe most, excluding videos you have already transcribed. Results are interleaved across channels, newest first. Free: no credits are charged. Pass the returned url or video_id to /api/v2/transcribe or /api/v2/batch.

GET/api/v2/recommendations/videos
파라미터
limitquery

Max videos returned (default 6, max 30).

channelsquery

How many of your top channels to draw from (default 3, max 10).

curl -X GET "https://www.youtubetranscript.dev/api/v2/recommendations/videos?limit=6" \
  -H "Authorization: Bearer YOUR_API_KEY"
응답 (200)
{
  "recommendations": [
    {
      "video_id": "dQw4w9WgXcQ",
      "title": "Latest upload",
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
      "thumbnail_url": "https://i.ytimg.com/vi/dQw4w9WgXcQ/mqdefault.jpg",
      "published_at": "2026-10-17T15:00:00Z",
      "duration_seconds": 1089,
      "channel_id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "channel_title": "YouTube"
    }
  ],
  "channels": [
    {
      "channel_id": "UC_x5XG1OV2P6uZZ5FSM9Ttw",
      "channel_title": "YouTube",
      "transcribed_count": 12
    }
  ],
  "count": 1
}

통합

공식 SDK, Claude와 Cursor용 MCP 서버, 커스텀 GPT, 그리고 Make와 n8n용 기본 제공 템플릿을 제공합니다.

MCP serverClaude · Cursor
저장소

YouTube Transcript MCP 서버를 Claude Desktop, Cursor 또는 MCP 호환 클라이언트에 추가하세요. 동영상 스크립트 생성, 기존 스크립트 가져오기, 사용량 확인 도구가 추가됩니다.

설치 및 구성
claude mcp add --transport http youtubetranscript https://mcp.youtubetranscript.dev --header "x-api-token: YOUR_API_KEY"
Node SDKnpm
npm

완벽한 TypeScript 타입, 재시도, 페이지네이션 헬퍼, 웹훅 서명 검증을 지원합니다.

설치 및 사용
npm install youtube-transcript-api
Python SDKPyPI
PyPI

동기 및 비동기 클라이언트, 타입 스텁, 배치 및 웹훅 흐름용 헬퍼를 제공합니다.

설치 및 사용
pip install youtubetranscriptdevapi
Custom GPTChatGPT
ChatGPT에서 열기

커스텀 GPT를 ChatGPT에 추가해 자연어로 YouTube 동영상을 요약, 인용, 번역하거나 질문하세요. 내부적으로 /api/v2/gpt/*를 사용합니다.

  • · OAuth 로그인: 채팅에 API 키 불필요
  • · 자막이 없으면 ASR로 대체
  • · 타임스탬프와 출처 링크를 포함한 인용
  • · 모든 계정에 무료 체험 제공
Make.com & n8n노코드
템플릿 둘러보기

템플릿을 가져오거나 스니펫을 복사해 기존 자동화에 스크립트 생성을 추가하세요: Notion, Sheets, Slack, Airtable, Zapier 방식의 흐름 등.

Make.com 모듈
Module: HTTP > Make a request
- URL: https://www.youtubetranscript.dev/api/v2/transcribe
- Method: POST
- Headers:
    Authorization: Bearer {{connection.api_key}}
    Content-Type: application/json
- Body type: Raw / JSON
- Request content:
    {
      "video": "{{1.video_url}}",
      "format": { "timestamp": true }
    }
n8n HTTP 노드
{
  "name": "Transcribe Video",
  "type": "n8n-nodes-base.httpRequest",
  "parameters": {
    "method": "POST",
    "url": "https://www.youtubetranscript.dev/api/v2/transcribe",
    "authentication": "genericCredentialType",
    "genericAuthType": "httpHeaderAuth",
    "sendBody": true,
    "specifyBody": "json",
    "jsonBody": "={ \"video\": $json.video_url }"
  }
}
Postman / OpenAPI원클릭
Postman 컬렉션

OpenAPI 명세를 Postman, Insomnia 또는 OpenAPI 3을 지원하는 모든 도구로 가져오세요.

오류

오류 발생 시 code와 message가 포함된 JSON 본문이 반환됩니다. HTTP 상태 코드는 오류 유형을 나타냅니다.

HTTP 상태오류 코드설명
400invalid_requestInvalid JSON or missing required fields
401invalid_api_keyMissing or invalid API key
402payment_requiredInsufficient credits
404no_captionsNo captions available and ASR not used
429rate_limit_exceededToo many requests, check Retry-After
500internal_errorServer error, retry with backoff

요청 한도 및 할당량

플랜별 지속 요청 수와 배치 크기 상한입니다. 한도를 초과하는 버스트 요청에는 Retry-After 헤더와 함께 429가 반환됩니다.

플랜요청 수배치 크기
Free1 req/s10 videos
Basic25 req/s500 videos
Pro50 req/s1,500 videos
Business100 req/s3,000 videos

지원

출시에 도움이 필요하신가요? 연락 주세요. 보통 몇 시간 안에 답변드립니다.

API 문서 - YouTube Transcript API