Enrichment API
Base URL: https://YOUR-SERVER/api. Send your API key in x-api-key where authentication is required. A key also needs the listed permission; your account's access rules still apply.
API guide · All endpoints · OpenAPI JSON
GET /enrichment/frames/{id}— Get a video moment frameGET /enrichment/frames/{id}/similar— Find moments like a video framePOST /enrichment/moments/search— Search video momentsPUT /enrichment/videos/{id}/cover— Choose a video cover frameGET /enrichment/videos/{id}/moments— Get video momentsPOST /enrichment/videos/{id}/moments— Add a video momentDELETE /enrichment/videos/{id}/moments/{momentId}— Delete a video momentPUT /enrichment/videos/{id}/moments/{momentId}— Update a video moment
Get a video moment frame
GET /api/enrichment/frames/{id}
The image of one reusable video frame, under the same access as its video.
Authentication: API key. Permission: asset.read.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"200": {
"content": {
"application/octet-stream": {
"schema": {
"format": "binary",
"type": "string"
}
}
},
"description": ""
}
}Find moments like a video frame
GET /api/enrichment/frames/{id}/similar
Finds the moments nearest one frame's stored search embedding across your videos, including other times in the same video, never the frame itself. Nothing is sent to a model and nothing is written.
Authentication: API key. Permission: asset.read.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
limit | query | No | Most moments to return |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "limit",
"required": false,
"in": "query",
"description": "Most moments to return",
"schema": {
"minimum": 1,
"maximum": 100,
"default": 24,
"type": "integer"
}
}
]Responses
Field definitions: VideoMomentSearchResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentSearchResponseDto"
}
}
},
"description": ""
}
}Search video moments
POST /api/enrichment/moments/search
Finds timestamped moments inside your videos by meaning, against the frame index, and by words in captions and typed transcripts.
Authentication: API key. Permission: asset.read.
Request body
Required.
Field definitions: VideoMomentSearchDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentSearchDto"
}
}
}Responses
Field definitions: VideoMomentSearchResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentSearchResponseDto"
}
}
},
"description": ""
}
}Choose a video cover frame
PUT /api/enrichment/videos/{id}/cover
Keeps the chosen frame as a time in the video, so it survives the frames being cut again. Null returns to the best-ranked frame.
Authentication: API key. Permission: asset.update.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: VideoMomentCoverDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentCoverDto"
}
}
}Responses
Field definitions: VideoMomentsResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentsResponseDto"
}
}
},
"description": ""
}
}Get video moments
GET /api/enrichment/videos/{id}/moments
The reusable frames of a video ranked best first, its cover, its generated and manual moments, and what they were made from, with any that are out of date marked.
Authentication: API key. Permission: asset.read.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
Field definitions: VideoMomentsResponseDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentsResponseDto"
}
}
},
"description": ""
}
}Add a video moment
POST /api/enrichment/videos/{id}/moments
Adds your own moment, with an optional title and typed transcript. Refreshing never removes it.
Authentication: API key. Permission: asset.update.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: VideoMomentCreateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentCreateDto"
}
}
}Responses
Field definitions: VideoMomentDto
{
"201": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentDto"
}
}
},
"description": ""
}
}Delete a video moment
DELETE /api/enrichment/videos/{id}/moments/{momentId}
Removes one of your own moments. Generated moments are refreshed, not deleted.
Authentication: API key. Permission: asset.update.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | Asset ID |
momentId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"description": "Asset ID",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "momentId",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Responses
{
"204": {
"description": ""
}
}Update a video moment
PUT /api/enrichment/videos/{id}/moments/{momentId}
Edits one of your own moments. Generated moments are refreshed, not edited.
Authentication: API key. Permission: asset.update.
Parameters
| Name | Where | Required | Description |
|---|---|---|---|
id | path | Yes | Asset ID |
momentId | path | Yes | string |
Parameter types, defaults and constraints
[
{
"name": "id",
"required": true,
"in": "path",
"description": "Asset ID",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
},
{
"name": "momentId",
"required": true,
"in": "path",
"schema": {
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-7[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
"type": "string"
}
}
]Request body
Required.
Field definitions: VideoMomentUpdateDto
{
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentUpdateDto"
}
}
}Responses
Field definitions: VideoMomentDto
{
"200": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/VideoMomentDto"
}
}
},
"description": ""
}
}© 2026 Frameleaf Inc. All rights reserved.
Frameleaf and the Frameleaf logo are Trademarks of Frameleaf Inc.