API key
Riferimento API

Trascrizioni V2

V2 è il modello di trascrizione semplificato e di proprietà dell'utente. Punta su cache hit rapidi, risposte coerenti e nessuna traduzione a sorpresa, a meno che tu non richieda una lingua.

Novità: un solo parametro mode per ogni fonte di trascrizione

Scegli auto, captions_only, human_captions_only, speech_to_text_only invece di combinare source e allow_asr. Le richieste esistenti continuano a funzionare esattamente come prima. Scopri come funziona

Specifica OpenAPI

Scarica lo YAML per importarlo in Postman o Insomnia, generare client o incollarlo in ChatGPT / Claude.

OpenAPI 3.0: V2 (consigliata)

Trascrivi un singolo video

La via più rapida per un video alla volta. Le trascrizioni basate sui sottotitoli arrivano in pochi secondi; l'ASR gira in modo asincrono e si interroga tramite /api/v2/jobs/{job_id}.

Trascrivi un video

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
Parametri
videostringobbligatorio

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 }
  }'
Risposta (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"
}

Trascrivere un Reel di Instagram

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.
Parametri
urlstringobbligatorio

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/" }'
Risposta (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
}

Stima il costo

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
Parametri
videostringobbligatorio

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"
    }
  }'
Risposta (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
}

Stato del job

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}
Parametri
job_idpathobbligatorio

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"
Risposta (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
}

Carica i tuoi file multimediali

Trascrivi i tuoi file audio o video tramite la pipeline ASR. Tre passaggi: registra l'upload, invia i byte con PUT all'URL firmato, finalizza: poi chiama /transcribe con upload_id. I risultati arrivano al tuo webhook e si interrogano come qualsiasi job ASR.

Carica un file

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
Parametri
filenamestringobbligatorio

Original filename. The extension is preserved for content sniffing.

mime_typestringobbligatorio

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

size_bytesintegerobbligatorio

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

duration_secintegerobbligatorio

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"
Risposta (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=..."
}

Completa un caricamento

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
Parametri
upload_idpathobbligatorio

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"
Risposta (200)
{
  "upload_id": "up_a1B2c3D4",
  "status": "uploaded",
  "filename": "interview.mp3",
  "duration_sec": 1820
}

Trascrizione in batch

Trascrivi molti video con una sola richiesta, poi interroga lo stato o ricevi i risultati via webhook.

Trascrivi molti video

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
Parametri
video_idsstring[]obbligatorio

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 }
  }'
Risposta (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"
}

Stato del batch

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}
Parametri
batch_idpathobbligatorio

Batch identifier returned from POST /batch.

curl -X GET https://www.youtubetranscript.dev/api/v2/batch/BATCH_ID \
  -H "Authorization: Bearer YOUR_API_KEY"
Risposta (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"
}

Trascrizioni e job

Elenca, recupera, traduci ed elimina le trascrizioni salvate, ed elenca i job asincroni. Tutti gli endpoint accettano la stessa autenticazione con API key.

Elenca i job

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
Parametri
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"
Risposta (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 }
}

Elenca le trascrizioni

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

GET/api/v2/transcripts
Parametri
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"
Risposta (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 }
}

Ottieni una trascrizione

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}
Parametri
video_idpathobbligatorio

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"
Risposta (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" }]
  }
}

Ottieni temi e parole chiave

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
Parametri
video_idpathobbligatorio

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"
Risposta (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 }]
        }
      ]
    }
  ]
}

Leggi i temi sbloccati

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
Parametri
video_idpathobbligatorio

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"
Risposta (200, not unlocked yet)
{
  "video_id": "dQw4w9WgXcQ",
  "language": "en",
  "status": "locked",
  "credits_required": 1
}

Traduci una trascrizione

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
Parametri
video_idpathobbligatorio

YouTube 11-character video ID.

target_languageISO 639-1obbligatorio

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" }'
Risposta (200)
{
  "success": true,
  "message": "Translation completed",
  "language": "es",
  "credits_used": 4,
  "provider_used": "ai"
}

Lingue disponibili

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

GET/api/v2/transcripts/{video_id}/languages
Parametri
video_idpathobbligatorio

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"
Risposta (200)
{
  "video_id": "dQw4w9WgXcQ",
  "languages": ["en", "es"],
  "youtube_translation_languages": ["fr", "de", "ja"]
}

Elimina una trascrizione

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}
Parametri
video_idpathobbligatorio

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"
Risposta (200)
{
  "success": true,
  "deleted": 2,
  "message": "Successfully deleted 2 transcripts"
}

Cartelle

Organizza i tuoi video trascritti in cartelle piatte che funzionano come tag: un video può stare in più cartelle. Gratis per tutti gli account, senza crediti. Elenca i tuoi video con i contenuti già generati, filtrati per cartella.

Elenca le cartelle

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"
Risposta (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"
    }
  ]
}

Crea una cartella

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
Parametri
namestringobbligatorio

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" }'
Risposta (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"
  }
}

Rinomina una cartella

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

PATCH/api/v2/folders/{folder_id}Free: no credits
Parametri
folder_idpathobbligatorio

The folder's id.

namestringobbligatorio

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" }'
Risposta (200)
{
  "folder": { "id": "7c9e6679-...", "name": "Competitors 2026", "video_count": 12, "created_at": "...", "updated_at": "..." }
}

Elimina una cartella

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
Parametri
folder_idpathobbligatorio

The folder's id.

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

Aggiungi video a una cartella

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
Parametri
folder_idpathobbligatorio

The folder's id.

video_idsstring[]obbligatorio

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"] }'
Risposta (200)
{
  "added": ["dQw4w9WgXcQ"],
  "already_in_folder": ["jNQXAC9IVRw"],
  "not_found": []
}

Rimuovi video da una cartella

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
Parametri
folder_idpathobbligatorio

The folder's id.

video_idsstring[]obbligatorio

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"] }'
Risposta (200)
{ "removed": ["dQw4w9WgXcQ"] }

Elenca i tuoi video

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
Parametri
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"
Risposta (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 }
}

Elenca i tuoi canali

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"
Risposta (200)
{
  "channels": [
    { "channel_name": "TED", "video_count": 14 },
    { "channel_name": "Starter Story", "video_count": 9 }
  ]
}

Imposta le cartelle di un video

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
Parametri
video_idpathobbligatorio

A video you have a transcript of.

folder_idsstring[]obbligatorio

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"] }'
Risposta (200)
{
  "video_id": "dQw4w9WgXcQ",
  "folder_ids": ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]
}

Suggerire video per una cartella

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
Parametri
folder_idpathobbligatorio

One of your folders.

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

Suggerire cartelle per un video

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
Parametri
video_idpathobbligatorio

A video you have a transcript of.

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

Playlist

Risolvi una playlist in ID video, trascrivili con /api/v2/batch, poi consulta il batch della playlist e la cronologia.

Elenca i video di una playlist

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/resolvePiani a pagamento
Parametri
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 }'
Risposta (200)
{
  "playlist_id": "PLxxxx",
  "title": "My playlist",
  "total": 42,
  "truncated": false,
  "items": [
    { "video_id": "dQw4w9WgXcQ", "title": "Example video" }
  ]
}

Stato dei job della playlist

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}
Parametri
playlist_idpathobbligatorio

Batch ID returned from /playlists/resolve.

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

Job di playlist recenti

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"
Risposta (200)
{
  "history": [
    { "id": "3f1...", "playlist_id": "PLxxxx", "title": "My playlist", "total_videos": 42 }
  ],
  "count": 1
}

Canali

Flusso di trascrizione di un canale:1. POST /api/v2/channels/resolve: recupera i video caricati dal canale (solo metadati).2. POST /api/v2/batch: invia i valori video_id restituiti per avviare la trascrizione. Usa un webhook_url per ricevere i risultati al termine.3. GET /api/v2/batch/{batch_id}: interroga il batch per l'avanzamento complessivo e i risultati aggregati.4. GET /api/v2/channels/{channel_id}: recupera un batch del canale con lo stato dei job per ogni video; /channels/history elenca i batch dei canali precedenti.

Elenca i video di un canale

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/resolvePiani a pagamento
Parametri
channel_urlstringobbligatorio

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.

Rate limit

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
  }'
Risposta (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
    }
  ]
}

Stato dei job del canale

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}
Parametri
channel_idpathobbligatorio

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"
Risposta (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"
    }
  ]
}

Job di canale recenti

List recent channel batches for the authenticated user.

GET/api/v2/channels/history
Parametri
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"
Risposta (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
Parametri
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"
Risposta (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
}

Integrazioni

SDK ufficiali, un server MCP per Claude e Cursor, un GPT personalizzato e template pronti per Make e n8n.

MCP serverClaude · Cursor
Repo

Aggiungi il server MCP di YouTube Transcript a Claude Desktop, Cursor o qualsiasi client compatibile con MCP. Offre strumenti per trascrivere video, recuperare trascrizioni esistenti e controllare l'utilizzo.

Installa e configura
claude mcp add --transport http youtubetranscript https://mcp.youtubetranscript.dev --header "x-api-token: YOUR_API_KEY"
Node SDKnpm
npm

Tipi TypeScript di prima classe, retry, helper per la paginazione e verifica della firma dei webhook.

Installa e usa
npm install youtube-transcript-api
Python SDKPyPI
PyPI

Client sincroni e asincroni, type stub e helper per i flussi batch e webhook.

Installa e usa
pip install youtubetranscriptdevapi
Custom GPTChatGPT
Apri in ChatGPT

Aggiungi il nostro GPT personalizzato a ChatGPT per riassumere, citare, tradurre o interrogare qualsiasi video di YouTube in linguaggio naturale. Sotto il cofano usa /api/v2/gpt/*.

  • · Accesso OAuth: nessuna API key in chat
  • · Fallback ASR se mancano i sottotitoli
  • · Citazioni con timestamp e link alla fonte
  • · Prova gratuita su ogni account
Make.com & n8nNo-code
Sfoglia i template

Importa il template (o copia lo snippet) per aggiungere la trascrizione alle tue automazioni: Notion, Sheets, Slack, Airtable, flussi in stile Zapier.

Modulo 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 }
    }
Nodo HTTP n8n
{
  "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 / OpenAPIUn clic
Collection Postman

Importa la specifica OpenAPI in Postman, Insomnia o qualsiasi strumento che supporti OpenAPI 3.

Errori

Gli errori restituiscono un body JSON con code e message. Lo stato HTTP indica la categoria.

Stato HTTPCodice di erroreDescrizione
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

Rate limit e quote

Limiti per piano su richieste continue e dimensioni dei batch. Superando il limite ricevi un 429 con header Retry-After.

PianoRichiesteDimensione batch
Free1 req/s10 videos
Basic25 req/s500 videos
Pro50 req/s1,500 videos
Business100 req/s3,000 videos

Supporto

Ti serve una mano? Scrivici: di solito rispondiamo entro poche ore.

Documentazione API - YouTube Transcript API