Developers
Transcripts over HTTP.
Every capability in the workspace is a documented REST endpoint. Authenticate with a Bearer key, get JSON back, build whatever you want.
Authentication
Create a key under Account → API keys and send it as a Bearer token. Keys draw from your plan's quota, the same pool the workspace uses.
Authorization: Bearer kinode_live_xxxxxxxxxxxxxxxx
Endpoints
POST
/api/transcriptsFetch transcripts for up to 50 video IDs in one call. Cached fetches are instant.POST
/api/playlistExpand a playlist URL or ID into its video IDs (up to ~250 items).POST
/api/channelsLook up channel metadata and uploads playlists for up to 50 handles. Plus/Pro tiers.POST
/api/uploadStream your own video or audio file; returns a job that resolves to a transcript.POST
/api/mp3/:videoIdConvert any transcribed video (YouTube, Vimeo, or upload) to MP3; GET the same path to download.POST
/api/insight/:videoId/:kindGenerate summaries, chapters, key quotes, study guides, quizzes, translations, and more.POST
/api/chatAsk questions grounded in a video's transcript, with optional multi-turn history.GET
/api/transcribe/:videoIdRead a cached transcript and every generated output for a video.GET
/api/jobs/:idPoll job status: pending, running, done, error.Examples
Bulk transcripts — cURL
curl -X POST https://usekinode.app/api/transcripts \
-H "Authorization: Bearer $KINODE_KEY" \
-H "Content-Type: application/json" \
-d '{"ids": ["dQw4w9WgXcQ", "jNQXAC9IVRw"]}'Upload your own file — cURL
curl -X POST https://usekinode.app/api/upload \ -H "Authorization: Bearer $KINODE_KEY" \ -H "Content-Type: application/octet-stream" \ -H "X-File-Name: standup-recording.mp4" \ --data-binary @standup-recording.mp4
Summary — JavaScript
const res = await fetch("https://usekinode.app/api/insight/dQw4w9WgXcQ/summary", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.KINODE_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({}),
});
const { text } = await res.json(); // markdown summaryGrounded chat — Python
import os, requests
r = requests.post(
"https://usekinode.app/api/chat",
headers={"Authorization": f"Bearer {os.environ['KINODE_KEY']}"},
json={"videoId": "dQw4w9WgXcQ", "question": "What are the key takeaways?"},
)
print(r.json()["answer"])Conventions
- Errors are JSON:
{ "error": "message" }with a meaningful HTTP status.402means quota or credits are exhausted. - Caching is per video: repeat fetches of the same content are instant and never re-billed.
- Rate limits apply per key; batch endpoints accept up to 50 items per call.
- Async work (uploads, AI generation) returns a job or a
pendinglist — poll until it empties.