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 summary

Grounded 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. 402 means 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 pending list — poll until it empties.