Upload, process, and retrieve recordings — over HTTP.
Send local videos and images from any HTTP client. Then retrieve recordings, transcripts, and AI summaries for warehouses, automations, RAG pipelines, and agents.
curl https://kommodo.ai/api/public/v2/recordings?limit=5 \
-H "Authorization: Bearer $KOMMODO_API_TOKEN"Use Kommodo from your AI assistant.
Connect through the official Kommodo MCP server with secure sign-in and no API token to paste. Claude is verified today. For a local Claude Code workflow, install the open-source Skill and provide a scoped API token instead.
MCP and API access require an active Stripe-backed Premium or Enterprise account. The packaged Skill installer targets Claude Code.
$ ./kommodo-skill/install.sh
$ export KOMMODO_API_TOKEN="..."
$ claude
Restart Claude Code after setup.
A REST API for uploading media and working with the recordings, transcripts, and AI metadata in your Kommodo workspace.
The Kommodo API is built for teams that capture video at scale — sales calls, customer onboarding sessions, internal training, recorded meetings, screen-shared product demos — and want that footage to live somewhere other than the dashboard. List endpoints return paginated recordings filtered by creation date, title, owner, folder, or whether a Page exists. Title search does not search transcripts or AI metadata. Detail endpoints return the full AI envelope: summary, chapters with timestamps, action items, tags, suggested title, and detected language.
Upload local images with a signed PUT, or upload videos in signed multipart chunks directly to storage. The upload contract is plain HTTP and works from cURL, JavaScript, Python, Go, Ruby, PHP, Java, or any other client that can make HTTP requests. Large video bytes never pass through the dashboard service.
A separate transcript endpoint streams raw WebVTT or returns parsed JSON cues. Write endpoints let you organize folders, rename or retag recordings, move them between folders, or publish a recording as a Page — all without opening the dashboard. Authentication is a single JWT bearer token; pagination is opaque cursor-based; request pacing information surfaces in headers.
Common builds: nightly transcript sync into a data warehouse, video knowledge bases backed by AI summaries, RAG pipelines that cite specific recording timestamps, agent workflows that curate recordings on a user's behalf, and automation that converts finished recordings into published Pages on a schedule.
Create an API token
Read scope by default. Toggle write to upload media, organize folders, update recordings, or publish pages. Available to active Stripe-backed Premium and Enterprise accounts.
Open Account → API
Generate a token from your account settings. Read scope is the default; Read + write also permits uploads, folder changes, PATCH, and page creation. Tokens remain valid until revoked or replaced, while your account has API access.
Export it as $KOMMODO_API_TOKEN
Treat it like a password — never commit it. Tokens are scoped to your user; revoke and reissue anytime.
Send it as a Bearer header
Set Authorization: Bearer <token> on each request. Never send the token to signed storage URLs.
Upload from any HTTP client
Upload is a language-neutral HTTP contract. Images use one signed PUT. Videos use signed multipart PUTs so even multi-gigabyte files travel directly to storage instead of through the Kommodo web service. The examples below use cURL and Node, but no Kommodo SDK is required.
Image request
POST /api/public/v2/uploads
Authorization: Bearer <read+write token>
Content-Type: application/json
{
"type": "image",
"title": "diagram.png",
"size_bytes": 240123,
"content_type": "image/png",
"width": 1600,
"height": 900
}The 201 response contains upload.method, upload.url, required upload.headers, and upload.expires_in_seconds. Send the image bytes to that URL. Images do not use the Kommodo completion endpoint.
Video request
POST /api/public/v2/uploads
Authorization: Bearer <read+write token>
Content-Type: application/json
{
"type": "video",
"title": "meeting.mp4",
"size_bytes": 104857600
}The 201 response contains upload_id, recording_id, the chunk size, one or more storage providers, and a short-lived Kommodo completion grant.
Video multipart response
URLs and tokens are shortened below. Treat every returned URL and token as a secret until it expires.
{
"upload_id": "...",
"recording_id": "...",
"type": "video",
"status": "awaiting_upload",
"upload": {
"method": "multipart",
"path": "...",
"chunk_size_bytes": 5242880,
"expires_in_seconds": 43200,
"providers": [{
"upload_parts": [
{ "part_number": 1, "url": "https://signed-storage/..." }
],
"complete_url": "https://signed-storage/...",
"abort_url": "https://signed-storage/..."
}]
},
"completion": {
"url": "/api/public/v2/uploads/<upload_id>/complete",
"token": "..."
}
}Complete a video upload
- Split the file using
upload.chunk_size_bytes. PUT each part to its matchingupload_parts[].urland retain the responseETag. - POST S3-compatible
CompleteMultipartUploadXML, ordered by part number, to that provider'scomplete_url. - POST
{ "completion_token": "..." }with your Bearer token tocompletion.url. A successful call returnsstatus: processing. Retry transient failures with the same completion token. - Poll
GET /v2/recordings/<recording_id>. A 404 is expected until processing creates the recording; media is ready whenurls.videois non-empty.
Security and failure handling
- Send the Kommodo Bearer token only to the Kommodo API origin. Never attach it to signed storage URLs.
- Retry individual part PUTs for transient network and 5xx failures. Keep part numbers and ETags in response order.
- If a provider fails, DELETE its
abort_url, then restart the whole file with the next returned provider. - Finish all storage and Kommodo completion calls before
expires_in_seconds. If the contract expires, initialize a new upload.
Runnable video upload
Both references implement retries, ETag collection, provider failover, storage completion, and Kommodo finalization.
# Requires curl and jq. Inspect the reference before running it.
curl -fsS https://kommodo.ai/api-examples/upload-video.sh -o upload-video.sh
less upload-video.sh
chmod +x upload-video.sh
export KOMMODO_API_TOKEN="<read+write token>"
export KOMMODO_API_BASE_URL="https://kommodo.ai"
./upload-video.sh /absolute/path/to/meeting.mp4
# Prints { upload_id, recording_id, result: { status: "processing" } }Runnable image upload
JPEG, PNG, GIF, and WebP are supported. Width and height must be the source image's actual positive dimensions. Importing from a remote Zoom, Dropbox, or other URL is not currently supported.
# Requires curl and jq. Supply the source image's real dimensions.
export KOMMODO_API_TOKEN="<read+write token>"
export KOMMODO_API_BASE_URL="https://kommodo.ai"
FILE=/absolute/path/to/diagram.png
SIZE=$(wc -c < "$FILE" | tr -d ' ')
INIT=$(curl --fail-with-body --silent --show-error \
-X POST "$KOMMODO_API_BASE_URL/api/public/v2/uploads" \
-H "Authorization: Bearer $KOMMODO_API_TOKEN" \
-H "Content-Type: application/json" \
--data "$(jq -cn --arg title "$(basename "$FILE")" --argjson size "$SIZE" \
'{type:"image", title:$title, size_bytes:$size,
content_type:"image/png", width:1600, height:900}')")
# The signed storage request must not include your Kommodo API token.
curl --fail-with-body --silent --show-error \
-X "$(jq -r '.upload.method' <<<"$INIT")" \
"$(jq -r '.upload.url' <<<"$INIT")" \
-H "Content-Type: $(jq -r '.upload.headers["Content-Type"]' <<<"$INIT")" \
--data-binary "@$FILE"
jq '{upload_id, type, status:"uploaded"}' <<<"$INIT"Common patterns
Each snippet uses live v2 endpoints. Replace $KOMMODO_API_TOKEN and run.
Nightly transcript sync
Watermark + cursor pagination. Pull every new recording created since your last run and ingest its VTT or JSON transcript into your data warehouse.
# Pull every recording created since last run, then fetch transcripts.
since = read_watermark() # ISO timestamp from your last sync
cursor = None
while True:
r = session.get(BASE + "/recordings", params={
"since": since, "cursor": cursor, "limit": 100,
}).json()
for rec in r["recordings"]:
t = session.get(BASE + f"/recordings/{rec['id']}/transcript",
params={"format": "json"}).json()
ingest(rec, t["cues"])
cursor = r["next_cursor"]
if not cursor: break
write_watermark(now_utc_iso())Build a video knowledge base
Filter by title, folder, or has_page; hydrate with AI summary, chapters, and action items. Feed an enterprise search index or RAG pipeline.
# 1. List recordings inside a specific folder
curl "$BASE/recordings?folder_id=<folder-id>&has_page=true" \
-H "Authorization: Bearer $KOMMODO_API_TOKEN"
# 2. Pull the AI summary + chapters for each
curl "$BASE/recordings/<id>" \
-H "Authorization: Bearer $KOMMODO_API_TOKEN"
# returns: ai.summary, ai.chapters, ai.action_items, ai.tagsBulk rename & curate
PATCH titles, descriptions, and tags from a script or agent. Owner-or-folder-fullAccess enforced server-side.
# Rename a recording (write scope required)
curl -X PATCH "$BASE/recordings/<id>" \
-H "Authorization: Bearer $KOMMODO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"title": "Q2 onboarding — final"}'Auto-publish a Page from a recording
Turn a finished recording into a public Page with one POST. Drop publish:false for a draft you can edit in the dashboard.
# Convert a recording into a published Page (write scope required)
curl -X POST "$BASE/recordings/<id>/pages" \
-H "Authorization: Bearer $KOMMODO_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"publish": true}'Protocol details
Bearer-authenticated v2 calls include request-pacing headers. Honor Retry-After when the API returns 429.
Endpoints
The complete upload protocol is documented above. Additional recording recipes are in the GitHub quickstart.
Common questions from developers
Open Account → API in your dashboard and generate a token. Read scope is enabled by default; choose Read + write for write operations. Treat API tokens like passwords and revoke them immediately if exposed. API access requires an active Stripe-backed Premium or Enterprise account.
Read scope can list recordings and folders, fetch transcripts, and read AI metadata. Write scope can also upload local images and videos; create, rename, and delete empty folders; PATCH titles, descriptions, tags, and folder placement; and POST a recording to create a Page. Tokens default to read scope; you must opt in to write scope at token creation.
Yes. Upload is a language-neutral HTTP contract. The upload guide above includes a complete cURL reference, a dependency-free Node reference, the multipart response schema, and the steps required to implement it in any language. Python is optional.
Not currently. The upload API accepts local file bytes. Download the source file first, then upload it with the cURL reference, Node reference, or your own HTTP client.
Bearer-authenticated v2 calls include X-RateLimit-Remaining and X-RateLimit-Reset pacing headers. If the API returns 429, wait the Retry-After duration before retrying. Treat these response headers—not a hard-coded client-side quota—as the current limit signal.
Recording and folder list responses return an opaque next_cursor. Pass it back as the cursor query parameter on the next call until next_cursor is null. GET /v2/recordings also supports since=<ISO timestamp>, which filters by creation time. It is not an updated-record change feed.
The q parameter on GET /v2/recordings searches recording titles. You can combine it with folder, date, team-member, and Page filters. It does not search transcripts, summaries, tags, or other AI metadata.
The transcript endpoint returns either WebVTT (format=vtt) or parsed JSON cues (format=json) with start_seconds, end_seconds, and text per cue. Files are capped at 5 MB; larger transcripts return a 413. The endpoint proxies the underlying file so you do not need to manage presigned URL TTLs.
List responses include ai.tags, ai.suggested_title, ai.detected_language, and ai.status. Detail responses (GET /v2/recordings/{id}) additionally include ai.summary, ai.chapters (with timestamps), and ai.action_items. AI processing is asynchronous; check ai.status (ready, processing, or pending) before consuming.
Yes. Connect a supported AI assistant through the official Kommodo MCP connector with secure sign-in and no API token to paste. Claude and ChatGPT are supported today. Claude Code users can alternatively install the open-source Kommodo Skill with a scoped API token.
API access requires an active Stripe-backed Premium or Enterprise account. Free and non-Stripe accounts can preview the docs but cannot use an API token. See pricing for current tiers.
Email support@kommodo.ai with the request URL, response status, and timestamp in UTC so we can correlate it with server logs.
Not currently. The endpoint table and complete language-neutral upload protocol on this page are the current reference. The GitHub quickstart adds response envelopes, pagination recipes, error codes, and optional agent tooling.
Where this fits in
The API is one surface for the same recordings you see in the dashboard. Here's the rest.
Kommodo MCP connector
Connect supported AI assistants to the same recordings and API capabilities through secure sign-in.
Learn moreVideo to SOP Generator
Turn a screen recording into a step-by-step procedure. Useful for understanding what AI metadata looks like.
Learn moreVideo Knowledge Base
See the dashboard surface that the API powers — folders, search, AI tagging.
Learn moreKommodo Skill (open source)
The agent integration that wraps the v2 API. MIT-licensed reference implementation.
Learn more