Scriptube does not have a native Zapier app, Make.com app, or Pipedream integration â say that plainly, because searching for "Scriptube Zapier integration" will otherwise waste your time looking for a tile that doesn't exist. What you do have is a documented webhook API and an HTTP API, and every one of these platforms has a generic way to consume both. This guide is the honest, manual version of what a native app would do for you.
If you're on n8n, skip this: there's an official node and you don't need any of the steps below â see n8n-youtube-transcript-automation.
The two integration points
Everything here uses one of two Scriptube mechanisms:
- Registered webhooks â subscribe once to events (
batch.completed,transcript.ready,credits.low, etc.) and every matching event across your account gets POSTed to one URL, with retries and a delivery log. Requires Pro or higher. callback_urlâ attach a URL directly to one batch at submit time; it receives just that batch'sbatch.completedandtranscript.readyevents, no registration needed, available on any plan that can call the API.
Use a registered webhook if you want one Zap/scenario to react to everything your account does. Use callback_url if you're submitting the batch from the same automation and only care about that one batch's result â it's simpler and needs no separate setup step.
Step 1: Create the catch-hook on your platform
Each platform has a built-in app for this (exact menu names shift over time â these are current as of this writing):
- Zapier: "Webhooks by Zapier" â trigger "Catch Hook". Copy the custom webhook URL it generates.
- Make: add a "Webhooks" module â "Custom webhook" â create a new webhook, copy its URL.
- Pipedream: create a new workflow with an "HTTP / Webhook" trigger, copy its endpoint URL.
You now have a URL that can receive a POST. Nothing reaches it yet â Scriptube doesn't know it exists.
Step 2: Register it with Scriptube
curl -X POST https://scriptube.me/api/webhooks/register \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.zapier.com/hooks/catch/XXXXX/YYYYY/",
"events": ["batch.completed", "transcript.ready"],
"secret": "a-dedicated-random-string-16-to-256-chars"
}'
The secret must be at least 16 characters, and it should be a value you generated just for this â never your API key. Scriptube uses it to sign every delivery. The response is {"status": "active", "webhook_id": "...", "message": "..."}. Webhook limits are per plan: Pro gets 5, Business 10, Unlimited 25; Free and Starter can't register webhooks at all (use callback_url instead on those plans).
To unregister later: DELETE /api/webhooks/{webhook_id} with the same X-API-Key header.
Step 3: Verify the signature before you trust the payload
Every delivery carries two headers:
| Header | Value |
|---|---|
X-Scriptube-Timestamp | Unix seconds when the payload was signed |
X-Scriptube-Signature | sha256=<hex HMAC-SHA256(secret, "{timestamp}.{raw body}")> |
Reject anything older than 5 minutes (replay protection) and anything whose signature doesn't match. Zapier and Make both let you drop into a short code step for this â here's the logic in JavaScript, usable in Zapier's "Code by Zapier" step or Make's custom function tooling:
const crypto = require('crypto');
const timestamp = inputData.headers['x-scriptube-timestamp'];
const signature = inputData.headers['x-scriptube-signature'];
const rawBody = inputData.rawBody; // must be the exact bytes received, not re-stringified JSON
const secret = 'a-dedicated-random-string-16-to-256-chars';
const tooOld = Math.abs(Date.now() / 1000 - Number(timestamp)) > 300;
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
const valid = !tooOld && signature === expected;
output = { valid };
The part people get wrong: signing works on the raw request body as received, not a value you've already parsed and re-serialized back to JSON. Re-serializing can reorder keys or change whitespace, which produces a different byte string and a signature mismatch that has nothing to do with a forged request. If your platform's webhook step only exposes parsed JSON, look for a "raw body" or "raw payload" option â n8n's trigger node, for comparison, explicitly requests the raw bytes for exactly this reason.
Gate the rest of your Zap or scenario on valid === true with a Filter (Zapier) or Router (Make) step immediately after the code step, so an unsigned or forged POST never reaches your downstream actions.
Step 4: Route by event type
One registered webhook receives every event you subscribed to at one URL. Add a Filter/Router step reading the payload's event field (batch.completed, transcript.ready, credits.low, and so on) and branch from there â a Slack alert for credits.low, a spreadsheet row for batch.completed, for example. See slack-alert-transcript-batch-finished and youtube-transcripts-to-google-sheets-automatically for the downstream half of each of those.
Calling Scriptube's API from these platforms
Submitting a batch or pulling an export is a plain HTTP call, no native app required â Zapier's "Webhooks by Zapier > POST/GET", Make's generic "HTTP" module, and Pipedream's built-in axios or fetch all work the same way:
POST https://scriptube.me/api/v1/transcripts
Headers: X-API-Key: YOUR_API_KEY, Content-Type: application/json
Body: {"urls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"], "callback_url": "https://hooks.zapier.com/hooks/catch/XXXXX/YYYYY/"}
Using callback_url here instead of a registered webhook means you don't need Step 2 at all for this one Zap â Scriptube signs callback deliveries the same way, except with a per-batch secret returned once as callback_secret in the create response when your account has no registered webhook secret to fall back on.
Why not wait for a native app
A native Zapier or Make app buys you a polished trigger/action picker and listing in their app directory â it doesn't give you any capability the webhook API doesn't already expose. If you need this today, the setup above is the complete integration, not a stopgap.
For the underlying contract this all rests on â endpoints, retries, error codes â see youtube-transcript-api-complete-guide, and for the push-vs-poll decision generally, webhooks-vs-polling-youtube-transcripts.
Get an API key to start: /ui/signup.