Draft: these docs describe OctaVideo as it will be at launch; some features may not be live yet.
OctaVideoDocs

Set video chapters

PUT
/videos/{videoId}/chapters

Replaces all chapters of a video. Send up to 200 chapters whose start_seconds strictly increase. An empty list removes every chapter.

Authorization

AccessKey
headerAccessKey<token>

The private key of a library, starting with ovk_. Copy it from API & embeds in the console, keep it on your server, and rotate it there if it leaks.

Path Parameters

videoId*string

ID of the video.

Formatuuid

Header Parameters

AccessKey*string

The library's private key. Same value as the AccessKey security scheme; listed here so code samples include it.

Request Body

application/json
  1. body
chapters*array<>

All chapters of the video, with strictly increasing start_seconds. An empty list removes every chapter.

Itemsitems <= 200

Response Body

The updated video.

application/json
  1. response
data*
Example Request
curl -X PUT 'https://api.octavideo.tech/api/v1/videos/6f1c2b9e-4a7d-4f3e-9b8a-2d5c7e1f0a34/chapters' \  -H 'AccessKey: ovk_YOUR_LIBRARY_PRIVATE_KEY' \  -H 'Content-Type: application/json' \  -d '{  "chapters": [    {      "title": "Welcome",      "start_seconds": 0    },    {      "title": "Course outline",      "start_seconds": 95.5    }  ]}'
Example Response
{  "data": {    "id": "6f1c2b9e-4a7d-4f3e-9b8a-2d5c7e1f0a34",    "library_id": "0b8e5d3a-1c2f-4e6a-8b7d-9f0a1b2c3d4e",    "title": "Lesson 1: Introduction",    "description": "",    "encoding_status": "ready",    "progress": 100,    "duration_seconds": 754.2,    "size_bytes": 412337152,    "chapters": [      {        "title": "Welcome",        "start_seconds": 0      },      {        "title": "Course outline",        "start_seconds": 95.5      }    ],    "created_at": "2026-10-25T09:30:00Z"  }}