Kaps + n8n
Use n8n to automate captioned renders with the Kaps Render API. There is no dedicated Kaps node — the built-in HTTP Request node (and optional Webhook trigger) is enough.
Prerequisites
- A Kaps account (kaps.ai) with credits.
- An API key from Settings → API keys (
ksk_live_…, shown once). - n8n (cloud or self-hosted).
API base URL: https://api.kaps.ai/functions/v1
Store your API key
In n8n, create a credential:
- Credentials → Add credential → Header Auth
- Name:
Authorization - Value:
Bearer ksk_live_...(include theBearerprefix)
Use this credential on every HTTP Request node below.
Starter workflow (import)
A minimal “caption video from URL” workflow is in the repo:
docs/workflows/kaps-caption-from-url.json
In n8n: Workflows → Import from file (or paste JSON). Then:
- Open the Configure node and set
preset_idandvideo_url. - Attach your Header Auth credential to the HTTP Request nodes.
- Run manually to test.
The template uses wait: true so short clips finish in one execution (blocks up to ~4 minutes). For longer videos, use the async + webhook pattern below.
Build it yourself
Recommended flow: credits → estimate → create → status (or webhook). See Render API for field details.
1. Check credits (optional)
| Setting | Value |
|---|---|
| Method | GET |
| URL | https://api.kaps.ai/functions/v1/api-credits |
| Auth | Header Auth (see above) |
2. Estimate cost (optional)
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://api.kaps.ai/functions/v1/api-render-estimate |
| Auth | Header Auth |
| Body content type | JSON |
Example body:
{
"duration_seconds": 185,
"resolution": "1080p",
"fps": 30
}
Check can_proceed before creating a render. Still returns HTTP 200 when balance or upload limits would block a real job.
3. List presets (optional)
| Setting | Value |
|---|---|
| Method | GET |
| URL | https://api.kaps.ai/functions/v1/api-presets-list |
| Auth | Header Auth (see above) |
Pick a preset_id from the response.
4. Start a render
| Setting | Value |
|---|---|
| Method | POST |
| URL | https://api.kaps.ai/functions/v1/api-render-create |
| Auth | Header Auth |
| Body content type | JSON |
Example body (sync — good for short clips):
{
"preset_id": "",
"video_url": "",
"resolution": "1080p",
"fps": 30,
"wait": true
}
Example body (async — recommended for longer videos):
{
"preset_id": "",
"video_url": "",
"resolution": "1080p",
"webhook_url": "https://your-n8n.example.com/webhook/kaps-render-complete"
}
When wait is omitted or false, the response includes request_id and status_url. Poll with GET https://api.kaps.ai/functions/v1/api-render-status?id=.
5. Async completion via Webhook (recommended)
- Add a Webhook trigger node (
POST, path e.g.kaps-render-complete). - Copy the production webhook URL into
webhook_urlon the create request. - When the render finishes, Kaps POSTs JSON including
output_url,status, andcredits_used.
See Render API → Webhooks for payload shape and HMAC verification (X-Kaps-Signature). For internal workflows you can skip verification; for production endpoints use a Code node to verify the signature with your key’s webhook signing secret.
6. Poll loop (alternative to webhooks)
If you cannot expose a webhook:
HTTP Request (create, wait: false)
→ Wait (5s)
→ HTTP Request (GET status)
→ IF status not in complete/failed → loop back to Wait
Example: Google Drive → Kaps
n8n has native nodes for the full pipeline when your source file lives on Drive:
Google Drive Trigger
→ Google Drive (Download)
→ S3 / R2 / B2 (Upload)
→ Set (public file URL)
→ HTTP Request (Kaps create render)
Use the file ID from the share link (drive.google.com/file/d/FILE_ID/view) in the Download node.
Side note — Google Drive links: A Drive share URL is not a direct video URL. Kaps fetches
video_urlserver-side and needs raw file bytes (S3, R2, CDN, etc.). Pasting a Drive link intovideo_urlreturns HTML and ingest fails. Download with n8n’s Google Drive node, upload to a bucket with a public (or signed) object URL, then pass that URL to Kaps — or upload the asset in the Kaps app and useasset_idinstead.
For large files, enable n8n filesystem binary mode on self-hosted instances.
Operations quick reference
| Action | Method | Path |
|---|---|---|
| Credit balance | GET |
/api-credits |
| Estimate cost | POST |
/api-render-estimate |
| List presets | GET |
/api-presets-list |
| Create render | POST |
/api-render-create |
| Poll status | GET |
/api-render-status?id={request_id} |
Full field lists, errors, and pricing: Render API.
Further reading
- Render API — auth, webhooks, status machine, examples
- MCP server — same API from Cursor / Claude via MCP