Automation integrations
Transcripts are most useful inside a pipeline — summarize new uploads to Slack, archive a channel to Notion, or feed a vector database.
The 30-second version
- n8n — import the VidWords workflow template and set the
Authorization: Basic <your-api-token>header on its HTTP Request node. - Make.com — import the blueprint, paste your token into the HTTP module, and map
results[].textto whatever comes next. - Anything else —
POST https://vidwords.com/api/transcriptswith a JSON body of{"ids": […], "lang": "en"}. Zapier webhooks, GitHub Actions, and cron jobs all qualify. - Limits to design around: up to 50 video ids per request, 5 requests every 10 seconds per token, and 1 credit per transcript actually delivered (failed lookups are free).
- Your API token is on your profile page and is included on every plan, Free included — but you must confirm your email before the first call will work.
Before you build: the token, and the one gotcha
Every integration on this page authenticates identically — an Authorization: Basic <your-api-token> header on each request, alongside Content-Type: application/json. There's no OAuth dance and no Google API key involved: the token on your profile page is the whole of it, and one is included on every plan, Free included.
The gotcha worth knowing before you spend an hour debugging a scenario: confirm your email first. Until you click the verification link, every API call returns 403 with {"error":"email_unverified"}. It's the most common first-call failure on a new account, and from inside n8n or Make it looks indistinguishable from a bad token.
n8n
- Download the VidWords n8n workflow template.
- In n8n: Workflows → Import from file.
- Open the HTTP Request node and set the
Authorization: Basic <your-api-token>header (token on your profile page). - Trigger it on a schedule, a webhook, or an RSS feed of a channel's uploads.
The template is deliberately minimal: a manual trigger, a Set node holding a videoIds array, and an HTTP Request node that POSTs them to /api/transcripts with lang set to en. Swap the manual trigger for whatever should actually start the run, and either edit the array or wire it to an upstream node — everything downstream reads from the same response.
Make.com
- Download the Make blueprint.
- In Make: Create a new scenario → ⋯ → Import blueprint.
- Fill in your API token in the HTTP module, then map the
results[].textfield to any downstream app — Google Docs, Notion, Slack, Airtable.
The blueprint is a single HTTP module pre-configured for a raw JSON POST to /api/transcripts, with response parsing already switched on so the result arrives as structured data rather than a string you'd have to decode. Replace YOUR_API_TOKEN, edit the ids array, then build your trigger and downstream modules around it.
Plain REST (everything else)
Anything that can issue an HTTP POST can use the API directly — Zapier webhooks, GitHub Actions, cron jobs:
curl -X POST https://vidwords.com/api/transcripts \
-H "Authorization: Basic YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": ["jNQXAC9IVRw", "dQw4w9WgXcQ"], "lang": "en"}'
Up to 50 video ids per call, 5 requests / 10 seconds. Full reference with Node and Python examples in the API docs, machine-readable spec at /openapi.json.
What comes back
One entry per video, in the order you sent them, under a top-level results array. Direct API calls also get a creditsRemaining number, so a workflow can watch its own budget:
{
"results": [
{
"id": "jNQXAC9IVRw",
"title": "…",
"author": "…",
"language": "English",
"languageCode": "en",
"isGenerated": false,
"text": "full transcript as one string…",
"segments": [{ "text": "…", "start": 1.36, "duration": 1.68 }]
}
],
"creditsRemaining": 23
}
Two fields do most of the work. text is the whole transcript as one plain string — that's what you map into a document, a Slack message, or an LLM prompt. segments keeps every caption cue with its start and duration in seconds, which is what you want for generating subtitle files, jump-to-timestamp links, or a chunked search index. isGenerated tells you whether you're holding YouTube's automatic captions or a human-authored track — useful when a pipeline should flag or skip the lower-confidence text.
Handling failures without stopping the run
A bad video doesn't fail the request. It comes back as an ordinary entry carrying an error field instead of segments, so one dead link can't sink a batch of fifty. Branch on the code:
- Terminal —
invalid_id,no_transcript,transcripts_disabled,video_unavailable,age_restricted. Retrying won't help; log them and move on. - Retryable —
fetch_failed,ip_blocked,request_blocked,service_paused,internal. Queue these for a later pass instead of treating them as permanent.
Request-level problems arrive as HTTP status codes rather than per-video entries: 400 bad_request for a malformed body or too many ids, 401 unauthorized for a missing or invalid token, 402 insufficient_credits, 403 plan_required when an endpoint needs a higher plan, and 429 rate_limited.
Rate limits, batching, and credits
- 5 requests per 10 seconds per token. A
429carries aRetry-Afterheader in seconds — honour that number rather than backing off blindly. - Up to 50 video ids per request. Batching is a latency optimisation, not a discount: fifty videos in one call costs the same as fifty single calls.
- One credit per transcript actually delivered. Failed lookups cost nothing, and a request that would exceed your remaining credits returns
402while consuming none. - Captionless videos are rescued by speech-to-text on paid plans. That's far more expensive to run, so a fresh transcription costs 3 credits; replaying an already-transcribed video costs the usual 1.
Starting from a channel instead of a list of ids
Most real pipelines start from a creator, not a hand-maintained array. POST /api/channels (Starter and up — 5 channels per request on Starter, 50 on Pro and Advanced) accepts @handles, channel URLs, or UC… ids and returns the channelId, the channel title, and the upload list newest first, capped at 500 videos with truncated: true when that cap was hit. Listing is free; you only spend credits once you post those video ids to /api/transcripts. The browser-and-API walkthrough is in bulk transcripts for a whole channel or playlist.
Recipe ideas
- New-upload digest: an RSS trigger on a channel's uploads feed → transcript → AI summary → Slack or email. Cheap to run, because most channels publish a handful of videos a week.
- Research archive: a weekly channel sweep → transcripts for anything new → a Notion database holding the text, title, and video link. Over a year that quietly becomes a searchable corpus.
- Content repurposing: transcript → blog-post draft → CMS, with the draft always kept behind human review — the blog-post workflow covers the editing that decides whether the result is any good.
- Vector index:
segmentschunked by timestamp → embeddings → your vector database, so a retrieved passage still knows which moment of which video it came from.