Developers / Automatic Subtitles
One API job from video to SRT and MP4.
Upload first, inspect a trusted duration quote, then explicitly approve the Kiku Credits charge. Transcription starts only after that approval.
API keys are server-side credentials. Never place one in browser or mobile-app source code.
Request flow
Quote before charge. One idempotent start.
01
Create a private job
Send an account-owned API key from your server. The response contains a short-lived upload URL and authorization value. Protected Words are optional spelling guidance.
curl https://kikuai.dev/v1/auto-subtitles/jobs \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{"protected_words":[]}'02
Upload the video directly
POST the binary file to job.upload.url with job.upload.authorization. The Hetzner worker validates the media and measures duration; transcription does not start yet.
curl -X POST "$UPLOAD_URL" \
-H "Authorization: $UPLOAD_AUTH" \
-H "Content-Type: video/mp4" \
--data-binary @video.mp403
Read and accept the exact quote
GET the job until its status is awaiting_payment. Copy job.credits_required into expected_credits so a changed quote can never be charged silently.
curl https://kikuai.dev/v1/auto-subtitles/jobs/JOB_ID \
-H "Authorization: Bearer YOUR_API_KEY"
curl -X POST https://kikuai.dev/v1/auto-subtitles/jobs/JOB_ID/start \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data '{"expected_credits":40}'04
Poll, review, and download
Poll no faster than job.poll_after_seconds until complete. Download the MP4 and SRT from job.downloads using the returned authorization header. All job files expire within 24 hours.
curl "$VIDEO_URL" -H "Authorization: $DOWNLOAD_AUTH" -o captioned.mp4
curl "$SRT_URL" -H "Authorization: $DOWNLOAD_AUTH" -o subtitles.srtService boundary
Errors you should handle
401API key is missing, invalid, revoked, or belongs to an inactive account.402The shared Kiku Credits balance is too low for this action.409The upload quote is not ready, changed, or the paid authorization should be retried.410The private job and its artifacts have expired.424The private media worker is temporarily unavailable.429The daily quote-job limit has been reached.Start requests are safe to retry with the same job ID and expected credit amount. A duplicate start does not spend credits twice. If a charged job cannot produce downloadable output, retry that same job first, then contact support.
Ready to wire the first job?
Create up to three revocable keys in the shared KikuAI account.
