# BlitzReels API Reference

Machine-readable markdown generated from the public OpenAPI router.

Base URL: https://blitzreels.com/api/v1

## Discovery

- Full site docs: `/llms-full.txt`
- Compact API capabilities: `/api/capabilities/compact.json`
- OpenAPI JSON: `/api/openapi.json`
- API markdown: `/api/docs.md`

## Workflow: Agent-Controlled Short Edit

Use this sequence when an AI coding agent edits an existing BlitzReels project for a creator.

1. Validate credentials with `GET /auth/validate`.
2. Inspect project state with `GET /projects/{projectId}/context?mode=full`.
3. Render one or more snapshots with `POST /projects/{projectId}/preview-frame` or `/preview-frames`.
4. Apply additive edits such as `POST /projects/{projectId}/content-items` or `POST /projects/{projectId}/timeline/audio`.
5. Preview again before exporting.
6. Start export with `POST /projects/{projectId}/export`.
7. Poll `GET /jobs/{jobId}` or `GET /exports/{exportId}` until complete.

```bash
curl -sS "https://blitzreels.com/api/v1/auth/validate" -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

## Endpoint Index

- `GET /`
- `GET /admin/recovery/{resource_type}/{resource_id}`
- `POST /admin/recovery/{resource_type}/{resource_id}/execute`
- `GET /admin/recovery/{resource_type}/{resource_id}/trigger-runs`
- `POST /admin/recovery/{resource_type}/{resource_id}/trigger-runs/{run_id}/cancel`
- `GET /ai-edit/runs/{runId}`
- `POST /ai-edit/runs/{runId}/apply-style`
- `POST /ai-edit/runs/{runId}/complete`
- `GET /ai-edit/runs/{runId}/logs`
- `POST /ai-edit/runs/{runId}/logs`
- `POST /ai-edit/runs/{runId}/snapshots`
- `POST /ai-edit/runs/{runId}/validate`
- `GET /ai-edit/styles`
- `GET /analytics/posts`
- `GET /analytics/posts/{mediaId}`
- `POST /analytics/posts/{mediaId}/refresh`
- `GET /analytics/posts/{mediaId}/refresh/{runId}`
- `POST /audio-library/import`
- `GET /audio-library/search`
- `GET /auth/validate` workflow-critical
- `GET /caption-looks`
- `GET /caption-presets`
- `GET /caption-themes` workflow-critical
- `POST /caption-themes`
- `POST /caption-themes/preview`
- `GET /caption-themes/{themeId}`
- `PATCH /caption-themes/{themeId}`
- `DELETE /caption-themes/{themeId}`
- `POST /caption-themes/{themeId}/duplicate`
- `POST /caption-themes/{themeId}/set-default`
- `POST /carousels/compile`
- `POST /carousels/recipes/{recipe_id}/expand`
- `GET /carousels/{projectId}`
- `PATCH /carousels/{projectId}`
- `POST /carousels/{projectId}/clone`
- `POST /carousels/{projectId}/kit`
- `POST /carousels/{projectId}/migrate`
- `POST /carousels/{projectId}/preview`
- `PATCH /carousels/{projectId}/slide`
- `GET /characters`
- `POST /characters`
- `GET /characters/{characterId}`
- `PATCH /characters/{characterId}`
- `POST /characters/{characterId}/archive`
- `POST /characters/{characterId}/describe`
- `POST /characters/{characterId}/primary-reference`
- `POST /characters/{characterId}/references`
- `POST /characters/{characterId}/sheets`
- `GET /clip-batches/{batch_id}`
- `DELETE /clip-batches/{batch_id}`
- `GET /clip-batches/{batch_id}/archive`
- `GET /clip-batches/{batch_id}/realtime-token`
- `POST /clip-batches/{batch_id}/recover`
- `GET /clip-share-pages/{asset_id}`
- `POST /clip-share-pages/{asset_id}`
- `POST /clip-share-pages/{asset_id}/clips/{clip_id}/visibility`
- `GET /clipping-projects`
- `GET /clips`
- `POST /clips`
- `POST /clips/attach-export`
- `GET /clips/presets`
- `GET /clips/source-preview`
- `GET /clips/{clip_id}`
- `DELETE /clips/{clip_id}`
- `POST /clips/{clip_id}/export`
- `POST /clips/{clip_id}/promote-export`
- `POST /clips/{clip_id}/reject`
- `POST /clips/{clip_id}/repair`
- `POST /clips/{clip_id}/reselect`
- `GET /creative-builds/{jobId}`
- `POST /creative-builds/{jobId}/cancel`
- `GET /creative-builds/{jobId}/frame`
- `GET /credits/balance`
- `PUT /customer-links`
- `GET /customer-outcomes`
- `PUT /customer-outcomes`
- `GET /drafts/quote`
- `GET /drafts/runs`
- `POST /drafts/runs`
- `GET /drafts/runs/{runId}`
- `POST /drafts/runs/{runId}/control`
- `GET /exports/{exportId}` workflow-critical
- `DELETE /exports/{exportId}`
- `GET /fonts`
- `POST /formats/video-model-benchmark/runs`
- `POST /generate-faceless`
- `POST /generate-image`
- `POST /generate-music`
- `POST /generate-sound`
- `POST /generate-video`
- `POST /generate-voiceover`
- `GET /generation-jobs/{jobId}`
- `POST /generation-jobs/{jobId}/cancel`
- `POST /generation-jobs/{jobId}/recover`
- `POST /generation-jobs/{jobId}/review`
- `GET /generation-options/{kind}`
- `POST /generation-plan-brief`
- `GET /generation/audio-quote`
- `GET /generation/quote`
- `GET /jobs/{jobId}`
- `POST /learning/jobs`
- `GET /learning/jobs/{jobId}`
- `POST /learning/jobs/{jobId}/control`
- `POST /learning/quote`
- `GET /library/broll/search`
- `POST /library/broll/{libraryAssetId}/import`
- `POST /maps/jobs`
- `GET /maps/jobs/{jobId}`
- `POST /maps/jobs/{jobId}/control`
- `GET /maps/providers`
- `POST /maps/quote`
- `GET /mutations/lookup`
- `GET /onboarding/brand-profile`
- `PATCH /onboarding/brand-profile`
- `POST /onboarding/brand-scan`
- `GET /onboarding/brand-scans/{runId}`
- `POST /onboarding/complete`
- `POST /onboarding/logo/import`
- `GET /projects`
- `POST /projects`
- `POST /projects/batch-delete`
- `GET /projects/{projectId}`
- `PATCH /projects/{projectId}`
- `DELETE /projects/{projectId}`
- `POST /projects/{projectId}/ai-edit/runs`
- `GET /projects/{projectId}/audio-levels`
- `POST /projects/{projectId}/broll`
- `POST /projects/{projectId}/caption-theme`
- `GET /projects/{projectId}/captions`
- `POST /projects/{projectId}/captions`
- `POST /projects/{projectId}/captions/delete`
- `POST /projects/{projectId}/captions/hide`
- `POST /projects/{projectId}/captions/hydrate`
- `POST /projects/{projectId}/captions/show`
- `GET /projects/{projectId}/captions/style`
- `PATCH /projects/{projectId}/captions/style`
- `GET /projects/{projectId}/captions/words`
- `POST /projects/{projectId}/captions/words/batch-text`
- `POST /projects/{projectId}/captions/words/delete`
- `POST /projects/{projectId}/captions/words/emphasis`
- `POST /projects/{projectId}/captions/words/merge`
- `POST /projects/{projectId}/captions/words/retime`
- `POST /projects/{projectId}/captions/words/split`
- `POST /projects/{projectId}/captions/words/style`
- `POST /projects/{projectId}/captions/words/text`
- `GET /projects/{projectId}/captions/{captionId}`
- `PATCH /projects/{projectId}/captions/{captionId}`
- `POST /projects/{projectId}/carousels/generate`
- `PATCH /projects/{projectId}/composition-presets/{contentItemId}/theme`
- `GET /projects/{projectId}/content-items`
- `POST /projects/{projectId}/content-items` workflow-critical
- `PATCH /projects/{projectId}/content-items/{contentItemId}`
- `DELETE /projects/{projectId}/content-items/{contentItemId}`
- `GET /projects/{projectId}/context` workflow-critical
- `POST /projects/{projectId}/editor-commands/execute`
- `POST /projects/{projectId}/editor-commands/preview`
- `POST /projects/{projectId}/editor-commands/undo`
- `GET /projects/{projectId}/editor-document`
- `GET /projects/{projectId}/editor-snapshot`
- `POST /projects/{projectId}/effects/colorgrade`
- `PATCH /projects/{projectId}/effects/colorgrade/{timelineItemId}`
- `POST /projects/{projectId}/effects/mask`
- `PATCH /projects/{projectId}/effects/mask/{timelineItemId}`
- `POST /projects/{projectId}/effects/zoom`
- `PATCH /projects/{projectId}/effects/zoom/{timelineItemId}`
- `POST /projects/{projectId}/export` workflow-critical
- `GET /projects/{projectId}/export-quote`
- `GET /projects/{projectId}/exports`
- `POST /projects/{projectId}/faceless/plans`
- `GET /projects/{projectId}/faceless/plans/{revisionId}`
- `POST /projects/{projectId}/faceless/plans/{revisionId}/approve`
- `POST /projects/{projectId}/faceless/plans/{revisionId}/approve-assets`
- `POST /projects/{projectId}/faceless/plans/{revisionId}/regenerate-assets`
- `POST /projects/{projectId}/faceless/plans/{revisionId}/revise`
- `GET /projects/{projectId}/jobs`
- `GET /projects/{projectId}/media`
- `POST /projects/{projectId}/media`
- `DELETE /projects/{projectId}/media/{mediaId}`
- `POST /projects/{projectId}/mistakes/apply` workflow-critical
- `POST /projects/{projectId}/mistakes/plan` workflow-critical
- `GET /projects/{projectId}/preparation`
- `POST /projects/{projectId}/preview-frame` workflow-critical
- `POST /projects/{projectId}/preview-frames`
- `GET /projects/{projectId}/preview-quote`
- `POST /projects/{projectId}/publishing/instagram`
- `GET /projects/{projectId}/realtime-token`
- `GET /projects/{projectId}/recipe/versions`
- `GET /projects/{projectId}/recipe/versions/{version}`
- `GET /projects/{projectId}/reframes/{reframeId}`
- `PATCH /projects/{projectId}/reframes/{reframeId}/sources/{sourceAssetId}`
- `GET /projects/{projectId}/settings`
- `POST /projects/{projectId}/silence/apply` workflow-critical
- `POST /projects/{projectId}/silence/plan` workflow-critical
- `GET /projects/{projectId}/source`
- `PATCH /projects/{projectId}/source`
- `PUT /projects/{projectId}/source`
- `POST /projects/{projectId}/source/apply`
- `GET /projects/{projectId}/source/build-quote`
- `POST /projects/{projectId}/source/builds`
- `GET /projects/{projectId}/source/files`
- `GET /projects/{projectId}/templates`
- `GET /projects/{projectId}/templates/{templateId}`
- `GET /projects/{projectId}/timeline/at`
- `POST /projects/{projectId}/timeline/audio` workflow-critical
- `PATCH /projects/{projectId}/timeline/audio/{timelineItemId}`
- `POST /projects/{projectId}/timeline/batch-delete`
- `POST /projects/{projectId}/timeline/batch-move`
- `POST /projects/{projectId}/timeline/batch-transform`
- `POST /projects/{projectId}/timeline/batch-trim`
- `POST /projects/{projectId}/timeline/cut`
- `POST /projects/{projectId}/timeline/edits`
- `DELETE /projects/{projectId}/timeline/items/{timelineItemId}`
- `POST /projects/{projectId}/timeline/media`
- `POST /projects/{projectId}/timeline/media-views/duplicate`
- `POST /projects/{projectId}/timeline/media-views/items/{timelineItemId}`
- `PATCH /projects/{projectId}/timeline/media/{timelineItemId}`
- `POST /projects/{projectId}/timeline/move`
- `POST /projects/{projectId}/timeline/operations/execute`
- `POST /projects/{projectId}/timeline/operations/preview`
- `POST /projects/{projectId}/timeline/split`
- `POST /projects/{projectId}/timeline/transform`
- `POST /projects/{projectId}/timeline/trim`
- `POST /projects/{projectId}/transcribe`
- `GET /projects/{projectId}/transcript`
- `POST /projects/{projectId}/transcript/corrections`
- `GET /projects/{projectId}/transcript/segments`
- `POST /projects/{projectId}/visual-analysis`
- `GET /projects/{projectId}/visual-debug`
- `POST /projects/{projectId}/visuals/apply`
- `POST /projects/{project_id}/captions/magic-emojis`
- `GET /publishing/capabilities`
- `GET /publishing/connections`
- `POST /publishing/network/schedule`
- `GET /publishing/posts`
- `POST /publishing/posts`
- `POST /publishing/posts/validate`
- `GET /publishing/posts/{postId}`
- `GET /publishing/posts/{postId}/approvals`
- `PATCH /publishing/posts/{postId}/draft`
- `DELETE /publishing/posts/{postId}/draft`
- `POST /publishing/posts/{postId}/replace`
- `POST /publishing/posts/{postId}/schedule`
- `POST /publishing/targets/{targetId}/cancel`
- `POST /publishing/targets/{targetId}/reschedule`
- `POST /publishing/targets/{targetId}/retry`
- `POST /publishing/tiktok/schedule`
- `POST /publishing/video/schedule`
- `GET /recording-sets`
- `POST /recording-sets`
- `GET /recording-sets/{recordingSetId}`
- `DELETE /recording-sets/{recordingSetId}`
- `POST /recording-sets/{recordingSetId}/clip-batches`
- `POST /recording-sets/{recordingSetId}/finalize`
- `POST /recording-sets/{recordingSetId}/tracks`
- `GET /series`
- `POST /series`
- `GET /series-content`
- `PUT /series-content/{contentId}`
- `GET /series/{seriesId}`
- `PUT /series/{seriesId}`
- `DELETE /series/{seriesId}`
- `GET /series/{seriesId}/creation`
- `PUT /series/{seriesId}/creation`
- `POST /series/{seriesId}/creation/control`
- `GET /series/{seriesId}/publishing`
- `PUT /series/{seriesId}/publishing`
- `POST /series/{seriesId}/publishing/control`
- `GET /story-kits`
- `POST /story-kits`
- `GET /story-kits/{storyKitId}`
- `PATCH /story-kits/{storyKitId}`
- `GET /styles`
- `GET /visual-styles`
- `GET /visuals/presets`
- `GET /voices`
- `GET /webhooks`
- `POST /webhooks`
- `GET /webhooks/{webhookId}`
- `DELETE /webhooks/{webhookId}`
- `GET /workspace`
- `GET /workspace/content/batches`
- `POST /workspace/content/batches`
- `POST /workspace/content/batches/quote`
- `GET /workspace/content/batches/{jobId}`
- `POST /workspace/content/batches/{jobId}/retry`
- `POST /workspace/content/review`
- `PUT /workspace/creative-budget`
- `GET /workspace/creative-usage`
- `GET /workspace/credits`
- `GET /workspace/hosted-work-quote`
- `DELETE /workspace/icon`
- `POST /workspace/icon/upload/init`
- `GET /workspace/intake-quote`
- `GET /workspace/knowledge`
- `PUT /workspace/knowledge`
- `GET /workspace/knowledge/context`
- `GET /workspace/knowledge/documents/{documentId}`
- `GET /workspace/knowledge/documents/{documentId}/export`
- `GET /workspace/knowledge/documents/{documentId}/history`
- `GET /workspace/knowledge/research`
- `POST /workspace/knowledge/research`
- `POST /workspace/knowledge/research/quote`
- `GET /workspace/knowledge/research/{jobId}`
- `POST /workspace/knowledge/research/{jobId}/cancel`
- `POST /workspace/knowledge/research/{jobId}/resume`
- `POST /workspace/knowledge/seed`
- `GET /workspace/media/assets`
- `POST /workspace/media/assets/batch-delete`
- `POST /workspace/media/assets/move`
- `GET /workspace/media/assets/{assetId}`
- `PATCH /workspace/media/assets/{assetId}`
- `GET /workspace/media/assets/{assetId}/clipping-status`
- `POST /workspace/media/assets/{assetId}/delete`
- `GET /workspace/media/assets/{assetId}/narration`
- `GET /workspace/media/assets/{assetId}/reframe-analysis`
- `POST /workspace/media/assets/{assetId}/reframe-analysis`
- `POST /workspace/media/assets/{assetId}/reframe-plan`
- `POST /workspace/media/assets/{assetId}/reframe-plan/apply`
- `POST /workspace/media/assets/{assetId}/reframe-plan/preview`
- `GET /workspace/media/assets/{assetId}/reframe-preflight`
- `GET /workspace/media/assets/{assetId}/short-suggestions`
- `POST /workspace/media/assets/{assetId}/short-suggestions`
- `POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/apply`
- `POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/thumbnail`
- `GET /workspace/media/assets/{assetId}/transcript`
- `GET /workspace/media/assets/{assetId}/upscale`
- `POST /workspace/media/assets/{assetId}/upscale`
- `GET /workspace/media/assets/{assetId}/verify`
- `GET /workspace/media/assets/{asset_id}/clip-batch`
- `GET /workspace/media/captures`
- `POST /workspace/media/captures`
- `POST /workspace/media/captures/quote`
- `GET /workspace/media/captures/{jobId}`
- `POST /workspace/media/captures/{jobId}/cancel`
- `POST /workspace/media/captures/{jobId}/resume`
- `GET /workspace/media/folders`
- `POST /workspace/media/folders`
- `PATCH /workspace/media/folders/{folderId}`
- `DELETE /workspace/media/folders/{folderId}`
- `POST /workspace/media/folders/{folderId}/empty`
- `POST /workspace/media/import/google-drive`
- `POST /workspace/media/import/youtube`
- `POST /workspace/media/upload/finalize`
- `POST /workspace/media/upload/init`
- `POST /workspace/media/upload/multipart/abort`
- `POST /workspace/media/upload/multipart/complete`
- `POST /workspace/media/upload/multipart/init`
- `POST /workspace/media/upload/multipart/parts`
- `GET /workspace/members`
- `POST /workspace/recipes/jobs`
- `GET /workspace/recipes/jobs/{jobId}`
- `POST /workspace/recipes/jobs/{jobId}/cancel`
- `POST /workspace/recipes/quote`
- `GET /workspace/settings`
- `PATCH /workspace/settings`
- `POST /workspace/stock-media/import`
- `GET /workspace/stock-media/search`
- `GET /workspace/storage`
- `GET /workspace/voices`
- `POST /workspace/voices`
- `GET /workspace/voices/{voiceId}`
- `POST /workspace/voices/{voiceId}/archive`

## Endpoints

### GET /
```http
GET /
```
Tag: Platform
Auth: API key
Operation ID: `getApiStatus`
API status
API status.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "status": "string",
  "name": "string",
  "version": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /admin/recovery/{resource_type}/{resource_id}
```http
GET /admin/recovery/{resource_type}/{resource_id}
```
Tag: Platform
Auth: API key
Operation ID: `getAdminRecoveryResourceTypeResourceId`
Inspect a workspace recovery resource
Inspect a workspace recovery resource.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
resource_type | path | yes | `string` (asset, clip-batch, export) | -
resource_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/admin/recovery/{resource_type}/{resource_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "resource_type": "asset",
  "resource_id": "string",
  "resource": {},
  "related": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /admin/recovery/{resource_type}/{resource_id}/execute
```http
POST /admin/recovery/{resource_type}/{resource_id}/execute
```
Tag: Platform
Auth: API key
Operation ID: `createAdminRecoveryResourceTypeResourceIdExecute`
Execute a workspace recovery action
Execute a workspace recovery action.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
resource_type | path | yes | `string` (asset, clip-batch, export) | -
resource_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/admin/recovery/{resource_type}/{resource_id}/execute" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"recover","reason":"string","dry_run":true,"confirm_destructive":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "resource_type": "asset",
  "resource_id": "string",
  "action": "recover",
  "dry_run": true,
  "result": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /admin/recovery/{resource_type}/{resource_id}/trigger-runs
```http
GET /admin/recovery/{resource_type}/{resource_id}/trigger-runs
```
Tag: Platform
Auth: API key
Operation ID: `getAdminRecoveryResourceTypeResourceIdTriggerRuns`
List Trigger runs for a workspace recovery resource
List Trigger runs for a workspace recovery resource.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
resource_type | path | yes | `string` (asset, clip-batch, export) | -
resource_id | path | yes | `string` | -
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/admin/recovery/{resource_type}/{resource_id}/trigger-runs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runs": [
    {
      "id": "string",
      "status": "string",
      "task_identifier": "string",
      "tags": [
        "string"
      ],
      "cost_in_cents": 0,
      "duration_ms": 0,
      "created_at": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /admin/recovery/{resource_type}/{resource_id}/trigger-runs/{run_id}/cancel
```http
POST /admin/recovery/{resource_type}/{resource_id}/trigger-runs/{run_id}/cancel
```
Tag: Platform
Auth: API key
Operation ID: `createAdminRecoveryResourceTypeResourceIdTriggerRunsRunIdCancel`
Cancel one Trigger run for a workspace recovery resource
Cancel one Trigger run for a workspace recovery resource.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
resource_type | path | yes | `string` (asset, clip-batch, export) | -
resource_id | path | yes | `string` | -
run_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/admin/recovery/{resource_type}/{resource_id}/trigger-runs/{run_id}/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string","confirm_destructive":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "run_id": "string",
  "status": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /ai-edit/runs/{runId}
```http
GET /ai-edit/runs/{runId}
```
Tag: Platform
Auth: API key
Operation ID: `getAiEditRunsRunId`
Get AI edit run
Get AI edit run.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/ai-edit/runs/{runId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run": {
    "id": "string",
    "project_id": "string",
    "organization_id": "string",
    "user_id": "string",
    "api_key_id": {},
    "execution_mode": "external_controller",
    "credit_mode": "external",
    "controller_kind": "api",
    "status": "queued",
    "style_id": "mirage-black",
    "quality_target": "fast",
    "run_config": {},
    "budget_receipt": {},
    "summary": {},
    "failure_message": {},
    "completed_at": {},
    "created_at": "string",
    "updated_at": "string"
  },
  "context": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /ai-edit/runs/{runId}/apply-style
```http
POST /ai-edit/runs/{runId}/apply-style
```
Tag: Platform
Auth: API key
Operation ID: `createAiEditRunsRunIdApplyStyle`
Apply AI edit style
Apply AI edit style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/apply-style" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dry_run":true,"title_text":{},"title_card_theme":"classic_white"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "run_id": "string",
  "project_id": "string",
  "style_id": "mirage-black",
  "receipts": [
    {
      "action": "string",
      "target_id": "string",
      "dry_run": true,
      "changes": {}
    }
  ],
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /ai-edit/runs/{runId}/complete
```http
POST /ai-edit/runs/{runId}/complete
```
Tag: Platform
Auth: API key
Operation ID: `createAiEditRunsRunIdComplete`
Complete AI edit run
Complete AI edit run.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/complete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"status":"completed","summary":"string","dry_run":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "run_id": "string",
  "status": "completed",
  "summary": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /ai-edit/runs/{runId}/logs
```http
GET /ai-edit/runs/{runId}/logs
```
Tag: Platform
Auth: API key
Operation ID: `getAiEditRunsRunIdLogs`
List AI edit run logs
List AI edit run logs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/logs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run_id": "string",
  "project_id": "string",
  "logs": [
    {
      "id": "string",
      "run_id": "string",
      "organization_id": "string",
      "project_id": "string",
      "kind": "string",
      "status": "string",
      "input": {},
      "output": {},
      "error_message": {},
      "created_at": "string"
    }
  ],
  "artifacts": [
    {
      "id": "string",
      "run_id": "string",
      "organization_id": "string",
      "project_id": "string",
      "artifact_type": "string",
      "time_seconds": {},
      "url": {},
      "storage_key": {},
      "metadata": {},
      "created_at": "string"
    }
  ],
  "bounds": {
    "logs": {
      "offset": 0,
      "limit": 0,
      "returned": 0,
      "truncated": true
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /ai-edit/runs/{runId}/logs
```http
POST /ai-edit/runs/{runId}/logs
```
Tag: Platform
Auth: API key
Operation ID: `createAiEditRunsRunIdLogs`
Append AI edit run log
Append AI edit run log.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/logs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"string","status":"queued","message":"string","metadata":{},"dry_run":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "run_id": "string",
  "log": {
    "id": "string",
    "run_id": "string",
    "organization_id": "string",
    "project_id": "string",
    "kind": "string",
    "status": "string",
    "input": {},
    "output": {},
    "error_message": {},
    "created_at": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /ai-edit/runs/{runId}/snapshots
```http
POST /ai-edit/runs/{runId}/snapshots
```
Tag: Platform
Auth: API key
Operation ID: `createAiEditRunsRunIdSnapshots`
Render AI edit snapshots
Render AI edit snapshots.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/snapshots" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dry_run":true,"times":[0],"target_width":0,"image_format":"jpeg"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "run_id": "string",
  "project_id": "string",
  "snapshots": [
    {
      "artifact_id": {},
      "preview_url": {},
      "storage_key": {},
      "frame": {},
      "time_seconds": 0,
      "width": {},
      "height": {},
      "image_format": "jpeg"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /ai-edit/runs/{runId}/validate
```http
POST /ai-edit/runs/{runId}/validate
```
Tag: Platform
Auth: API key
Operation ID: `createAiEditRunsRunIdValidate`
Validate AI edit style
Validate AI edit style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/ai-edit/runs/{runId}/validate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"dry_run":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "run_id": "string",
  "project_id": "string",
  "passed": true,
  "checks": [
    {
      "rule": "string",
      "passed": true,
      "message": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /ai-edit/styles
```http
GET /ai-edit/styles
```
Tag: Platform
Auth: API key
Operation ID: `getAiEditStyles`
List AI edit styles
List AI edit styles.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/ai-edit/styles" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "styles": [
    {
      "id": "mirage-black",
      "name": "string",
      "description": "string",
      "preview_image_path": "string",
      "manual_skill": {
        "type": "local_skill",
        "path": "string",
        "style_json_path": "string"
      },
      "spec": {}
    }
  ],
  "total": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /analytics/posts
```http
GET /analytics/posts
```
Tag: Platform
Auth: API key
Operation ID: `getAnalyticsPosts`
Read saved post counters and optional detailed provider reports
Read saved post counters and optional detailed provider reports.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
platform | query | no | `string` (all, youtube, instagram, facebook, tiktok) | -
range | query | no | `string` (7d, 30d, 90d, all) | -
connection_id | query | no | `string` | -
search | query | no | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -
include_details | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/analytics/posts" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "posts": [
    {
      "id": "string",
      "connectionId": "string",
      "platform": "youtube",
      "remotePostId": "string",
      "title": {},
      "caption": {},
      "publishedAt": {},
      "remoteUrl": {},
      "mediaKind": "string",
      "capturedAt": {},
      "lastCheckedAt": {},
      "metricsStatus": "string",
      "views": {},
      "reach": {},
      "likes": {},
      "comments": {},
      "shares": {},
      "saves": {},
      "videoInsights": {},
      "readiness": {
        "status": "ready",
        "freshness": "fresh",
        "nextAction": "read"
      }
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "returned": 0,
    "total": 0,
    "hasMore": true,
    "truncated": true
  },
  "window": {
    "range": "string",
    "basis": "publication_date",
    "counters": "lifetime_at_capture",
    "timeZone": "UTC"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /analytics/posts/{mediaId}
```http
GET /analytics/posts/{mediaId}
```
Tag: Platform
Auth: API key
Operation ID: `getAnalyticsPostsMediaId`
Read one saved post with retention and watch reports when available
Read one saved post with retention and watch reports when available.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
mediaId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/analytics/posts/{mediaId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "connectionId": "string",
  "platform": "youtube",
  "remotePostId": "string",
  "title": {},
  "caption": {},
  "publishedAt": {},
  "remoteUrl": {},
  "mediaKind": "string",
  "capturedAt": {},
  "lastCheckedAt": {},
  "metricsStatus": "string",
  "views": {},
  "reach": {},
  "likes": {},
  "comments": {},
  "shares": {},
  "saves": {},
  "videoInsights": {
    "schemaVersion": 1,
    "capturedAt": "string",
    "source": "youtube_analytics",
    "period": {
      "start": {},
      "end": {},
      "basis": "lifetime"
    },
    "reports": [
      {}
    ]
  },
  "readiness": {
    "status": "ready",
    "freshness": "fresh",
    "nextAction": "read",
    "retryAfter": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /analytics/posts/{mediaId}/refresh
```http
POST /analytics/posts/{mediaId}/refresh
```
Tag: Platform
Auth: API key
Operation ID: `createAnalyticsPostsMediaIdRefresh`
Queue detailed analytics collection; does not publish or change basic counters
Queue detailed analytics collection; does not publish or change basic counters.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
mediaId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/analytics/posts/{mediaId}/refresh" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "mediaId": "string",
  "runId": "string",
  "status": "queued",
  "polling": {
    "shouldPoll": true,
    "nextPollAfterMs": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /analytics/posts/{mediaId}/refresh/{runId}
```http
GET /analytics/posts/{mediaId}/refresh/{runId}
```
Tag: Platform
Auth: API key
Operation ID: `getAnalyticsPostsMediaIdRefreshRunId`
Follow an authorized refresh to completion, failure, or unavailable data
Follow an authorized refresh to completion, failure, or unavailable data.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
mediaId | path | yes | `string` | -
runId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/analytics/posts/{mediaId}/refresh/{runId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "mediaId": "string",
  "runId": "string",
  "status": "queued",
  "outcome": "refreshed",
  "polling": {
    "shouldPoll": true,
    "nextPollAfterMs": 0
  },
  "post": {
    "id": "string",
    "connectionId": "string",
    "platform": "youtube",
    "remotePostId": "string",
    "title": {},
    "caption": {},
    "publishedAt": {},
    "remoteUrl": {},
    "mediaKind": "string",
    "capturedAt": {},
    "lastCheckedAt": {},
    "metricsStatus": "string",
    "views": {},
    "reach": {},
    "likes": {},
    "comments": {},
    "shares": {},
    "saves": {},
    "videoInsights": {},
    "readiness": {
      "status": "ready",
      "freshness": "fresh",
      "nextAction": "read"
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /audio-library/import
```http
POST /audio-library/import
```
Tag: Platform
Auth: API key
Operation ID: `importAudioLibraryAsset`
Import provider audio into workspace media
Import provider audio into workspace media.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/audio-library/import" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provider":"openverse","external_id":"string","folder_id":"string","project_id":"string","start_seconds":0,"duration_seconds":0,"volume":0,"fade_in_seconds":0,"fade_out_seconds":0,"loop":true,"audio_type":"music"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset": {
    "id": "string",
    "name": "string",
    "asset_type": "audio",
    "audio_type": "string",
    "duration_seconds": {},
    "source_url": "string",
    "license_code": "string",
    "license_url": {},
    "attribution_text": {}
  },
  "imported": true,
  "deduped": true,
  "timeline_item_id": {},
  "txid": {},
  "provider_request": {
    "provider": "openverse",
    "external_id": "string",
    "retryable": true,
    "imported_at": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /audio-library/search
```http
GET /audio-library/search
```
Tag: Platform
Auth: API key
Operation ID: `searchAudioLibrary`
Search free-to-use audio providers
Search free-to-use audio providers.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
query | query | yes | `string` | -
provider | query | no | `string` (all, openverse, freesound, wikimedia, remotion) | -
license | query | no | `string` (cc0, public_domain, no_attribution, attribution, all) | -
audio_type | query | no | `string` (music, sound_effect, ambient, other) | -
min_duration_seconds | query | no | `object` | -
max_duration_seconds | query | no | `object` | -
limit | query | no | `integer` | -
page | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/audio-library/search" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "provider": "openverse",
      "external_id": "string",
      "title": "string",
      "creator_name": {},
      "creator_url": {},
      "source_url": "string",
      "preview_url": {},
      "download_url": {},
      "duration_seconds": {},
      "license_code": "string",
      "license_url": {},
      "requires_attribution": true,
      "attribution_text": {},
      "commercial_use_allowed": true,
      "tags": [
        "string"
      ]
    }
  ],
  "warnings": [
    "string"
  ],
  "providers": [
    "openverse"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /auth/validate
```http
GET /auth/validate
```
Tag: Platform
Auth: API key
Operation ID: `validateAuth`
Validate API key
Validate API key.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/auth/validate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "organization_id": "string",
  "user_id": "string",
  "plan": "string",
  "environment": "live",
  "key_prefix": "string",
  "docs_url": "string",
  "openapi_url": "string",
  "agent_skills": {
    "manifest_url": "string",
    "recommended": [
      "string"
    ],
    "minimum_updated_after": "string"
  },
  "publishing": {
    "publish": true,
    "schedule": true,
    "grant": "admin"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /caption-looks
```http
GET /caption-looks
```
Tag: Captions and Themes
Auth: API key
Operation ID: `listCaptionLooks`
List caption looks
List caption looks.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/caption-looks" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "looks": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "settings": {}
    }
  ],
  "total": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /caption-presets
```http
GET /caption-presets
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getCaptionPresets`
List legacy caption preset aliases
List legacy caption preset aliases.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/caption-presets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "presets": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "settings": {}
    }
  ],
  "total": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /caption-themes
```http
GET /caption-themes
```
Tag: Captions and Themes
Auth: API key
Operation ID: `listCaptionThemes`
List caption themes
List caption themes.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/caption-themes" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "themes": [
    {
      "id": "string",
      "name": "string",
      "description": {},
      "settings": {},
      "is_public": true,
      "usage_count": 0,
      "created_at": {},
      "updated_at": {},
      "is_default": true
    }
  ],
  "total": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /caption-themes
```http
POST /caption-themes
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createCaptionTheme`
Create caption theme
Create caption theme.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/caption-themes" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","settings":{"fontSize":0,"fontFamily":"string","fontWeight":"string","fontStyle":"normal","color":"string","backgroundColor":"string","borderRadius":0,"textAlign":"left","activeWordScale":0,"activeWordTransition":"spring","activeWordLayout":"reserved","phraseAppearance":"standard","karaoke":"standard","slidingHighlight":true,"captionMotion":"none","lineWrap":"balanced","customPositionAnchor":"top","emphasisFontStyle":"normal","activeWordColor":"string","activeWordBackgroundColor":"string","activeWordAnimation":"highlight","emojiOverlaySizePx":0,"showActiveWord":true,"maxLinesPerCaption":0,"lineHeight":0,"letterSpacing":0,"wordSpacingPx":{},"position":"bottom","customPositionY":{},"textShadow":"string","shadowMode":"text-shadow","border":"string","textFillStyle":"solid","textGradientFrom":"string","textGradientTo":"string","textGradientAngleDeg":0,"textGradientStops":{},"textStrokeEnabled":true,"textStrokeColor":"string","textStrokeWidthPx":0,"textStrokeBlurPx":0,"wordRevealAnimation":"none","wordsPerLineLimit":{},"activeWordHoldMs":0,"spokenWordColorDurationMs":0,"paragraphMode":"off","paragraphTransition":"fade","paragraphFadeMs":0,"revealMode":"single","paragraphReveal":"sequential","pageCombineMs":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "description": {},
  "settings": {},
  "is_public": true,
  "usage_count": 0,
  "created_at": {},
  "updated_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /caption-themes/preview
```http
POST /caption-themes/preview
```
Tag: Captions and Themes
Auth: API key
Operation ID: `previewCaptionTheme`
Preview caption theme
Preview caption theme.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/caption-themes/preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"settings":{"fontSize":0,"fontFamily":"string","fontWeight":"string","fontStyle":"normal","color":"string","backgroundColor":"string","borderRadius":0,"textAlign":"left","activeWordScale":0,"activeWordTransition":"spring","activeWordLayout":"reserved","phraseAppearance":"standard","karaoke":"standard","slidingHighlight":true,"captionMotion":"none","lineWrap":"balanced","customPositionAnchor":"top","emphasisFontStyle":"normal","activeWordColor":"string","activeWordBackgroundColor":"string","activeWordAnimation":"highlight","emojiOverlaySizePx":0,"showActiveWord":true,"maxLinesPerCaption":0,"lineHeight":0,"letterSpacing":0,"wordSpacingPx":{},"position":"bottom","customPositionY":{},"textShadow":"string","shadowMode":"text-shadow","border":"string","textFillStyle":"solid","textGradientFrom":"string","textGradientTo":"string","textGradientAngleDeg":0,"textGradientStops":{},"textStrokeEnabled":true,"textStrokeColor":"string","textStrokeWidthPx":0,"textStrokeBlurPx":0,"wordRevealAnimation":"none","wordsPerLineLimit":{},"activeWordHoldMs":0,"spokenWordColorDurationMs":0,"paragraphMode":"off","paragraphTransition":"fade","paragraphFadeMs":0,"revealMode":"single","paragraphReveal":"sequential","pageCombineMs":0},"sample_text":"string","aspect_ratio":"9:16","target_width":0,"image_format":"png"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "preview_url": "string",
  "expires_at": "string",
  "width": 0,
  "height": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /caption-themes/{themeId}
```http
GET /caption-themes/{themeId}
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getCaptionTheme`
Get caption theme
Get caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
themeId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/caption-themes/THEME_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "description": {},
  "settings": {},
  "is_public": true,
  "usage_count": 0,
  "created_at": {},
  "updated_at": {},
  "is_default": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /caption-themes/{themeId}
```http
PATCH /caption-themes/{themeId}
```
Tag: Captions and Themes
Auth: API key
Operation ID: `updateCaptionTheme`
Update caption theme
Update caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
themeId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/caption-themes/THEME_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","settings":{"fontSize":0,"fontFamily":"string","fontWeight":"string","fontStyle":"normal","color":"string","backgroundColor":"string","borderRadius":0,"textAlign":"left","activeWordScale":0,"activeWordTransition":"spring","activeWordLayout":"reserved","phraseAppearance":"standard","karaoke":"standard","slidingHighlight":true,"captionMotion":"none","lineWrap":"balanced","customPositionAnchor":"top","emphasisFontStyle":"normal","activeWordColor":"string","activeWordBackgroundColor":"string","activeWordAnimation":"highlight","emojiOverlaySizePx":0,"showActiveWord":true,"maxLinesPerCaption":0,"lineHeight":0,"letterSpacing":0,"wordSpacingPx":{},"position":"bottom","customPositionY":{},"textShadow":"string","shadowMode":"text-shadow","border":"string","textFillStyle":"solid","textGradientFrom":"string","textGradientTo":"string","textGradientAngleDeg":0,"textGradientStops":{},"textStrokeEnabled":true,"textStrokeColor":"string","textStrokeWidthPx":0,"textStrokeBlurPx":0,"wordRevealAnimation":"none","wordsPerLineLimit":{},"activeWordHoldMs":0,"spokenWordColorDurationMs":0,"paragraphMode":"off","paragraphTransition":"fade","paragraphFadeMs":0,"revealMode":"single","paragraphReveal":"sequential","pageCombineMs":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "description": {},
  "settings": {},
  "is_public": true,
  "usage_count": 0,
  "created_at": {},
  "updated_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /caption-themes/{themeId}
```http
DELETE /caption-themes/{themeId}
```
Tag: Captions and Themes
Auth: API key
Operation ID: `deleteCaptionTheme`
Delete caption theme
Delete caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
themeId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/caption-themes/THEME_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /caption-themes/{themeId}/duplicate
```http
POST /caption-themes/{themeId}/duplicate
```
Tag: Captions and Themes
Auth: API key
Operation ID: `duplicateCaptionTheme`
Duplicate caption theme
Duplicate caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
themeId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/caption-themes/THEME_ID/duplicate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "description": {},
  "settings": {},
  "is_public": true,
  "usage_count": 0,
  "created_at": {},
  "updated_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /caption-themes/{themeId}/set-default
```http
POST /caption-themes/{themeId}/set-default
```
Tag: Captions and Themes
Auth: API key
Operation ID: `setDefaultCaptionTheme`
Set workspace default caption theme
Set workspace default caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
themeId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/caption-themes/THEME_ID/set-default" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "scope": "workspace",
  "workspace_id": "string",
  "default_caption_theme_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/compile
```http
POST /carousels/compile
```
Tag: Project Management
Auth: API key
Operation ID: `compileCarousel`
Compile a carousel from a slide document
Create or replace a carousel project from declarative slides. The server owns chip layout, safezones, and export frame. POST /projects/{projectId}/carousels/generate is a legacy adapter onto the same compile.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/compile" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"tiktok_photo","name":"string","locale":"string","project_id":"string","series_id":"string","clear_existing":true,"slides":[{"role":"hook","lines":["string"],"slots":{},"visual":{"kind":"creative_source","media_asset_id":"string","prompt":"string","model_id":"string","color":"string","colors":[null],"html":"string","template_id":"string","source_media_asset_id":"string","creative_artifact_id":"string","crop":{}},"layout":"chip_stack_ui","layout_overrides":{"top_px":0}}],"style":{"chip":{"font_family":"string","font_weight":0,"font_size":0,"color":"string","background":"string","padding_x":0,"padding_y":0,"radius":0,"max_lines_per_chip":0}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "platform": "tiktok_photo",
  "slide_count": 0,
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "timeline_item_ids": [
        "string"
      ],
      "overlay_ids": [
        "string"
      ],
      "layout_applied": "chip_stack_ui",
      "chip_band_px": {
        "top": 0,
        "bottom": 0
      }
    }
  ],
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "job_id": {},
  "ai_image_run_id": {},
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/recipes/{recipe_id}/expand
```http
POST /carousels/recipes/{recipe_id}/expand
```
Tag: Project Management
Auth: API key
Operation ID: `expandCarouselRecipe`
Expand a carousel recipe into a slot document
Turn a named recipe or a brief into compile-ready slides. Expand never publishes and never invents metrics.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recipe_id | path | yes | `string` (curiosity_gap_ugc_7, result_first_demo_6, myth_guillotine_8, before_after_5, from_brief) | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/recipes/{recipe_id}/expand" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"locale":"string","platform":"tiktok_photo","name":"string","brief":"string","inputs":{"audience":"string","product":"string","offer":"string","proof_mode":"string"},"visuals":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recipe_id": "curiosity_gap_ugc_7",
  "name": "string",
  "locale": {},
  "platform": "tiktok_photo",
  "slides": [
    {
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {}
      },
      "layout": "chip_stack_ui",
      "layout_overrides": {
        "top_px": 0
      }
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /carousels/{projectId}
```http
GET /carousels/{projectId}
```
Tag: Project Management
Auth: API key
Operation ID: `getCarousel`
Get the carousel slot document
Return the compile slot document and named template catalog for a carousel project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/carousels/PROJECT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /carousels/{projectId}
```http
PATCH /carousels/{projectId}
```
Tag: Project Management
Auth: API key
Operation ID: `updateCarouselDocument`
Edit carousel slide order and platform format
Mutate the compiled slide list at expected_revision. Format requires platform and resizes retained frames; undo restores the prior format.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/carousels/PROJECT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":0,"op":"reorder","platform":"tiktok_photo","from":0,"to":0,"index":0,"template_id":"string","source_index":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ],
  "txid": 0,
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "string",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/{projectId}/clone
```http
POST /carousels/{projectId}/clone
```
Tag: Project Management
Auth: API key
Operation ID: `cloneCarousel`
Clone a carousel onto a new project
Copy the slot document, platform frame, and still references onto a new carousel project. Does not re-raster. Icon slots may be pack filenames or asset:<media_asset_id>.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/PROJECT_ID/clone" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/{projectId}/kit
```http
POST /carousels/{projectId}/kit
```
Tag: Project Management
Auth: API key
Operation ID: `kitCarousel`
Save or apply carousel themes and templates
Snapshot or apply a theme, brand theme, or named slide template. Themes rewrite slot looks, overlay, and logo asset:<id> values. Never persist signed URLs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/PROJECT_ID/kit" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"save_theme","name":"string","scope":"project","theme_id":"string","saved_template_id":"string","slide_index":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/{projectId}/migrate
```http
POST /carousels/{projectId}/migrate
```
Tag: Project Management
Auth: API key
Operation ID: `migrateCarousel`
Migrate a legacy overlay carousel onto slots
Rebuild a compile document from timeline media and title/body overlays.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/PROJECT_ID/migrate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /carousels/{projectId}/preview
```http
POST /carousels/{projectId}/preview
```
Tag: Project Management
Auth: API key
Operation ID: `previewCarousel`
Preview compiled carousel slides as stills
Render JPEG stills for selected slides at the exact platform frame (TikTok photo is 1080x1920). Returns signed image URLs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/carousels/PROJECT_ID/preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"idempotencyKey":"string","chrome":"tiktok","slide_indexes":[0]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "platform": "tiktok_photo",
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "slides": [
    {
      "index": 0,
      "preview_url": "string",
      "width": 0,
      "height": 0,
      "expires_at": "string",
      "print": "slots"
    }
  ],
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /carousels/{projectId}/slide
```http
PATCH /carousels/{projectId}/slide
```
Tag: Project Management
Auth: API key
Operation ID: `updateCarouselSlide`
Patch one carousel slide
Patch native slots/media or select a completed custom Remotion frame artifact and crop at the expected revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/carousels/PROJECT_ID/slide" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":0,"slide_index":0,"slots":{},"lines":["string"],"template_id":"string","media_asset_id":"string","creative_artifact_id":"string","crop":{"left":0,"top":0,"width":0,"height":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "name": "string",
  "platform": "tiktok_photo",
  "locale": {},
  "frame": {
    "width": 0,
    "height": 0,
    "aspect_ratio": "string"
  },
  "style": {
    "chip": {
      "font_family": "string",
      "font_size": 0,
      "color": "string",
      "background": "string",
      "padding_x": 0,
      "padding_y": 0,
      "radius": 0,
      "max_lines_per_chip": 0
    }
  },
  "slides": [
    {
      "index": 0,
      "role": "hook",
      "lines": [
        "string"
      ],
      "slots": {},
      "layout": "chip_stack_ui",
      "visual": {
        "kind": "creative_source",
        "media_asset_id": "string",
        "prompt": "string",
        "model_id": "string",
        "color": "string",
        "colors": [
          null
        ],
        "html": "string",
        "template_id": "string",
        "source_media_asset_id": "string",
        "creative_artifact_id": "string",
        "crop": {},
        "creative_source": {}
      },
      "photo_url": "string",
      "slot_urls": {}
    }
  ],
  "templates": [
    {
      "id": "string",
      "label": "string",
      "family": "photo",
      "slots": [
        {}
      ]
    }
  ],
  "kit": {
    "themes": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "fontFamily": "string",
        "titleColor": "string",
        "bodyColor": "string",
        "background": "string",
        "pageColor": "string",
        "overlayEnabled": true,
        "overlayOpacity": 0
      }
    ],
    "templates": [
      {
        "id": "string",
        "name": "string",
        "scope": "project",
        "template_id": "string",
        "slots": {}
      }
    ],
    "active_theme_id": "string"
  },
  "font_faces": [
    {
      "family": "string",
      "src": "string",
      "weight": "string",
      "style": "normal",
      "unicodeRange": "string"
    }
  ],
  "can_undo": true,
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": "string",
      "repair": "string"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ],
  "txid": 0,
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "string",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /characters
```http
GET /characters
```
Tag: AI Generation
Auth: API key
Operation ID: `getCharacters`
List workspace characters
Lists reusable workspace characters and their approved reference asset IDs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
include_archived | query | no | `boolean` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/characters" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "type": "human",
      "status": "draft",
      "consistency_mode": "reference",
      "species": {},
      "canonical_description": {},
      "story_facts": [
        "string"
      ],
      "default_voice_id": {},
      "default_voice_style": {},
      "folder_id": "string",
      "primary_reference_asset_id": "string",
      "references": [
        {}
      ],
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "total": 0,
  "returned": 0,
  "limit": 0,
  "offset": 0,
  "has_more": true,
  "truncated": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters
```http
POST /characters
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharacters`
Create workspace character
Creates a reusable character from existing workspace image asset IDs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","type":"human","consistency_mode":"reference","species":"string","canonical_description":"string","story_facts":["string"],"default_voice_id":"string","default_voice_style":"string","reference_asset_ids":["string"],"primary_reference_asset_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "type": "human",
  "status": "draft",
  "consistency_mode": "reference",
  "species": {},
  "canonical_description": {},
  "story_facts": [
    "string"
  ],
  "default_voice_id": {},
  "default_voice_style": {},
  "folder_id": "string",
  "primary_reference_asset_id": "string",
  "references": [
    {
      "asset_id": "string",
      "name": {},
      "order_index": 0,
      "is_primary": true
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /characters/{characterId}
```http
GET /characters/{characterId}
```
Tag: AI Generation
Auth: API key
Operation ID: `getCharactersCharacterId`
Get workspace character
Get workspace character.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/characters/{characterId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "type": "human",
  "status": "draft",
  "consistency_mode": "reference",
  "species": {},
  "canonical_description": {},
  "story_facts": [
    "string"
  ],
  "default_voice_id": {},
  "default_voice_style": {},
  "folder_id": "string",
  "primary_reference_asset_id": "string",
  "references": [
    {
      "asset_id": "string",
      "name": {},
      "order_index": 0,
      "is_primary": true
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /characters/{characterId}
```http
PATCH /characters/{characterId}
```
Tag: AI Generation
Auth: API key
Operation ID: `updateCharactersCharacterId`
Update workspace character
Update workspace character.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/characters/{characterId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","type":"human","consistency_mode":"reference","species":"string","canonical_description":"string","story_facts":["string"],"default_voice_id":"string","default_voice_style":"string","add_reference_asset_ids":["string"],"primary_reference_asset_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "type": "human",
  "status": "draft",
  "consistency_mode": "reference",
  "species": {},
  "canonical_description": {},
  "story_facts": [
    "string"
  ],
  "default_voice_id": {},
  "default_voice_style": {},
  "folder_id": "string",
  "primary_reference_asset_id": "string",
  "references": [
    {
      "asset_id": "string",
      "name": {},
      "order_index": 0,
      "is_primary": true
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters/{characterId}/archive
```http
POST /characters/{characterId}/archive
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharactersCharacterIdArchive`
Archive workspace character
Archive workspace character.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters/{characterId}/archive" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "type": "human",
  "status": "draft",
  "consistency_mode": "reference",
  "species": {},
  "canonical_description": {},
  "story_facts": [
    "string"
  ],
  "default_voice_id": {},
  "default_voice_style": {},
  "folder_id": "string",
  "primary_reference_asset_id": "string",
  "references": [
    {
      "asset_id": "string",
      "name": {},
      "order_index": 0,
      "is_primary": true
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters/{characterId}/describe
```http
POST /characters/{characterId}/describe
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharactersCharacterIdDescribe`
Describe character from its primary reference
Writes canonical_description from the primary reference image with a vision model (one prompt-enhancement spend). Keeps an existing description unless overwrite is true. The description is added to image and video prompts that use the character.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters/{characterId}/describe" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"overwrite":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "description": "string",
  "updated": true,
  "character": {
    "id": "string",
    "name": "string",
    "type": "human",
    "status": "draft",
    "consistency_mode": "reference",
    "species": {},
    "canonical_description": {},
    "story_facts": [
      "string"
    ],
    "default_voice_id": {},
    "default_voice_style": {},
    "folder_id": "string",
    "primary_reference_asset_id": "string",
    "references": [
      {
        "asset_id": "string",
        "name": {},
        "order_index": 0,
        "is_primary": true
      }
    ],
    "created_at": "string",
    "updated_at": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters/{characterId}/primary-reference
```http
POST /characters/{characterId}/primary-reference
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharactersCharacterIdPrimaryReference`
Set primary character reference
Set primary character reference.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters/{characterId}/primary-reference" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "type": "human",
  "status": "draft",
  "consistency_mode": "reference",
  "species": {},
  "canonical_description": {},
  "story_facts": [
    "string"
  ],
  "default_voice_id": {},
  "default_voice_style": {},
  "folder_id": "string",
  "primary_reference_asset_id": "string",
  "references": [
    {
      "asset_id": "string",
      "name": {},
      "order_index": 0,
      "is_primary": true
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters/{characterId}/references
```http
POST /characters/{characterId}/references
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharactersCharacterIdReferences`
Add character reference images
Add character reference images.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters/{characterId}/references" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_ids":["string"]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "added_count": 0,
  "requested_count": 0,
  "skipped_count": 0,
  "character": {
    "id": "string",
    "name": "string",
    "type": "human",
    "status": "draft",
    "consistency_mode": "reference",
    "species": {},
    "canonical_description": {},
    "story_facts": [
      "string"
    ],
    "default_voice_id": {},
    "default_voice_style": {},
    "folder_id": "string",
    "primary_reference_asset_id": "string",
    "references": [
      {
        "asset_id": "string",
        "name": {},
        "order_index": 0,
        "is_primary": true
      }
    ],
    "created_at": "string",
    "updated_at": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /characters/{characterId}/sheets
```http
POST /characters/{characterId}/sheets
```
Tag: AI Generation
Auth: API key
Operation ID: `createCharactersCharacterIdSheets`
Generate a character sheet
Generates a turnaround (front, three-quarter, profile, full body) or expressions sheet from the character's references. The finished image is added to the character's references. Priced like generate-image at the sheet size; see generation options.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
characterId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/characters/{characterId}/sheets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"turnaround","model":"fal-ai/gpt-image-1"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clip-batches/{batch_id}
```http
GET /clip-batches/{batch_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipBatchesBatchId`
Get a clip batch
Get a clip batch.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
batch_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clip-batches/{batch_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "batch": {
    "batch_id": "string",
    "status": "string",
    "asset_id": "string",
    "project_folder_id": {},
    "estimated_clip_count": 0,
    "total_clip_count": 0,
    "rendered_count": 0,
    "failed_count": 0,
    "review_count": 0,
    "activity": {},
    "clips": [
      {
        "clip_id": "string",
        "suggestion_id": {},
        "project_id": {},
        "export_id": {},
        "title": "string",
        "status": "string",
        "download_url": {},
        "error_message": {},
        "qa_summary": {},
        "qa_preview_urls": [
          null
        ],
        "checking": true,
        "thumbnail_url": {},
        "score": {}
      }
    ],
    "zip_download_url": {},
    "last_error_message": {},
    "studio_sound": {
      "requested": true,
      "status": "disabled",
      "source_asset_id": {},
      "enhanced_asset_id": {},
      "version": {},
      "processing_run_id": {},
      "error_message": {}
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /clip-batches/{batch_id}
```http
DELETE /clip-batches/{batch_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `deleteClipBatchesBatchId`
Delete a terminal clip batch
Deletes the batch and its clip records. Projects and exports are retained by default; pass delete_projects_and_exports for explicit cascading soft deletion. Active batches and shared projects are protected.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
batch_id | path | yes | `string` | -
retention | query | no | `string` (retain_projects_and_exports, delete_projects_and_exports) | -
dry_run | query | no | `boolean` | -
confirm_delete | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/clip-batches/{batch_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "batch_id": "string",
  "status": "string",
  "retention": "retain_projects_and_exports",
  "dry_run": true,
  "clip_ids": [
    "string"
  ],
  "project_ids": [
    "string"
  ],
  "export_ids": [
    "string"
  ],
  "shared_project_ids": [
    "string"
  ],
  "deleted_batch_count": 0,
  "deleted_clip_count": 0,
  "deleted_project_count": 0,
  "deleted_export_count": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clip-batches/{batch_id}/archive
```http
GET /clip-batches/{batch_id}/archive
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipBatchArchive`
Get a download URL for a clip batch ZIP
Returns a signed ZIP URL when the archive of accepted clips is stored. Otherwise queues the archive and returns preparing with retry_after_seconds, or unavailable when the batch has no downloadable clips.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
batch_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clip-batches/{batch_id}/archive" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "status": "ready",
  "batch_id": "string",
  "download_url": "string",
  "file_name": "string",
  "expires_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clip-batches/{batch_id}/realtime-token
```http
GET /clip-batches/{batch_id}/realtime-token
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipBatchesBatchIdRealtimeToken`
Get a scoped realtime token for a clip batch
Get a scoped realtime token for a clip batch.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
batch_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clip-batches/{batch_id}/realtime-token" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "access_token": "string",
  "expires_at": "string",
  "url": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clip-batches/{batch_id}/recover
```http
POST /clip-batches/{batch_id}/recover
```
Tag: Clip Creation
Auth: API key
Operation ID: `recoverClipBatch`
Refill a terminal clip batch
Preserves accepted clips and creates an official recovery batch in the same project folder for the missing count.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
batch_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clip-batches/{batch_id}/recover" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target_clip_count":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "source_batch_id": "string",
  "recovery_batch_id": {},
  "project_folder_id": "string",
  "status": "satisfied",
  "target_clip_count": 0,
  "retained_clip_count": 0,
  "refill_clip_count": 0,
  "unfilled_clip_count": 0,
  "processing_run_id": {},
  "queue_reason": {},
  "next_action": "poll",
  "duration_policy": {
    "mode": "quality_first",
    "target_max_seconds": {},
    "suggestion_boundaries_preserved": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clip-share-pages/{asset_id}
```http
GET /clip-share-pages/{asset_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipSharePage`
Get a clip share page
Get a clip share page.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
asset_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clip-share-pages/{asset_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "exists": true,
  "enabled": true,
  "share_url": {},
  "allow_downloads": true,
  "title": {},
  "description": "string",
  "hidden_clip_ids": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clip-share-pages/{asset_id}
```http
POST /clip-share-pages/{asset_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `setClipSharePageEnabled`
Publish, unpublish, or update clip share page metadata
Publish, unpublish, or update clip share page metadata.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
asset_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clip-share-pages/{asset_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"enabled":true,"title":"string","description":"string","allow_downloads":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "exists": true,
  "enabled": true,
  "share_url": {},
  "allow_downloads": true,
  "title": {},
  "description": "string",
  "hidden_clip_ids": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clip-share-pages/{asset_id}/clips/{clip_id}/visibility
```http
POST /clip-share-pages/{asset_id}/clips/{clip_id}/visibility
```
Tag: Clip Creation
Auth: API key
Operation ID: `setClipSharePageClipVisibility`
Set clip visibility on a share page
Set clip visibility on a share page.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
asset_id | path | yes | `string` | -
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clip-share-pages/{asset_id}/clips/{clip_id}/visibility" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"visibility":"visible"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "clip_id": "string",
  "visibility": "visible"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clipping-projects
```http
GET /clipping-projects
```
Tag: Clip Creation
Auth: API key
Operation ID: `listClippingProjects`
List clipping projects
Lists source videos that have clip batches, one entry per source with its latest batch status and clip counts. Newest activity first by default.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
search | query | no | `string` | -
page | query | no | `integer` | -
limit | query | no | `integer` | -
sort_by | query | no | `string` (updated_at, name) | -
sort_direction | query | no | `string` (asc, desc) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clipping-projects" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clipping_projects": [
    {
      "asset_id": "string",
      "name": "string",
      "import_source": "string",
      "thumbnail_url": {},
      "duration_seconds": 0,
      "updated_at": "string",
      "status": "queued",
      "activity": "processing",
      "clip_count": 0,
      "ready_count": 0,
      "failed_count": 0,
      "exported_count": 0,
      "downloaded_count": 0
    }
  ],
  "total_count": 0,
  "page": 0,
  "limit": 0,
  "has_more": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clips
```http
GET /clips
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClips`
List clips
List clips.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
asset_id | query | no | `string` | -
project_id | query | no | `string` | -
status | query | no | `string` (preparing_source, awaiting_suggestions, selecting_clip, assembling, qa_running, needs_reselection, needs_repair, ready, exporting, exported, failed) | -
limit | query | no | `number` | -
offset | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clips" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clips": [
    {
      "clip_id": "string",
      "project_id": {},
      "requested_project_name": {},
      "requested_clip_preset_id": "default",
      "status": "preparing_source",
      "next_action": "poll",
      "error": {},
      "blocking_error": {},
      "waiting_reason": {},
      "status_detail": {},
      "source": {
        "source_type": "asset",
        "asset_id": {},
        "youtube_url": {},
        "source_status": "pending",
        "transcript_status": "pending",
        "suggestions_status": "pending",
        "suggestion_counts": {},
        "suggestion_ai_run_ids": [
          null
        ],
        "analysis_status": "missing",
        "analysis_version": {},
        "canonical_duration_seconds": {},
        "processing": {},
        "suitability": {},
        "readiness_warnings": [
          null
        ]
      },
      "selection": {
        "selection_mode": "auto_best",
        "requested_suggestion_id": {},
        "applied_suggestion_id": {},
        "alternatives": [
          null
        ]
      },
      "clip_window": {
        "start_seconds": {},
        "end_seconds": {},
        "duration_seconds": {}
      },
      "layout": {
        "requested_mode": "auto",
        "tutorial_stack_ratio": "screen_70_face_30",
        "applied_mode": "split",
        "primary_layout": {},
        "speaker_aware_applied": true,
        "fallback_used": true,
        "fallback_reason": {},
        "requested_mode_honored": true,
        "segments": [
          null
        ],
        "warnings": [
          null
        ]
      },
      "captions": {
        "enabled": true,
        "style_id": {},
        "status": "pending",
        "clip_window_aware": true,
        "item_count": 0,
        "warnings": [
          null
        ]
      },
      "qa": {
        "required": true,
        "status": "pending",
        "blocking": true,
        "score": {},
        "summary": {},
        "issues": [
          null
        ],
        "preview_urls": [
          null
        ],
        "visual_debug_url": {}
      },
      "export": {
        "status": "not_started",
        "export_id": {},
        "download_url": {},
        "short_download_url": {}
      },
      "delivery": {
        "project_id": {},
        "export_id": {},
        "status": "not_started",
        "download_url": {},
        "short_download_url": {},
        "replacement_pending": true
      },
      "request_id": "string",
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "has_more": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips
```http
POST /clips
```
Tag: Clip Creation
Auth: API key
Operation ID: `createClips`
Create clips
Create clips.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_name":"MKBHD hero loop","source":{"source_type":"youtube","youtube_url":"https://www.youtube.com/watch?v=VIDEO_ID","quality":"2160p"},"selection":{"selection_mode":"auto_best"},"target":{"aspect_ratio":"9:16","min_duration_seconds":8,"max_duration_seconds":12},"layout":{"layout_mode":"auto","content_type_hint":"podcast"},"captions":{"enabled":true},"qa":{"qa_mode":"permissive"},"export":{"auto_export":false}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "batch": {
    "batch_id": "string",
    "status": "string",
    "asset_id": "string",
    "project_folder_id": {},
    "estimated_clip_count": 0,
    "total_clip_count": 0,
    "rendered_count": 0,
    "failed_count": 0,
    "review_count": 0,
    "activity": {},
    "clips": [
      {
        "clip_id": "string",
        "suggestion_id": {},
        "project_id": {},
        "export_id": {},
        "title": "string",
        "status": "string",
        "download_url": {},
        "error_message": {},
        "qa_summary": {},
        "qa_preview_urls": [
          null
        ],
        "checking": true,
        "thumbnail_url": {},
        "score": {}
      }
    ],
    "zip_download_url": {},
    "last_error_message": {},
    "studio_sound": {
      "requested": true,
      "status": "disabled",
      "source_asset_id": {},
      "enhanced_asset_id": {},
      "version": {},
      "processing_run_id": {},
      "error_message": {}
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/attach-export
```http
POST /clips/attach-export
```
Tag: Clip Creation
Auth: API key
Operation ID: `createClipsAttachExport`
Attach a visually accepted completed export to managed clips
Attach a visually accepted completed export to managed clips.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/attach-export" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"string","project_id":"string","export_id":"string","confirm_visual_qa":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "clip_id": "string",
  "asset_id": "string",
  "project_id": "string",
  "export_id": "string",
  "status": "exported",
  "next_action": "stop",
  "share_page_eligible": true,
  "replayed": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clips/presets
```http
GET /clips/presets
```
Tag: Clip Creation
Auth: API key
Operation ID: `listClipPresets`
List available clip presets
List available clip presets.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clips/presets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "presets": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "version": 0
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clips/source-preview
```http
GET /clips/source-preview
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipsSourcePreview`
Preview a YouTube source before clipping
Preview a YouTube source before clipping.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
url | query | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clips/source-preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "platform": "youtube",
  "video_id": "string",
  "title": "string",
  "channel_name": {},
  "duration_seconds": {},
  "thumbnail_url": {},
  "normalized_url": "string",
  "width": {},
  "height": {},
  "fps": {},
  "available_qualities": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /clips/{clip_id}
```http
GET /clips/{clip_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `getClipsClipId`
Get a clip
Get a clip.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/clips/{clip_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clip": {
    "clip_id": "string",
    "project_id": {},
    "requested_project_name": {},
    "requested_clip_preset_id": "default",
    "status": "preparing_source",
    "next_action": "poll",
    "error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "blocking_error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "waiting_reason": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "status_detail": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "source": {
      "source_type": "asset",
      "asset_id": {},
      "youtube_url": {},
      "source_status": "pending",
      "transcript_status": "pending",
      "suggestions_status": "pending",
      "suggestion_counts": {
        "saved": 0,
        "drafts": 0,
        "total": 0
      },
      "suggestion_ai_run_ids": [
        "string"
      ],
      "analysis_status": "missing",
      "analysis_version": {},
      "canonical_duration_seconds": {},
      "processing": {
        "processing_status": {},
        "processing_substage": {},
        "processing_error": {},
        "processing_errors": {},
        "retryable": true,
        "provider_request_ids": {}
      },
      "suitability": {
        "verdict": "ready",
        "reason": {},
        "retryable": true
      },
      "readiness_warnings": [
        "string"
      ]
    },
    "selection": {
      "selection_mode": "auto_best",
      "requested_suggestion_id": {},
      "applied_suggestion_id": {},
      "alternatives": [
        {}
      ]
    },
    "clip_window": {
      "start_seconds": {},
      "end_seconds": {},
      "duration_seconds": {}
    },
    "layout": {
      "requested_mode": "auto",
      "tutorial_stack_ratio": "screen_70_face_30",
      "applied_mode": "split",
      "primary_layout": {},
      "speaker_aware_applied": true,
      "fallback_used": true,
      "fallback_reason": {},
      "requested_mode_honored": true,
      "segments": [
        {}
      ],
      "warnings": [
        "string"
      ]
    },
    "captions": {
      "enabled": true,
      "style_id": {},
      "word_reveal_animation": "none",
      "max_lines_per_caption": 0,
      "words_per_line_limit": 0,
      "page_combine_ms": 0,
      "status": "pending",
      "clip_window_aware": true,
      "item_count": 0,
      "warnings": [
        "string"
      ]
    },
    "qa": {
      "required": true,
      "status": "pending",
      "blocking": true,
      "score": {},
      "summary": {},
      "issues": [
        {}
      ],
      "preview_urls": [
        "string"
      ],
      "visual_debug_url": {}
    },
    "export": {
      "status": "not_started",
      "export_id": {},
      "download_url": {},
      "short_download_url": {}
    },
    "delivery": {
      "project_id": {},
      "export_id": {},
      "status": "not_started",
      "download_url": {},
      "short_download_url": {},
      "replacement_pending": true
    },
    "request_id": "string",
    "created_at": "string",
    "updated_at": "string"
  },
  "repair": {
    "applied": true,
    "repair_mode": "auto",
    "reason": {},
    "previous_timeline_item_id": {},
    "next_timeline_item_id": {},
    "qa_blocking_before": true,
    "qa_blocking_after": true,
    "warnings": [
      "string"
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /clips/{clip_id}
```http
DELETE /clips/{clip_id}
```
Tag: Clip Creation
Auth: API key
Operation ID: `deleteClipsClipId`
Delete a clip
Deletes the clip record. The linked project and any completed export are kept and stay reachable from the projects list; delete them separately if needed.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/clips/{clip_id}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "deleted": true,
  "clip_id": "string",
  "project_id": {},
  "export_id": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/{clip_id}/export
```http
POST /clips/{clip_id}/export
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createClipsClipIdExport`
Export a clip
Export a clip.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/{clip_id}/export" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"resolution":"1080p","format":"mp4","allow_blocking_qa_bypass":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clip": {
    "clip_id": "string",
    "project_id": {},
    "requested_project_name": {},
    "requested_clip_preset_id": "default",
    "status": "preparing_source",
    "next_action": "poll",
    "error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "blocking_error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "waiting_reason": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "status_detail": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "source": {
      "source_type": "asset",
      "asset_id": {},
      "youtube_url": {},
      "source_status": "pending",
      "transcript_status": "pending",
      "suggestions_status": "pending",
      "suggestion_counts": {
        "saved": 0,
        "drafts": 0,
        "total": 0
      },
      "suggestion_ai_run_ids": [
        "string"
      ],
      "analysis_status": "missing",
      "analysis_version": {},
      "canonical_duration_seconds": {},
      "processing": {
        "processing_status": {},
        "processing_substage": {},
        "processing_error": {},
        "processing_errors": {},
        "retryable": true,
        "provider_request_ids": {}
      },
      "suitability": {
        "verdict": "ready",
        "reason": {},
        "retryable": true
      },
      "readiness_warnings": [
        "string"
      ]
    },
    "selection": {
      "selection_mode": "auto_best",
      "requested_suggestion_id": {},
      "applied_suggestion_id": {},
      "alternatives": [
        {}
      ]
    },
    "clip_window": {
      "start_seconds": {},
      "end_seconds": {},
      "duration_seconds": {}
    },
    "layout": {
      "requested_mode": "auto",
      "tutorial_stack_ratio": "screen_70_face_30",
      "applied_mode": "split",
      "primary_layout": {},
      "speaker_aware_applied": true,
      "fallback_used": true,
      "fallback_reason": {},
      "requested_mode_honored": true,
      "segments": [
        {}
      ],
      "warnings": [
        "string"
      ]
    },
    "captions": {
      "enabled": true,
      "style_id": {},
      "word_reveal_animation": "none",
      "max_lines_per_caption": 0,
      "words_per_line_limit": 0,
      "page_combine_ms": 0,
      "status": "pending",
      "clip_window_aware": true,
      "item_count": 0,
      "warnings": [
        "string"
      ]
    },
    "qa": {
      "required": true,
      "status": "pending",
      "blocking": true,
      "score": {},
      "summary": {},
      "issues": [
        {}
      ],
      "preview_urls": [
        "string"
      ],
      "visual_debug_url": {}
    },
    "export": {
      "status": "not_started",
      "export_id": {},
      "download_url": {},
      "short_download_url": {}
    },
    "delivery": {
      "project_id": {},
      "export_id": {},
      "status": "not_started",
      "download_url": {},
      "short_download_url": {},
      "replacement_pending": true
    },
    "request_id": "string",
    "created_at": "string",
    "updated_at": "string"
  },
  "repair": {
    "applied": true,
    "repair_mode": "auto",
    "reason": {},
    "previous_timeline_item_id": {},
    "next_timeline_item_id": {},
    "qa_blocking_before": true,
    "qa_blocking_after": true,
    "warnings": [
      "string"
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/{clip_id}/promote-export
```http
POST /clips/{clip_id}/promote-export
```
Tag: Clip Creation
Auth: API key
Operation ID: `promoteCompletedExport`
Promote a visually accepted export as a managed delivery
Promote a visually accepted export as a managed delivery.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/{clip_id}/promote-export" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"export_id":"string","confirm_visual_qa":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "clip_id": "string",
  "asset_id": "string",
  "project_id": "string",
  "export_id": "string",
  "status": "exported",
  "next_action": "stop",
  "share_page_eligible": true,
  "replayed": true,
  "previous_export_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/{clip_id}/reject
```http
POST /clips/{clip_id}/reject
```
Tag: Clip Creation
Auth: API key
Operation ID: `rejectClip`
Reject a clip after human visual review
Reject a clip after human visual review.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/{clip_id}/reject" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reason":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "clip_id": "string",
  "export_id": {},
  "status": "needs_repair",
  "next_action": "repair",
  "reason": "string",
  "reviewed_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/{clip_id}/repair
```http
POST /clips/{clip_id}/repair
```
Tag: Clip Creation
Auth: API key
Operation ID: `createClipsClipIdRepair`
Repair a clip
Repair a clip.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/{clip_id}/repair" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"repair_mode":"auto"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clip": {
    "clip_id": "string",
    "project_id": {},
    "requested_project_name": {},
    "requested_clip_preset_id": "default",
    "status": "preparing_source",
    "next_action": "poll",
    "error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "blocking_error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "waiting_reason": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "status_detail": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "source": {
      "source_type": "asset",
      "asset_id": {},
      "youtube_url": {},
      "source_status": "pending",
      "transcript_status": "pending",
      "suggestions_status": "pending",
      "suggestion_counts": {
        "saved": 0,
        "drafts": 0,
        "total": 0
      },
      "suggestion_ai_run_ids": [
        "string"
      ],
      "analysis_status": "missing",
      "analysis_version": {},
      "canonical_duration_seconds": {},
      "processing": {
        "processing_status": {},
        "processing_substage": {},
        "processing_error": {},
        "processing_errors": {},
        "retryable": true,
        "provider_request_ids": {}
      },
      "suitability": {
        "verdict": "ready",
        "reason": {},
        "retryable": true
      },
      "readiness_warnings": [
        "string"
      ]
    },
    "selection": {
      "selection_mode": "auto_best",
      "requested_suggestion_id": {},
      "applied_suggestion_id": {},
      "alternatives": [
        {}
      ]
    },
    "clip_window": {
      "start_seconds": {},
      "end_seconds": {},
      "duration_seconds": {}
    },
    "layout": {
      "requested_mode": "auto",
      "tutorial_stack_ratio": "screen_70_face_30",
      "applied_mode": "split",
      "primary_layout": {},
      "speaker_aware_applied": true,
      "fallback_used": true,
      "fallback_reason": {},
      "requested_mode_honored": true,
      "segments": [
        {}
      ],
      "warnings": [
        "string"
      ]
    },
    "captions": {
      "enabled": true,
      "style_id": {},
      "word_reveal_animation": "none",
      "max_lines_per_caption": 0,
      "words_per_line_limit": 0,
      "page_combine_ms": 0,
      "status": "pending",
      "clip_window_aware": true,
      "item_count": 0,
      "warnings": [
        "string"
      ]
    },
    "qa": {
      "required": true,
      "status": "pending",
      "blocking": true,
      "score": {},
      "summary": {},
      "issues": [
        {}
      ],
      "preview_urls": [
        "string"
      ],
      "visual_debug_url": {}
    },
    "export": {
      "status": "not_started",
      "export_id": {},
      "download_url": {},
      "short_download_url": {}
    },
    "delivery": {
      "project_id": {},
      "export_id": {},
      "status": "not_started",
      "download_url": {},
      "short_download_url": {},
      "replacement_pending": true
    },
    "request_id": "string",
    "created_at": "string",
    "updated_at": "string"
  },
  "repair": {
    "applied": true,
    "repair_mode": "auto",
    "reason": {},
    "previous_timeline_item_id": {},
    "next_timeline_item_id": {},
    "qa_blocking_before": true,
    "qa_blocking_after": true,
    "warnings": [
      "string"
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /clips/{clip_id}/reselect
```http
POST /clips/{clip_id}/reselect
```
Tag: Clip Creation
Auth: API key
Operation ID: `createClipsClipIdReselect`
Reselect a clip
Reselect a clip.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
clip_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/clips/{clip_id}/reselect" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"selection":{"selection_mode":"time_range","start_seconds":52,"end_seconds":64},"target":{"min_duration_seconds":8,"max_duration_seconds":12}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "clip": {
    "clip_id": "string",
    "project_id": {},
    "requested_project_name": {},
    "requested_clip_preset_id": "default",
    "status": "preparing_source",
    "next_action": "poll",
    "error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "blocking_error": {
      "step": "source",
      "code": "string",
      "message": "string",
      "detail": {},
      "expected": {},
      "why_failed": {},
      "how_to_fix": [
        null
      ],
      "retryable": true,
      "retry_same_input": true
    },
    "waiting_reason": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "status_detail": {
      "code": "string",
      "message": "string",
      "retryable": true,
      "retry_same_input": true
    },
    "source": {
      "source_type": "asset",
      "asset_id": {},
      "youtube_url": {},
      "source_status": "pending",
      "transcript_status": "pending",
      "suggestions_status": "pending",
      "suggestion_counts": {
        "saved": 0,
        "drafts": 0,
        "total": 0
      },
      "suggestion_ai_run_ids": [
        "string"
      ],
      "analysis_status": "missing",
      "analysis_version": {},
      "canonical_duration_seconds": {},
      "processing": {
        "processing_status": {},
        "processing_substage": {},
        "processing_error": {},
        "processing_errors": {},
        "retryable": true,
        "provider_request_ids": {}
      },
      "suitability": {
        "verdict": "ready",
        "reason": {},
        "retryable": true
      },
      "readiness_warnings": [
        "string"
      ]
    },
    "selection": {
      "selection_mode": "auto_best",
      "requested_suggestion_id": {},
      "applied_suggestion_id": {},
      "alternatives": [
        {}
      ]
    },
    "clip_window": {
      "start_seconds": {},
      "end_seconds": {},
      "duration_seconds": {}
    },
    "layout": {
      "requested_mode": "auto",
      "tutorial_stack_ratio": "screen_70_face_30",
      "applied_mode": "split",
      "primary_layout": {},
      "speaker_aware_applied": true,
      "fallback_used": true,
      "fallback_reason": {},
      "requested_mode_honored": true,
      "segments": [
        {}
      ],
      "warnings": [
        "string"
      ]
    },
    "captions": {
      "enabled": true,
      "style_id": {},
      "word_reveal_animation": "none",
      "max_lines_per_caption": 0,
      "words_per_line_limit": 0,
      "page_combine_ms": 0,
      "status": "pending",
      "clip_window_aware": true,
      "item_count": 0,
      "warnings": [
        "string"
      ]
    },
    "qa": {
      "required": true,
      "status": "pending",
      "blocking": true,
      "score": {},
      "summary": {},
      "issues": [
        {}
      ],
      "preview_urls": [
        "string"
      ],
      "visual_debug_url": {}
    },
    "export": {
      "status": "not_started",
      "export_id": {},
      "download_url": {},
      "short_download_url": {}
    },
    "delivery": {
      "project_id": {},
      "export_id": {},
      "status": "not_started",
      "download_url": {},
      "short_download_url": {},
      "replacement_pending": true
    },
    "request_id": "string",
    "created_at": "string",
    "updated_at": "string"
  },
  "repair": {
    "applied": true,
    "repair_mode": "auto",
    "reason": {},
    "previous_timeline_item_id": {},
    "next_timeline_item_id": {},
    "qa_blocking_before": true,
    "qa_blocking_after": true,
    "warnings": [
      "string"
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /creative-builds/{jobId}
```http
GET /creative-builds/{jobId}
```
Tag: Creative Source
Auth: API key
Operation ID: `getCreativeBuildsJobId`
Read creative build status, logs and artifact receipt
Read creative build status, logs and artifact receipt.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/creative-builds/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "status": "queued",
  "artifactId": "string",
  "frameUrl": {},
  "mediaAssetId": "string",
  "videoUrl": {},
  "logs": "string",
  "error": {},
  "runtime": "string",
  "reservedUsd": 0,
  "computeUpperBoundUsd": {},
  "elapsedMs": {},
  "createdAt": "string",
  "receiptUrl": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /creative-builds/{jobId}/cancel
```http
POST /creative-builds/{jobId}/cancel
```
Tag: Creative Source
Auth: API key
Operation ID: `createCreativeBuildsJobIdCancel`
Cancel an isolated creative build
Cancel an isolated creative build.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/creative-builds/JOB_ID/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "status": "queued",
  "artifactId": "string",
  "frameUrl": {},
  "mediaAssetId": "string",
  "videoUrl": {},
  "logs": "string",
  "error": {},
  "runtime": "string",
  "reservedUsd": 0,
  "computeUpperBoundUsd": {},
  "elapsedMs": {},
  "createdAt": "string",
  "receiptUrl": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /creative-builds/{jobId}/frame
```http
GET /creative-builds/{jobId}/frame
```
Tag: Creative Source
Auth: API key
Operation ID: `getCreativeBuildsJobIdFrame`
Read a saved PNG frame as base64
Read a saved PNG frame as base64.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/creative-builds/JOB_ID/frame" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "mimeType": "image/png",
  "data": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /credits/balance
```http
GET /credits/balance
```
Tag: Platform
Auth: API key
Operation ID: `getCreditsBalance`
Get credits balance
Returns the current AI credit balance including monthly and permanent pools.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/credits/balance" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "monthly": {
    "used": 0,
    "limit": 0,
    "remaining": 0
  },
  "permanent": {
    "remaining": 0
  },
  "total": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /customer-links
```http
PUT /customer-links
```
Tag: Platform
Auth: API key
Operation ID: `replaceCustomerLinks`
Create or revise a customer tracking link
Create or revise a customer tracking link.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/customer-links" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"seriesId":"string","projectId":"string","postId":"string","id":"string","expectedRevision":0,"label":"string","destination":"string","enabled":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "seriesId": "string",
  "projectId": "string",
  "postId": "string",
  "id": "string",
  "label": "string",
  "destination": "string",
  "enabled": true,
  "revision": 0,
  "url": "string",
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /customer-outcomes
```http
GET /customer-outcomes
```
Tag: Platform
Auth: API key
Operation ID: `getCustomerOutcomes`
Read customer clicks and self-reported outcomes
Read customer clicks and self-reported outcomes.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
from | query | yes | `string` | -
to | query | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/customer-outcomes" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "links": [
    {
      "seriesId": "string",
      "projectId": "string",
      "postId": "string",
      "id": "string",
      "label": "string",
      "destination": "string",
      "enabled": true,
      "revision": 0,
      "url": "string",
      "createdAt": "string",
      "clicks": 0,
      "capped": true
    }
  ],
  "outcomes": [
    {
      "seriesId": "string",
      "projectId": "string",
      "postId": "string",
      "id": "string",
      "kind": "leads",
      "value": 0,
      "unit": "string",
      "occurredAt": "string",
      "source": "string",
      "attribution": "unknown",
      "voided": true,
      "revision": 0,
      "authorId": "string",
      "recordedAt": "string"
    }
  ],
  "linkBounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "outcomeBounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "window": {
    "from": "string",
    "to": "string"
  },
  "clickSemantics": "observed_clicks_deduplicated_per_link_per_utc_day",
  "outcomeSemantics": "self_reported_not_verified_conversions",
  "retentionDays": 90
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /customer-outcomes
```http
PUT /customer-outcomes
```
Tag: Platform
Auth: API key
Operation ID: `replaceCustomerOutcomes`
Record or revise a self-reported outcome
Record or revise a self-reported outcome.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/customer-outcomes" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"seriesId":"string","projectId":"string","postId":"string","id":"string","expectedRevision":0,"kind":"leads","value":0,"unit":"string","occurredAt":"string","source":"string","attribution":"unknown","voided":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "seriesId": "string",
  "projectId": "string",
  "postId": "string",
  "id": "string",
  "kind": "leads",
  "value": 0,
  "unit": "string",
  "occurredAt": "string",
  "source": "string",
  "attribution": "unknown",
  "voided": true,
  "revision": 0,
  "authorId": "string",
  "recordedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /drafts/quote
```http
GET /drafts/quote
```
Tag: Platform
Auth: API key
Operation ID: `getDraftsQuote`
Read hosted creation availability and agent cost bounds
Read hosted creation availability and agent cost bounds.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/drafts/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "allowed": true,
  "reason": {},
  "modelId": {},
  "worker": {
    "currency": "USD",
    "maximumUsd": 0,
    "estimatedCredits": 0,
    "creditsRemaining": 0,
    "workspaceRemainingUsd": 0,
    "policyVersion": {},
    "expiresAt": "string",
    "retentionDays": 0,
    "allowed": true,
    "reason": {},
    "taskId": "completed-clip-export-visual-qa",
    "excludesChildJobs": true,
    "excludesTranscriptionProvider": true,
    "transcriptionAudio": {},
    "transcriptionRecovery": {},
    "maxTranscriptionProviderUsd": 0,
    "maxTranscriptionRequests": 0,
    "streamingProxyIo": {},
    "cpuAnalysisIo": {},
    "qaPreparation": {},
    "modalAnalysis": {},
    "maxWorkerAttempts": 0,
    "maxPayloadBytes": 0,
    "maxModelCalls": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /drafts/runs
```http
GET /drafts/runs
```
Tag: Platform
Auth: API key
Operation ID: `getDraftsRuns`
List recent hosted draft runs in this workspace
List recent hosted draft runs in this workspace.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/drafts/runs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runs": [
    {
      "runId": "string",
      "workflowId": "string",
      "projectId": "string",
      "name": "string",
      "brief": "string",
      "format": "video",
      "language": "en",
      "status": "pending",
      "stepStatus": "pending",
      "triggerRunId": {},
      "cancellationPending": true,
      "createdAt": "string",
      "completedAt": "string",
      "progress": {},
      "error": {},
      "costs": {
        "currency": "USD",
        "maximumAgentUsd": 0,
        "unknownModelEvents": 0,
        "excludesChildJobs": true
      }
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /drafts/runs
```http
POST /drafts/runs
```
Tag: Platform
Auth: API key
Operation ID: `createDraftsRuns`
Create a saved Project and start a bounded hosted draft
Create a saved Project and start a bounded hosted draft.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/drafts/runs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","brief":"string","format":"video","language":"en","seriesId":"string","idempotencyKey":"string","maximumAgentUsd":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run": {
    "runId": "string",
    "workflowId": "string",
    "projectId": "string",
    "name": "string",
    "brief": "string",
    "format": "video",
    "language": "en",
    "status": "pending",
    "stepStatus": "pending",
    "triggerRunId": {},
    "cancellationPending": true,
    "createdAt": "string",
    "completedAt": "string",
    "progress": {
      "version": 1,
      "revision": 0,
      "projectId": "string",
      "phase": "planning",
      "modelCalls": 0,
      "maxModelCalls": 0,
      "repairRounds": 0,
      "maxRepairRounds": 0,
      "calls": [
        null
      ],
      "totalCalls": 0
    },
    "error": {},
    "costs": {
      "currency": "USD",
      "maximumAgentUsd": 0,
      "recordedModelUsd": 0,
      "unknownModelEvents": 0,
      "excludesChildJobs": true,
      "usage": {}
    }
  },
  "mutationReceipt": {
    "id": {},
    "key": {},
    "operation": "string",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /drafts/runs/{runId}
```http
GET /drafts/runs/{runId}
```
Tag: Platform
Auth: API key
Operation ID: `getDraftsRunsRunId`
Read saved draft progress and recorded costs
Read saved draft progress and recorded costs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/drafts/runs/{runId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runId": "string",
  "workflowId": "string",
  "projectId": "string",
  "name": "string",
  "brief": "string",
  "format": "video",
  "language": "en",
  "status": "pending",
  "stepStatus": "pending",
  "triggerRunId": {},
  "cancellationPending": true,
  "createdAt": "string",
  "completedAt": "string",
  "progress": {
    "version": 1,
    "revision": 0,
    "projectId": "string",
    "phase": "planning",
    "modelCalls": 0,
    "maxModelCalls": 0,
    "repairRounds": 0,
    "maxRepairRounds": 0,
    "seenVisualRevision": 0,
    "completed": {},
    "calls": [
      {}
    ],
    "totalCalls": 0
  },
  "error": {},
  "costs": {
    "currency": "USD",
    "maximumAgentUsd": 0,
    "recordedModelUsd": 0,
    "unknownModelEvents": 0,
    "excludesChildJobs": true,
    "usage": {
      "scope": "attributed_jobs",
      "accountedUsd": 0,
      "reservedUsd": 0,
      "providerReportedUsd": 0,
      "allocatedUpperBoundUsd": 0,
      "unresolvedJobs": 0,
      "activeJobs": 0,
      "jobCount": 0
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /drafts/runs/{runId}/control
```http
POST /drafts/runs/{runId}/control
```
Tag: Platform
Auth: API key
Operation ID: `createDraftsRunsRunIdControl`
Resume retained work or cancel a hosted draft
Resume retained work or cancel a hosted draft.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/drafts/runs/{runId}/control" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"resume","idempotencyKey":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runId": "string",
  "workflowId": "string",
  "projectId": "string",
  "name": "string",
  "brief": "string",
  "format": "video",
  "language": "en",
  "status": "pending",
  "stepStatus": "pending",
  "triggerRunId": {},
  "cancellationPending": true,
  "createdAt": "string",
  "completedAt": "string",
  "progress": {
    "version": 1,
    "revision": 0,
    "projectId": "string",
    "phase": "planning",
    "modelCalls": 0,
    "maxModelCalls": 0,
    "repairRounds": 0,
    "maxRepairRounds": 0,
    "seenVisualRevision": 0,
    "completed": {},
    "calls": [
      {}
    ],
    "totalCalls": 0
  },
  "error": {},
  "costs": {
    "currency": "USD",
    "maximumAgentUsd": 0,
    "recordedModelUsd": 0,
    "unknownModelEvents": 0,
    "excludesChildJobs": true,
    "usage": {
      "scope": "attributed_jobs",
      "accountedUsd": 0,
      "reservedUsd": 0,
      "providerReportedUsd": 0,
      "allocatedUpperBoundUsd": 0,
      "unresolvedJobs": 0,
      "activeJobs": 0,
      "jobCount": 0
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /exports/{exportId}
```http
GET /exports/{exportId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getExport`
Get export status
Get export status.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
exportId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/exports/EXPORT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "export_id": "string",
  "status": "string",
  "playback_url": "string",
  "download_url": {},
  "short_download_url": {},
  "thumbnail_url": {},
  "thumbnail": {
    "url": {},
    "frame": {},
    "frame_seconds": {},
    "selection_mode": {},
    "rationale": {}
  },
  "platform_metadata": {},
  "expires_at": {},
  "file_size_bytes": {},
  "duration_seconds": {},
  "container_format": {},
  "resolution": {},
  "image_formats": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /exports/{exportId}
```http
DELETE /exports/{exportId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `deleteExport`
Delete an export
Delete an export.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
exportId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/exports/EXPORT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /fonts
```http
GET /fonts
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getFonts`
List supported font families
List supported font families.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
surface | query | no | `string` (captions, playground) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/fonts" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "fonts": [
    {
      "family": "string",
      "supported_weights": [
        "string"
      ],
      "surfaces": [
        "captions"
      ]
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /formats/video-model-benchmark/runs
```http
POST /formats/video-model-benchmark/runs
```
Tag: Platform
Auth: API key
Operation ID: `createFormatsVideoModelBenchmarkRuns`
Run a branded two-model video benchmark
Creates a 16:9 project, sends one exact prompt to two text-to-video models, waits for both generated media assets to finish processing, and composes a muted branded split-screen comparison. The response includes aggregate estimated credits plus job and project IDs. Poll the job until terminal, then inspect the project timeline before export.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/formats/video-model-benchmark/runs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","left_model":"flux-3-max-t2v","right_model":"flux-3-max-t2v","duration_seconds":0,"left_label":"string","right_label":"string","brand_label":"string","project_name":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "format_id": "video-model-benchmark",
  "job_id": "string",
  "project_id": "string",
  "status": "queued",
  "left_model": "string",
  "right_model": "string",
  "duration_seconds": 0,
  "estimated_credits": 0,
  "estimated_seconds": 0,
  "created_at": "string",
  "input_warnings": [
    "string"
  ],
  "plan": {
    "aspect_ratio": "16:9",
    "layout": "split-screen",
    "audio": "muted",
    "left": {
      "model": "string",
      "label": "string"
    },
    "right": {
      "model": "string",
      "label": "string"
    },
    "brand_label": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-faceless
```http
POST /generate-faceless
```
Tag: Platform
Auth: API key
Operation ID: `generateFaceless`
Create a Faceless Video plan
Create a Faceless Video plan.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-faceless" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"series_id":"string","input_mode":"topic","improve_prompt":true,"script":"string","project_name":"string","target_duration_seconds":0,"visual_style":"string","story_kit_id":"string","planner_model_id":"string","image_model_id":"string","video_model":"sync-lipsync-2","generate_voiceover":true,"voice_id":"string","include_captions":true,"caption_style_id":"string","generate_background_music":true,"generate_sound_effects":true,"character_ids":["string"],"style_reference_asset_ids":["string"]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-image
```http
POST /generate-image
```
Tag: Platform
Auth: API key
Operation ID: `generateImage`
Generate an image
Generate an image.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-image" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","model":"fal-ai/gpt-image-1","aspect_ratio":"1:1","resolution":"0.5k","size":"string","reference_asset_ids":["string"],"character_id":"string","folder_id":"string","enhance_prompt":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-music
```http
POST /generate-music
```
Tag: Platform
Auth: API key
Operation ID: `generateMusic`
Generate music
Generate music.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-music" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","mood":"curiosity","duration_seconds":0,"enhance_prompt":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-sound
```http
POST /generate-sound
```
Tag: Platform
Auth: API key
Operation ID: `generateSound`
Generate a sound
Generate a sound.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-sound" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","duration_seconds":0,"loop":true,"prompt_influence":0,"enhance_prompt":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-video
```http
POST /generate-video
```
Tag: Platform
Auth: API key
Operation ID: `generateVideo`
Generate a video
Generate a video.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-video" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provenance":{"originalRequest":"string","previousJobId":"string"},"transformation":{"characters":[{}],"sourcePersonCount":0,"keepOriginalAudio":true,"characterOrientation":"video"},"prompt":"string","model":"sync-lipsync-2","duration_seconds":2,"aspect_ratio":"9:16","source_asset_id":"string","end_frame_asset_id":"string","reference_asset_ids":["string"],"reference_asset_uris":["string"],"reference_video_asset_ids":["string"],"reference_video_range":{"start_seconds":0,"end_seconds":0},"reference_audio_asset_ids":["string"],"character_id":"string","resolution":"360p","generate_audio":{},"negative_prompt":"string","seed":0,"folder_id":"string","provider":"auto","enhance_prompt":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generate-voiceover
```http
POST /generate-voiceover
```
Tag: Platform
Auth: API key
Operation ID: `generateVoiceover`
Generate a voiceover
Generate a voiceover.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generate-voiceover" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"string","voice_id":"string","voice_style":"curiosity","speed":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "estimated_credits": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /generation-jobs/{jobId}
```http
GET /generation-jobs/{jobId}
```
Tag: Platform
Auth: API key
Operation ID: `getGenerationJob`
Get a generation job
Get a generation job.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/generation-jobs/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "dispatch": {
    "status": "confirmed",
    "next_action": "wait"
  },
  "recovery": {
    "jobId": {},
    "runId": {},
    "failure": {
      "category": "copyright",
      "message": "string",
      "stage": "input",
      "retryable": true,
      "model": {},
      "provider": {}
    },
    "credits": {
      "status": "not_charged",
      "charged": {},
      "refunded": {},
      "net": {}
    },
    "history": {
      "originalRequest": {},
      "authoredPrompt": {},
      "submittedPrompt": {},
      "enhancementApplied": true,
      "previousJobId": {},
      "previews": [
        null
      ],
      "settings": {},
      "references": [
        null
      ],
      "providerRequests": [
        null
      ]
    },
    "alternatives": [
      {}
    ],
    "actions": [
      "review_prompt"
    ],
    "reviewUrl": "string"
  },
  "audio_recovery": {
    "attempt": 0,
    "mode": "saved_audio_only"
  },
  "content_direction": {
    "snapshot": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "status": "current",
    "current": {
      "brandRevision": 0,
      "brandContentHash": "string",
      "seriesContentHash": {}
    }
  },
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "progress": 0,
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "download_url": "string",
  "estimated_credits": {},
  "result": {},
  "error": {},
  "created_at": "string",
  "completed_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generation-jobs/{jobId}/cancel
```http
POST /generation-jobs/{jobId}/cancel
```
Tag: Platform
Auth: API key
Operation ID: `cancelGenerationJob`
Cancel a generation job
Cancel a generation job.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generation-jobs/JOB_ID/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "dispatch": {
    "status": "confirmed",
    "next_action": "wait"
  },
  "recovery": {
    "jobId": {},
    "runId": {},
    "failure": {
      "category": "copyright",
      "message": "string",
      "stage": "input",
      "retryable": true,
      "model": {},
      "provider": {}
    },
    "credits": {
      "status": "not_charged",
      "charged": {},
      "refunded": {},
      "net": {}
    },
    "history": {
      "originalRequest": {},
      "authoredPrompt": {},
      "submittedPrompt": {},
      "enhancementApplied": true,
      "previousJobId": {},
      "previews": [
        null
      ],
      "settings": {},
      "references": [
        null
      ],
      "providerRequests": [
        null
      ]
    },
    "alternatives": [
      {}
    ],
    "actions": [
      "review_prompt"
    ],
    "reviewUrl": "string"
  },
  "audio_recovery": {
    "attempt": 0,
    "mode": "saved_audio_only"
  },
  "content_direction": {
    "snapshot": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "status": "current",
    "current": {
      "brandRevision": 0,
      "brandContentHash": "string",
      "seriesContentHash": {}
    }
  },
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "progress": 0,
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "download_url": "string",
  "estimated_credits": {},
  "result": {},
  "error": {},
  "created_at": "string",
  "completed_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generation-jobs/{jobId}/recover
```http
POST /generation-jobs/{jobId}/recover
```
Tag: Platform
Auth: API key
Operation ID: `createGenerationJobsJobIdRecover`
Recover saved audio without buying replacement audio
Recover saved audio without buying replacement audio.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generation-jobs/JOB_ID/recover" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_attempt":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "dispatch": {
    "status": "confirmed",
    "next_action": "wait"
  },
  "recovery": {
    "jobId": {},
    "runId": {},
    "failure": {
      "category": "copyright",
      "message": "string",
      "stage": "input",
      "retryable": true,
      "model": {},
      "provider": {}
    },
    "credits": {
      "status": "not_charged",
      "charged": {},
      "refunded": {},
      "net": {}
    },
    "history": {
      "originalRequest": {},
      "authoredPrompt": {},
      "submittedPrompt": {},
      "enhancementApplied": true,
      "previousJobId": {},
      "previews": [
        null
      ],
      "settings": {},
      "references": [
        null
      ],
      "providerRequests": [
        null
      ]
    },
    "alternatives": [
      {}
    ],
    "actions": [
      "review_prompt"
    ],
    "reviewUrl": "string"
  },
  "audio_recovery": {
    "attempt": 0,
    "mode": "saved_audio_only"
  },
  "content_direction": {
    "snapshot": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "status": "current",
    "current": {
      "brandRevision": 0,
      "brandContentHash": "string",
      "seriesContentHash": {}
    }
  },
  "job_id": "string",
  "kind": "image",
  "status": "queued",
  "progress": 0,
  "status_url": "string",
  "cancel_url": "string",
  "project_id": "string",
  "media_id": "string",
  "download_url": "string",
  "estimated_credits": {},
  "result": {},
  "error": {},
  "created_at": "string",
  "completed_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generation-jobs/{jobId}/review
```http
POST /generation-jobs/{jobId}/review
```
Tag: Platform
Auth: API key
Operation ID: `createGenerationJobsJobIdReview`
Review a finished video generation
Returns evenly spaced frames, a contact sheet, the spoken transcript and, with a character, a 0-1 likeness score against its primary reference (one prompt-enhancement spend). The first call starts a free transcription when none exists and returns transcript.status processing; call again to read it.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generation-jobs/JOB_ID/review" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"character_id":"string","frame_count":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "media_id": "string",
  "duration_seconds": {},
  "narration_assessment": {
    "status": "passed",
    "structuralStatus": "passed",
    "reviewStatus": "passed",
    "reviewConfidence": 0,
    "deliveryEligible": true
  },
  "transcript": {
    "status": "completed",
    "text": {},
    "segments": [
      {
        "start": 0,
        "end": 0,
        "text": "string"
      }
    ]
  },
  "frames": [
    {
      "time_seconds": 0,
      "url": "string"
    }
  ],
  "contact_sheet_url": {},
  "likeness": {
    "character_id": "string",
    "reference_asset_id": "string",
    "score": 0,
    "reason": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /generation-options/{kind}
```http
GET /generation-options/{kind}
```
Tag: Platform
Auth: API key
Operation ID: `getGenerationOptions`
List options for one generation outcome
List options for one generation outcome.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
kind | path | yes | `string` (image, video, voiceover, music, sound, faceless) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/generation-options/{kind}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /generation-plan-brief
```http
POST /generation-plan-brief
```
Tag: Platform
Auth: API key
Operation ID: `createGenerationPlanBrief`
Get prompt routing, required inputs and model grammar without generation
Get prompt routing, required inputs and model grammar without generation.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/generation-plan-brief" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","model":{},"duration_seconds":0,"aspect_ratio":"9:16"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /generation/audio-quote
```http
GET /generation/audio-quote
```
Tag: Platform
Auth: API key
Operation ID: `getGenerationAudioQuote`
Quote audio generation or saved-audio recovery
Read eligibility, estimated credits and maximum reserved USD without generating audio or reserving money. Admission rechecks current limits.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
kind | query | yes | `string` (voiceover, music, sound) | -
characters | query | no | `object` | -
seconds | query | no | `object` | -
preview | query | no | `boolean` | -
recovery | query | no | `boolean` | -
narrationTake | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/generation/audio-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "kind": "voiceover",
  "narrationTake": true,
  "mode": "generation",
  "operation": "asset"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /generation/quote
```http
GET /generation/quote
```
Tag: Platform
Auth: API key
Operation ID: `getGenerationQuote`
Quote image, video or prompt generation
Read credits and the configured maximum USD envelope, optionally including prompt enhancement. No reservation or provider call. Generation rechecks limits and validates the full input.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
kind | query | yes | `string` (image, video, prompt) | -
model | query | no | `object` | -
sourceImageModel | query | no | `object` | -
seconds | query | no | `object` | -
resolution | query | no | `object` | -
size | query | no | `object` | -
enhancePrompt | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/generation/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "kind": "image",
  "model": "string",
  "sourceImageModel": {},
  "includesPromptEnhancement": true,
  "basis": "configured_upper_bound",
  "limits": {
    "maxPromptCharacters": 0,
    "maxReferenceBytes": 0,
    "maxDurationSeconds": 0,
    "maxEnhancementInputCharacters": 0,
    "maxEnhancementImages": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /jobs/{jobId}
```http
GET /jobs/{jobId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getJob`
Get job status
Get job status.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/jobs/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "dispatch": {
    "status": "confirmed",
    "next_action": "wait"
  },
  "audio_recovery": {
    "attempt": 0,
    "mode": "saved_audio_only"
  },
  "job_id": "string",
  "type": "string",
  "kind": "string",
  "status": "queued",
  "progress": 0,
  "status_url": "string",
  "cancel_url": "string",
  "project_id": {},
  "export_id": {},
  "media_id": {},
  "download_url": "string",
  "estimated_credits": {},
  "created_at": "string",
  "completed_at": {},
  "error": {},
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ],
  "result": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /learning/jobs
```http
POST /learning/jobs
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createLearningJobs`
Create cited lessons and variation briefs from a reviewed quote
Create cited lessons and variation briefs from a reviewed quote.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/learning/jobs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"seriesId":"string","goal":"reach","from":"string","to":"string","maxVariations":0,"language":"en","quoteId":"string","expectedEvidence":"string","maxUsd":0,"maxCredits":0,"idempotencyKey":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "evidence": {
    "fingerprint": "string",
    "capturedAt": "string",
    "seriesName": "string",
    "request": {
      "seriesId": "string",
      "goal": "reach",
      "from": "string",
      "to": "string",
      "maxVariations": 0,
      "language": "en"
    },
    "context": {
      "direction": {
        "capturedAt": "string",
        "scope": {},
        "brand": {}
      },
      "precedence": [
        "string"
      ],
      "documents": [
        {}
      ],
      "bounds": {
        "limit": 0,
        "offset": 0,
        "total": 0,
        "returned": 0,
        "hasMore": true,
        "truncated": true
      },
      "characterLimit": 0,
      "truncatedDocumentIds": [
        "string"
      ]
    },
    "observations": [
      {
        "id": "string",
        "kind": "metric",
        "anchor": "string",
        "sourceUrl": "string",
        "summary": "string",
        "value": {},
        "unit": "string",
        "attribution": "observed",
        "eligible": true,
        "details": {}
      }
    ],
    "comparisons": [
      {
        "cohort": "string",
        "samples": 0,
        "median": {},
        "status": "descriptive_comparison",
        "observationIds": [
          null
        ]
      }
    ],
    "bounds": {
      "metricLimit": 100,
      "reviewLimit": 30,
      "editLimit": 30,
      "linkLimit": 30,
      "outcomeLimit": 30,
      "truncated": true
    },
    "authorityComplete": true
  },
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string"
    }
  ],
  "proposal": {
    "lesson": "string",
    "evidenceIds": [
      "string"
    ],
    "limitations": [
      "string"
    ],
    "variations": [
      {}
    ]
  },
  "error": {},
  "direction": "current",
  "runId": {},
  "canResume": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /learning/jobs/{jobId}
```http
GET /learning/jobs/{jobId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getLearningJobsJobId`
Read retained learning evidence, progress and saved documents
Read retained learning evidence, progress and saved documents.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/learning/jobs/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "evidence": {
    "fingerprint": "string",
    "capturedAt": "string",
    "seriesName": "string",
    "request": {
      "seriesId": "string",
      "goal": "reach",
      "from": "string",
      "to": "string",
      "maxVariations": 0,
      "language": "en"
    },
    "context": {
      "direction": {
        "capturedAt": "string",
        "scope": {},
        "brand": {}
      },
      "precedence": [
        "string"
      ],
      "documents": [
        {}
      ],
      "bounds": {
        "limit": 0,
        "offset": 0,
        "total": 0,
        "returned": 0,
        "hasMore": true,
        "truncated": true
      },
      "characterLimit": 0,
      "truncatedDocumentIds": [
        "string"
      ]
    },
    "observations": [
      {
        "id": "string",
        "kind": "metric",
        "anchor": "string",
        "sourceUrl": "string",
        "summary": "string",
        "value": {},
        "unit": "string",
        "attribution": "observed",
        "eligible": true,
        "details": {}
      }
    ],
    "comparisons": [
      {
        "cohort": "string",
        "samples": 0,
        "median": {},
        "status": "descriptive_comparison",
        "observationIds": [
          null
        ]
      }
    ],
    "bounds": {
      "metricLimit": 100,
      "reviewLimit": 30,
      "editLimit": 30,
      "linkLimit": 30,
      "outcomeLimit": 30,
      "truncated": true
    },
    "authorityComplete": true
  },
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string"
    }
  ],
  "proposal": {
    "lesson": "string",
    "evidenceIds": [
      "string"
    ],
    "limitations": [
      "string"
    ],
    "variations": [
      {}
    ]
  },
  "error": {},
  "direction": "current",
  "runId": {},
  "canResume": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /learning/jobs/{jobId}/control
```http
POST /learning/jobs/{jobId}/control
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createLearningJobsJobIdControl`
Cancel learning or resume delivery of a saved result
Cancel learning or resume delivery of a saved result.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/learning/jobs/JOB_ID/control" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"resume"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "evidence": {
    "fingerprint": "string",
    "capturedAt": "string",
    "seriesName": "string",
    "request": {
      "seriesId": "string",
      "goal": "reach",
      "from": "string",
      "to": "string",
      "maxVariations": 0,
      "language": "en"
    },
    "context": {
      "direction": {
        "capturedAt": "string",
        "scope": {},
        "brand": {}
      },
      "precedence": [
        "string"
      ],
      "documents": [
        {}
      ],
      "bounds": {
        "limit": 0,
        "offset": 0,
        "total": 0,
        "returned": 0,
        "hasMore": true,
        "truncated": true
      },
      "characterLimit": 0,
      "truncatedDocumentIds": [
        "string"
      ]
    },
    "observations": [
      {
        "id": "string",
        "kind": "metric",
        "anchor": "string",
        "sourceUrl": "string",
        "summary": "string",
        "value": {},
        "unit": "string",
        "attribution": "observed",
        "eligible": true,
        "details": {}
      }
    ],
    "comparisons": [
      {
        "cohort": "string",
        "samples": 0,
        "median": {},
        "status": "descriptive_comparison",
        "observationIds": [
          null
        ]
      }
    ],
    "bounds": {
      "metricLimit": 100,
      "reviewLimit": 30,
      "editLimit": 30,
      "linkLimit": 30,
      "outcomeLimit": 30,
      "truncated": true
    },
    "authorityComplete": true
  },
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string"
    }
  ],
  "proposal": {
    "lesson": "string",
    "evidenceIds": [
      "string"
    ],
    "limitations": [
      "string"
    ],
    "variations": [
      {}
    ]
  },
  "error": {},
  "direction": "current",
  "runId": {},
  "canResume": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /learning/quote
```http
POST /learning/quote
```
Tag: Platform
Auth: API key
Operation ID: `createLearningQuote`
Inspect Series evidence and bounded learning cost
Inspect Series evidence and bounded learning cost.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/learning/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"seriesId":"string","goal":"reach","from":"string","to":"string","maxVariations":0,"language":"en"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "evidence": {
    "fingerprint": "string",
    "capturedAt": "string",
    "seriesName": "string",
    "request": {
      "seriesId": "string",
      "goal": "reach",
      "from": "string",
      "to": "string",
      "maxVariations": 0,
      "language": "en"
    },
    "context": {
      "direction": {
        "capturedAt": "string",
        "scope": {},
        "brand": {}
      },
      "precedence": [
        "string"
      ],
      "documents": [
        {}
      ],
      "bounds": {
        "limit": 0,
        "offset": 0,
        "total": 0,
        "returned": 0,
        "hasMore": true,
        "truncated": true
      },
      "characterLimit": 0,
      "truncatedDocumentIds": [
        "string"
      ]
    },
    "observations": [
      {
        "id": "string",
        "kind": "metric",
        "anchor": "string",
        "sourceUrl": "string",
        "summary": "string",
        "value": {},
        "unit": "string",
        "attribution": "observed",
        "eligible": true,
        "details": {}
      }
    ],
    "comparisons": [
      {
        "cohort": "string",
        "samples": 0,
        "median": {},
        "status": "descriptive_comparison",
        "observationIds": [
          null
        ]
      }
    ],
    "bounds": {
      "metricLimit": 100,
      "reviewLimit": 30,
      "editLimit": 30,
      "linkLimit": 30,
      "outcomeLimit": 30,
      "truncated": true
    },
    "authorityComplete": true
  },
  "quoteId": "string",
  "maximumUsd": 0,
  "credits": 0,
  "expiresAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /library/broll/search
```http
GET /library/broll/search
```
Tag: Media Library
Auth: API key
Operation ID: `searchGlobalBrollLibrary`
Search the BlitzReels global B-roll library
Search the BlitzReels global B-roll library.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
query | query | no | `object` | -
asset_type | query | no | `object` | -
audio_type | query | no | `object` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/library/broll/search" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "id": "string",
      "asset_type": "image",
      "title": "string",
      "description": "string",
      "tags": [
        "string"
      ],
      "preview_url": {},
      "thumbnail_url": {},
      "mime_type": "string",
      "file_size_bytes": 0,
      "duration_seconds": {},
      "width": {},
      "height": {},
      "audio_type": "music",
      "license_code": "string",
      "license_url": {},
      "requires_attribution": true,
      "attribution_text": {},
      "source_url": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /library/broll/{libraryAssetId}/import
```http
POST /library/broll/{libraryAssetId}/import
```
Tag: Media Library
Auth: API key
Operation ID: `importGlobalBrollLibraryAsset`
Import a global B-roll library asset into workspace media
Import a global B-roll library asset into workspace media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
libraryAssetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/library/broll/{libraryAssetId}/import" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"folder_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset": {
    "id": "string",
    "name": "string",
    "asset_type": "image",
    "processing_status": "string",
    "library_asset_id": "string"
  },
  "imported": true,
  "deduped": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /maps/jobs
```http
POST /maps/jobs
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createMapsJobs`
Prepare retained map tiles, image and geometry from a reviewed quote
Prepare retained map tiles, image and geometry from a reviewed quote.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/maps/jobs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"request":{"providerId":"string","center":{"lat":0,"lon":0},"zoom":0,"width":0,"height":0,"geometry":[{"id":"string","type":"point","coordinates":[null]}],"maxCredits":0,"maxUsd":0},"quoteId":"string","idempotencyKey":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "providerId": "string",
    "center": {
      "lat": 0,
      "lon": 0
    },
    "zoom": 0,
    "width": 0,
    "height": 0,
    "geometry": [
      {
        "id": "string",
        "type": "point",
        "coordinates": [
          null
        ]
      }
    ],
    "maxCredits": 0,
    "maxUsd": 0
  },
  "preparedTiles": 0,
  "tileCount": 0,
  "attempts": 0,
  "canResume": true,
  "diagnostic": {
    "code": "string",
    "message": "string",
    "retryable": true
  },
  "assets": [
    {
      "path": "string",
      "hash": "string",
      "bytes": 0,
      "remoteUrl": "string",
      "assetId": "string"
    }
  ],
  "attribution": "string",
  "sourceUrl": "string",
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /maps/jobs/{jobId}
```http
GET /maps/jobs/{jobId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getMapsJobsJobId`
Read map progress, coverage diagnostics and retained assets
Read map progress, coverage diagnostics and retained assets.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/maps/jobs/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "providerId": "string",
    "center": {
      "lat": 0,
      "lon": 0
    },
    "zoom": 0,
    "width": 0,
    "height": 0,
    "geometry": [
      {
        "id": "string",
        "type": "point",
        "coordinates": [
          null
        ]
      }
    ],
    "maxCredits": 0,
    "maxUsd": 0
  },
  "preparedTiles": 0,
  "tileCount": 0,
  "attempts": 0,
  "canResume": true,
  "diagnostic": {
    "code": "string",
    "message": "string",
    "retryable": true
  },
  "assets": [
    {
      "path": "string",
      "hash": "string",
      "bytes": 0,
      "remoteUrl": "string",
      "assetId": "string"
    }
  ],
  "attribution": "string",
  "sourceUrl": "string",
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /maps/jobs/{jobId}/control
```http
POST /maps/jobs/{jobId}/control
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createMapsJobsJobIdControl`
Cancel preparation or resume using retained tiles
Cancel preparation or resume using retained tiles.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/maps/jobs/JOB_ID/control" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"action":"resume"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "providerId": "string",
    "center": {
      "lat": 0,
      "lon": 0
    },
    "zoom": 0,
    "width": 0,
    "height": 0,
    "geometry": [
      {
        "id": "string",
        "type": "point",
        "coordinates": [
          null
        ]
      }
    ],
    "maxCredits": 0,
    "maxUsd": 0
  },
  "preparedTiles": 0,
  "tileCount": 0,
  "attempts": 0,
  "canResume": true,
  "diagnostic": {
    "code": "string",
    "message": "string",
    "retryable": true
  },
  "assets": [
    {
      "path": "string",
      "hash": "string",
      "bytes": 0,
      "remoteUrl": "string",
      "assetId": "string"
    }
  ],
  "attribution": "string",
  "sourceUrl": "string",
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /maps/providers
```http
GET /maps/providers
```
Tag: Platform
Auth: API key
Operation ID: `getMapsProviders`
List configured map providers and coverage
List configured map providers and coverage.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/maps/providers" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "providers": [
    {
      "id": "string",
      "attribution": "string",
      "sourceUrl": "string",
      "minZoom": 0,
      "maxZoom": 0,
      "tileSize": 0
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /maps/quote
```http
POST /maps/quote
```
Tag: Platform
Auth: API key
Operation ID: `createMapsQuote`
Inspect geographic coverage and bounded map preparation cost
Inspect geographic coverage and bounded map preparation cost.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/maps/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"providerId":"string","center":{"lat":0,"lon":0},"zoom":0,"width":0,"height":0,"geometry":[{"id":"string","type":"point","coordinates":[{}]}],"maxCredits":0,"maxUsd":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "canStart": true,
  "blockers": [
    "string"
  ],
  "credits": 0,
  "maximumUsd": 0,
  "tileCount": 0,
  "maxProviderCalls": 0,
  "maxStoredBytes": 0,
  "executionSeconds": 0,
  "attribution": "string",
  "sourceUrl": "string",
  "bounds": {
    "west": 0,
    "east": 0,
    "south": 0,
    "north": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /mutations/lookup
```http
GET /mutations/lookup
```
Tag: Platform
Auth: API key
Operation ID: `lookupMutation`
Look up a mutation receipt by caller key
Read the receipt for this API key, workspace, operation and idempotency key. No mutation is retried. A null receipt means no receipt was found at read time; it does not prove that an outstanding request cannot still be accepted. Receipt status describes request execution, not background job completion.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
operation | query | yes | `string` | -
idempotency_key | query | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/mutations/lookup" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "receipt": {
    "receipt_id": "string",
    "operation": "string",
    "idempotency_key": "string",
    "status": "in_progress",
    "created_at": "string",
    "updated_at": "string",
    "completed_at": {},
    "resources": {
      "project_id": {},
      "job_id": {},
      "media_id": {},
      "export_id": {}
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /onboarding/brand-profile
```http
GET /onboarding/brand-profile
```
Tag: Onboarding
Auth: API key
Operation ID: `getOnboardingBrandProfile`
Get onboarding brand profile
Get onboarding brand profile.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/onboarding/brand-profile" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "profile": {
    "id": "string",
    "business_outcome": "book_calls",
    "website_url": {},
    "brand_name": {},
    "tagline": {},
    "audience": {},
    "offer": {},
    "conversion_goal": {},
    "tone": {},
    "messaging": {},
    "color_palette": [
      "string"
    ],
    "logo_candidates": [
      {}
    ],
    "suggested_safe_words": [
      "string"
    ],
    "social_profiles": [
      {}
    ],
    "status": "string",
    "last_scanned_at": {},
    "updated_at": "string"
  },
  "onboarding": {
    "completed": true,
    "data_saved": true
  },
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /onboarding/brand-profile
```http
PATCH /onboarding/brand-profile
```
Tag: Onboarding
Auth: API key
Operation ID: `updateOnboardingBrandProfile`
Update onboarding brand profile
Update onboarding brand profile.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/onboarding/brand-profile" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"business_outcome":"book_calls","website_url":"string","social_profiles":[{"platform":"linkedin","value":"string"}],"brand_name":"string","tagline":"string","audience":"string","offer":"string","conversion_goal":"string","tone":"string","color_palette":["string"],"logo_candidates":[{"url":"string"}],"suggested_safe_words":["string"],"workspace_description":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "profile": {
    "id": "string",
    "business_outcome": "book_calls",
    "website_url": {},
    "brand_name": {},
    "tagline": {},
    "audience": {},
    "offer": {},
    "conversion_goal": {},
    "tone": {},
    "messaging": {},
    "color_palette": [
      "string"
    ],
    "logo_candidates": [
      {}
    ],
    "suggested_safe_words": [
      "string"
    ],
    "social_profiles": [
      {}
    ],
    "status": "string",
    "last_scanned_at": {},
    "updated_at": "string"
  },
  "onboarding": {
    "completed": true,
    "data_saved": true
  },
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /onboarding/brand-scan
```http
POST /onboarding/brand-scan
```
Tag: Onboarding
Auth: API key
Operation ID: `startOnboardingBrandScan`
Start onboarding brand scan
Start onboarding brand scan.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/onboarding/brand-scan" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"website_url":"string","business_outcome":"book_calls"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run_id": "string",
  "brand_profile_id": {},
  "source_url": "string",
  "status": "string",
  "error": {},
  "pages_scanned": 0,
  "created_at": "string",
  "completed_at": {},
  "profile": {
    "id": "string",
    "business_outcome": "book_calls",
    "website_url": {},
    "brand_name": {},
    "tagline": {},
    "audience": {},
    "offer": {},
    "conversion_goal": {},
    "tone": {},
    "messaging": {},
    "color_palette": [
      "string"
    ],
    "logo_candidates": [
      {}
    ],
    "suggested_safe_words": [
      "string"
    ],
    "social_profiles": [
      {}
    ],
    "status": "string",
    "last_scanned_at": {},
    "updated_at": "string"
  },
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /onboarding/brand-scans/{runId}
```http
GET /onboarding/brand-scans/{runId}
```
Tag: Onboarding
Auth: API key
Operation ID: `getOnboardingBrandScan`
Get onboarding brand scan
Get onboarding brand scan.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
runId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/onboarding/brand-scans/{runId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run_id": "string",
  "brand_profile_id": {},
  "source_url": "string",
  "status": "string",
  "error": {},
  "pages_scanned": 0,
  "created_at": "string",
  "completed_at": {},
  "profile": {
    "id": "string",
    "business_outcome": "book_calls",
    "website_url": {},
    "brand_name": {},
    "tagline": {},
    "audience": {},
    "offer": {},
    "conversion_goal": {},
    "tone": {},
    "messaging": {},
    "color_palette": [
      "string"
    ],
    "logo_candidates": [
      {}
    ],
    "suggested_safe_words": [
      "string"
    ],
    "social_profiles": [
      {}
    ],
    "status": "string",
    "last_scanned_at": {},
    "updated_at": "string"
  },
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /onboarding/complete
```http
POST /onboarding/complete
```
Tag: Onboarding
Auth: API key
Operation ID: `completeOnboarding`
Complete onboarding
Complete onboarding.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/onboarding/complete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"business_outcome":"book_calls","website_url":"string","social_profiles":[{"platform":"linkedin","value":"string"}],"brand_name":"string","tagline":"string","audience":"string","offer":"string","conversion_goal":"string","tone":"string","color_palette":["string"],"logo_candidates":[{"url":"string"}],"suggested_safe_words":["string"],"workspace_description":"string","platforms":["string"],"save_workspace_icon":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "workspace_config": {},
  "perk_granted": true,
  "profile": {
    "id": "string",
    "business_outcome": "book_calls",
    "website_url": {},
    "brand_name": {},
    "tagline": {},
    "audience": {},
    "offer": {},
    "conversion_goal": {},
    "tone": {},
    "messaging": {},
    "color_palette": [
      "string"
    ],
    "logo_candidates": [
      {
        "url": "string"
      }
    ],
    "suggested_safe_words": [
      "string"
    ],
    "social_profiles": [
      {
        "platform": "linkedin",
        "value": "string"
      }
    ],
    "status": "string",
    "last_scanned_at": {},
    "updated_at": "string"
  },
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /onboarding/logo/import
```http
POST /onboarding/logo/import
```
Tag: Onboarding
Auth: API key
Operation ID: `importOnboardingLogo`
Import onboarding logo
Import onboarding logo.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/onboarding/logo/import" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"profile_id":"string","logo_url":"string","replace_existing":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "icon_storage_key": {},
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects
```http
GET /projects
```
Tag: Project Management
Auth: API key
Operation ID: `listProjects`
List projects
List projects.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `number` | -
cursor | query | no | `string` | -
offset | query | no | `number` | -
search | query | no | `string` | -
status | query | no | `string` (active, archived, all) | -
exclude_clip_projects | query | no | `boolean` | -
has_export | query | no | `boolean` | -
aspect_ratio | query | no | `string` (9:16, 16:9, 1:1, 4:5) | -
sort_by | query | no | `string` (updated_at, created_at) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "projects": [
    {
      "series_id": "string",
      "id": "string",
      "name": "string",
      "description": {},
      "aspect_ratio": "9:16",
      "status": "string",
      "thumbnail_url": {},
      "created_at": "string",
      "updated_at": "string",
      "timeline_summary": {
        "total_items": 0,
        "duration_seconds": 0
      },
      "has_export": true
    }
  ],
  "items": [
    {
      "series_id": "string",
      "id": "string",
      "name": "string",
      "description": {},
      "aspect_ratio": "9:16",
      "status": "string",
      "thumbnail_url": {},
      "created_at": "string",
      "updated_at": "string",
      "timeline_summary": {
        "total_items": 0,
        "duration_seconds": 0
      },
      "has_export": true
    }
  ],
  "count": 0,
  "next_cursor": {},
  "has_more": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects
```http
POST /projects
```
Tag: Project Management
Auth: API key
Operation ID: `createProject`
Create project
Create project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"series_id":"string","name":"string","description":"string","aspect_ratio":"9:16","project_type":"video","carousel_settings":{"platform":"tiktok","safe_area_preset":"tiktok_9_16","slide_count":0,"background_strategy":"solid","export_formats":["png"],"jpeg_quality":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series_id": "string",
  "id": "string",
  "name": "string",
  "description": {},
  "aspect_ratio": "9:16",
  "status": "string",
  "thumbnail_url": {},
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/batch-delete
```http
POST /projects/batch-delete
```
Tag: Project Management
Auth: API key
Operation ID: `createProjectsBatchDelete`
Delete selected projects
Delete selected projects.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/batch-delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["string"],"search":"string","name_prefix":"string","confirm_delete":true,"dry_run":true,"reason":"string","delete_generated_clips":true,"delete_linked_projects":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "selected_count": 0,
  "deleted_count": 0,
  "selected_ids": [
    "string"
  ],
  "deleted_ids": [
    "string"
  ],
  "failed_count": 0,
  "failed_items": [
    {
      "id": "string",
      "error": "string"
    }
  ],
  "impact": {
    "linked_project_count": 0,
    "linked_projects": [
      {
        "id": "string",
        "name": "string"
      }
    ],
    "generated_clip_count": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}
```http
GET /projects/{projectId}
```
Tag: Project Management
Auth: API key
Operation ID: `getProject`
Get project
Get project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series_id": "string",
  "id": "string",
  "name": "string",
  "description": {},
  "aspect_ratio": "9:16",
  "status": "string",
  "thumbnail_url": {},
  "created_at": "string",
  "updated_at": "string",
  "has_export": true,
  "total_items": 0,
  "revision": 0,
  "preview_video_url": {},
  "preview_video_start_seconds": 0,
  "preview_video_end_seconds": {},
  "clip_duration_seconds": 0,
  "preview_source_views": [
    {
      "timeline_item_id": "string",
      "source_crop_x": 0,
      "source_crop_y": 0,
      "source_crop_width": 0,
      "source_crop_height": 0,
      "canvas_x": 0,
      "canvas_y": 0,
      "canvas_width": 0,
      "canvas_height": 0,
      "fit_mode": "contain",
      "planner_mode": "string",
      "source_width": {},
      "source_height": {}
    }
  ],
  "duration_seconds": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}
```http
PATCH /projects/{projectId}
```
Tag: Project Management
Auth: API key
Operation ID: `updateProject`
Update project metadata
Update project metadata.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","aspect_ratio":"9:16"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series_id": "string",
  "id": "string",
  "name": "string",
  "description": {},
  "aspect_ratio": "9:16",
  "status": "string",
  "thumbnail_url": {},
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /projects/{projectId}
```http
DELETE /projects/{projectId}
```
Tag: Platform
Auth: API key
Operation ID: `deleteProjectsProjectId`
Delete project
Delete project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/projects/PROJECT_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/ai-edit/runs
```http
POST /projects/{projectId}/ai-edit/runs
```
Tag: Platform
Auth: API key
Operation ID: `createProjectsProjectIdAiEditRuns`
Create external AI edit run
Create external AI edit run.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/ai-edit/runs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"style_id":"mirage-black","quality_target":"fast","controller_kind":"api","dry_run":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run": {
    "id": "string",
    "project_id": "string",
    "organization_id": "string",
    "user_id": "string",
    "api_key_id": {},
    "execution_mode": "external_controller",
    "credit_mode": "external",
    "controller_kind": "api",
    "status": "queued",
    "style_id": "mirage-black",
    "quality_target": "fast",
    "run_config": {},
    "budget_receipt": {},
    "summary": {},
    "failure_message": {},
    "completed_at": {},
    "created_at": "string",
    "updated_at": "string"
  },
  "context": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/audio-levels
```http
GET /projects/{projectId}/audio-levels
```
Tag: Project Context
Auth: API key
Operation ID: `getProjectsProjectIdAudioLevels`
Get audio levels for timeline item
Get audio levels for timeline item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timeline_item_id | query | yes | `string` | -
silence_threshold | query | no | `number` | -
min_silence_duration | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/audio-levels" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "totalDurationSeconds": 0,
  "regions": [
    {
      "type": "speech",
      "startSeconds": 0,
      "endSeconds": 0,
      "durationSeconds": 0
    }
  ],
  "speechDurationSeconds": 0,
  "silenceDurationSeconds": 0,
  "speechPercentage": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/broll
```http
POST /projects/{projectId}/broll
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdBroll`
Insert B-roll items
Insert B-roll items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/broll" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"asset_id":"string","source_start_seconds":0,"start_seconds":0,"duration_seconds":0,"layer_index":0,"placement_intent":"overlay","position_preset":"center","position_x":0,"position_y":0,"width_px":0,"height_px":0,"keep_aspect_ratio":true,"scale":0,"opacity":0,"volume":0,"animation_preset":"none"}],"allow_duplicate":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "inserted": [
    {
      "asset_id": "string",
      "start_seconds": 0,
      "success": true,
      "already_existed": true,
      "timeline_item_id": {},
      "message": {},
      "animation_applied": {},
      "layer_index": 0,
      "placement_intent": "overlay",
      "placement": {},
      "warnings": [
        "string"
      ]
    }
  ],
  "summary": {
    "total": 0,
    "actually_inserted": 0,
    "already_in_timeline": 0,
    "failed": 0
  },
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/caption-theme
```http
POST /projects/{projectId}/caption-theme
```
Tag: Captions and Themes
Auth: API key
Operation ID: `setProjectCaptionTheme`
Set project caption theme
Set project caption theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/caption-theme" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"theme_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "theme_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/captions
```http
GET /projects/{projectId}/captions
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getProjectsProjectIdCaptions`
List captions
List captions.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
limit | query | no | `number` | -
offset | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "captions": [
    {
      "caption_id": "string",
      "timeline_item_id": {},
      "project_id": "string",
      "text": "string",
      "start_units": {},
      "end_units": {},
      "start_seconds": {},
      "end_seconds": {},
      "words": [
        {}
      ]
    }
  ],
  "pagination": {
    "total": 0,
    "returned": 0,
    "offset": 0,
    "limit": 0,
    "has_more": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions
```http
POST /projects/{projectId}/captions
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptions`
Apply caption style
Apply caption style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"caption_style_id":"string","style_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "style_id": "string",
  "name": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/delete
```http
POST /projects/{projectId}/captions/delete
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsDelete`
Delete caption timeline items
Delete caption timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"all":true,"caption_id":"string","timeline_item_id":"string","from_seconds":0,"to_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "action": "delete",
  "affected_count": 0,
  "caption_ids": [
    "string"
  ],
  "timeline_item_ids": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/hide
```http
POST /projects/{projectId}/captions/hide
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsHide`
Hide caption timeline items
Hide caption timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/hide" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"all":true,"caption_id":"string","timeline_item_id":"string","from_seconds":0,"to_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "action": "delete",
  "affected_count": 0,
  "caption_ids": [
    "string"
  ],
  "timeline_item_ids": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/hydrate
```http
POST /projects/{projectId}/captions/hydrate
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsHydrate`
Restore project captions from the canonical transcript
Restore project captions from the canonical transcript.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/hydrate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "status": "hydrated",
  "project_id": "string",
  "asset_id": "string",
  "promoted": true,
  "caption_count": 0,
  "captions_added": 0,
  "deleted_caption_timeline_items": 0,
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/show
```http
POST /projects/{projectId}/captions/show
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsShow`
Show caption timeline items
Show caption timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/show" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"all":true,"caption_id":"string","timeline_item_id":"string","from_seconds":0,"to_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "action": "delete",
  "affected_count": 0,
  "caption_ids": [
    "string"
  ],
  "timeline_item_ids": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/captions/style
```http
GET /projects/{projectId}/captions/style
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getProjectsProjectIdCaptionsStyle`
Get caption style
Get caption style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/style" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "settings": {
    "fontSize": 0,
    "fontFamily": "string",
    "fontWeight": "string",
    "fontStyle": "normal",
    "textAlign": "string",
    "lineHeight": 0,
    "letterSpacing": 0,
    "wordSpacingPx": {},
    "color": "string",
    "backgroundColor": "string",
    "backgroundShape": "per-line",
    "backgroundJoinStyle": "connected",
    "borderRadius": 0,
    "border": "string",
    "paddingPx": {},
    "paddingXPx": {},
    "paddingYPx": {},
    "textFillStyle": "solid",
    "textGradientFrom": "string",
    "textGradientTo": "string",
    "textGradientAngleDeg": 0,
    "textGradientStops": {},
    "textGradientColorSpace": "srgb",
    "textStrokeEnabled": true,
    "textStrokeColor": "string",
    "textStrokeWidthPx": 0,
    "textStrokeBlurPx": 0,
    "textShadow": "string",
    "shadowMode": "text-shadow",
    "position": "string",
    "customPositionY": {},
    "showActiveWord": true,
    "activeWordScale": 0,
    "activeWordTransition": "spring",
    "activeWordLayout": "reserved",
    "phraseAppearance": "standard",
    "karaoke": "standard",
    "slidingHighlight": true,
    "captionMotion": "none",
    "activeWordColor": "string",
    "activeWordBackgroundColor": "string",
    "activeWordAnimation": "string",
    "activeWordHoldMs": 0,
    "spokenWordColorDurationMs": 0,
    "emojiOverlaySizePx": {},
    "showEmojiOverlay": true,
    "wordRevealAnimation": "string",
    "revealMode": "single",
    "paragraphReveal": "sequential",
    "paragraphMode": "off",
    "paragraphTransition": "fade",
    "paragraphFadeMs": 0,
    "pageCombineMs": 0,
    "textTransform": "none",
    "maxLinesPerCaption": 0,
    "wordsPerLineLimit": {},
    "backgroundFillStyle": "solid",
    "backgroundGradientFrom": {},
    "backgroundGradientTo": {},
    "backgroundGradientAngleDeg": {},
    "backgroundGlowColor": {},
    "backgroundGlowBlurPx": {},
    "marginBottomPx": {},
    "emphasisEnabled": true,
    "emphasisFontFamily": {},
    "emphasisColor": {},
    "emphasisScale": {},
    "emphasisFontWeight": {},
    "emphasisFontStyle": "normal",
    "lineWrap": "balanced",
    "customPositionAnchor": "top",
    "emphasisBackgroundColor": {},
    "emphasisStrokeEnabled": true,
    "emphasisStrokeColor": {},
    "emphasisStrokeWidthPx": {},
    "emphasisGlowColor": {},
    "emphasisGlowBlurPx": {},
    "emphasisRotationDeg": {},
    "emphasisAnimation": "none"
  },
  "look_id": {},
  "preset_id": {},
  "hint": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/captions/style
```http
PATCH /projects/{projectId}/captions/style
```
Tag: Captions and Themes
Auth: API key
Operation ID: `updateProjectsProjectIdCaptionsStyle`
Update caption style
Update caption style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/style" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"look_id":"string","preset_id":"string","clear_word_overrides":true,"style":{"fontSize":0,"fontFamily":"string","fontWeight":"string","textAlign":"left","lineHeight":0,"letterSpacing":0,"color":"string","backgroundColor":"string","borderRadius":0,"textStrokeEnabled":true,"textStrokeColor":"string","textStrokeWidthPx":0,"textStrokeBlurPx":0,"textShadow":"string","position":"bottom","customPositionY":0,"showActiveWord":true,"spokenWordColorDurationMs":0,"activeWordScale":0,"activeWordTransition":"spring","activeWordLayout":"reserved","phraseAppearance":"standard","karaoke":"standard","slidingHighlight":true,"captionMotion":"none","lineWrap":"balanced","customPositionAnchor":"top","emphasisFontStyle":"normal","activeWordColor":"string","activeWordBackgroundColor":"string","activeWordAnimation":"highlight","emojiOverlaySizePx":0,"wordRevealAnimation":"none","maxLinesPerCaption":0,"wordsPerLineLimit":0,"emphasisEnabled":true,"emphasisColor":{},"emphasisScale":0,"emphasisFontWeight":"string","emphasisGlowColor":{},"emphasisGlowBlurPx":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updated_properties": [
    "string"
  ],
  "look_id": {},
  "preset_id": {},
  "verified": true,
  "effective_settings": {},
  "warnings": [
    "string"
  ],
  "cleared_word_overrides": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/captions/words
```http
GET /projects/{projectId}/captions/words
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getProjectsProjectIdCaptionsWords`
List caption words
List caption words.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timeline_item_id | query | no | `string` | -
match_text | query | no | `string` | -
limit | query | no | `number` | -
offset | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "words": [
    {
      "id": "string",
      "captionId": "string",
      "timelineItemId": {},
      "word": "string",
      "orderIndex": 0,
      "sequenceIndex": 0,
      "isEmphasis": true,
      "startUnits": {},
      "endUnits": {},
      "startSeconds": {},
      "endSeconds": {},
      "paragraphIndex": {},
      "style": {}
    }
  ],
  "items": [
    {
      "id": "string",
      "captionId": "string",
      "timelineItemId": {},
      "word": "string",
      "orderIndex": 0,
      "sequenceIndex": 0,
      "isEmphasis": true,
      "startUnits": {},
      "endUnits": {},
      "startSeconds": {},
      "endSeconds": {},
      "paragraphIndex": {},
      "style": {}
    }
  ],
  "count": 0,
  "warnings": [
    "string"
  ],
  "pagination": {
    "total": 0,
    "returned": 0,
    "offset": 0,
    "limit": 0,
    "hasMore": true
  },
  "summary": {
    "totalWords": 0,
    "emphasisCount": 0,
    "hasEmphasis": true
  },
  "hint": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/batch-text
```http
POST /projects/{projectId}/captions/words/batch-text
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsBatchText`
Update multiple caption word texts
Update multiple caption word texts.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/batch-text" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"word_id":"string","new_text":"string"}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updates": [
    {
      "word_id": "string",
      "caption_id": "string",
      "old_text": "string",
      "new_text": "string"
    }
  ],
  "affected_caption_ids": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/delete
```http
POST /projects/{projectId}/captions/words/delete
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsDelete`
Delete caption words
Delete caption words.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_ids":["string"],"timeline_item_id":"string","all":true,"from_seconds":0,"to_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "caption_id": "string",
  "affected_caption_ids": [
    "string"
  ],
  "deleted_word_ids": [
    "string"
  ],
  "merged_word_id": "string",
  "split_word_ids": [
    "string"
  ],
  "words": [
    {
      "id": "string",
      "word": "string",
      "order_index": 0,
      "start_units": {},
      "end_units": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/emphasis
```http
POST /projects/{projectId}/captions/words/emphasis
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsEmphasis`
Set caption word emphasis
Set caption word emphasis.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/emphasis" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_ids":["string"],"match_text":"string","match_pattern":"numbers","timeline_item_id":"string","all":true,"from_seconds":0,"to_seconds":0,"emphasis":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updated_count": 0,
  "updated_word_ids": [
    "string"
  ],
  "emphasis": true,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/merge
```http
POST /projects/{projectId}/captions/words/merge
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsMerge`
Merge caption words
Merge caption words.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/merge" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_ids":["string"],"text":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "caption_id": "string",
  "affected_caption_ids": [
    "string"
  ],
  "deleted_word_ids": [
    "string"
  ],
  "merged_word_id": "string",
  "split_word_ids": [
    "string"
  ],
  "words": [
    {
      "id": "string",
      "word": "string",
      "order_index": 0,
      "start_units": {},
      "end_units": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/retime
```http
POST /projects/{projectId}/captions/words/retime
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsRetime`
Update caption word timing
Update caption word timing.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/retime" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"word_id":"string","start_seconds":0,"end_seconds":0}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updates": [
    {
      "word_id": "string",
      "caption_id": "string",
      "old_start_units": {},
      "old_end_units": {},
      "new_start_units": 0,
      "new_end_units": 0,
      "old_start_seconds": {},
      "old_end_seconds": {},
      "new_start_seconds": 0,
      "new_end_seconds": 0
    }
  ],
  "affected_caption_ids": [
    "string"
  ],
  "words": [
    {
      "id": "string",
      "word": "string",
      "order_index": 0,
      "start_units": {},
      "end_units": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/split
```http
POST /projects/{projectId}/captions/words/split
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsSplit`
Split a caption word
Split a caption word.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/split" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_id":"string","words":["string"]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "caption_id": "string",
  "affected_caption_ids": [
    "string"
  ],
  "deleted_word_ids": [
    "string"
  ],
  "merged_word_id": "string",
  "split_word_ids": [
    "string"
  ],
  "words": [
    {
      "id": "string",
      "word": "string",
      "order_index": 0,
      "start_units": {},
      "end_units": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/style
```http
POST /projects/{projectId}/captions/words/style
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsStyle`
Update caption word styles
Update caption word styles.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/style" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_ids":["string"],"match_text":"string","match_pattern":"numbers","timeline_item_id":"string","all":true,"from_seconds":0,"to_seconds":0,"style":{"offsetX":{},"offsetY":{},"rotationDeg":{},"scale":{},"fontFamily":{},"fontWeight":{},"color":{},"activeColor":{},"backgroundColor":{},"activeAnimation":"none","fontStyle":"normal","textTransform":"none","letterSpacing":{},"opacity":{},"textStrokeColor":{},"textStrokeWidthPx":{},"textStrokeBlurPx":{},"textShadow":{},"glowColor":{},"glowBlurPx":{},"textGradientFrom":{},"textGradientTo":{},"textGradientAngleDeg":{},"backgroundRadiusPx":{},"emojiName":{},"emojiScale":"1","isSpecial":{},"isKeyword":{},"lineBreakBefore":true},"clear_existing":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updated_count": 0,
  "updated_word_ids": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/captions/words/text
```http
POST /projects/{projectId}/captions/words/text
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsWordsText`
Update a caption word text
Update a caption word text.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/words/text" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"word_id":"string","new_text":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "word_id": "string",
  "old_text": "string",
  "new_text": "string",
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/captions/{captionId}
```http
GET /projects/{projectId}/captions/{captionId}
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getProjectsProjectIdCaptionsCaptionId`
Get caption
Get caption.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
captionId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/{captionId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "caption": {
    "caption_id": "string",
    "timeline_item_id": {},
    "project_id": "string",
    "text": "string",
    "start_units": {},
    "end_units": {},
    "start_seconds": {},
    "end_seconds": {},
    "words": [
      {
        "id": "string",
        "word": "string",
        "order_index": 0,
        "start_units": {},
        "end_units": {},
        "start_seconds": {},
        "end_seconds": {},
        "paragraph_index": {},
        "is_emphasis": true
      }
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/captions/{captionId}
```http
PATCH /projects/{projectId}/captions/{captionId}
```
Tag: Captions and Themes
Auth: API key
Operation ID: `updateProjectsProjectIdCaptionsCaptionId`
Patch caption text
Patch caption text.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
captionId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/captions/{captionId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"string","start_units":0,"end_units":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "caption": {
    "caption_id": "string",
    "timeline_item_id": {},
    "project_id": "string",
    "text": "string",
    "start_units": {},
    "end_units": {},
    "start_seconds": {},
    "end_seconds": {},
    "words": [
      {
        "id": "string",
        "word": "string",
        "order_index": 0,
        "start_units": {},
        "end_units": {},
        "start_seconds": {},
        "end_seconds": {},
        "paragraph_index": {},
        "is_emphasis": true
      }
    ]
  },
  "updated_words": 0,
  "inserted_words": 0,
  "deleted_words": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/carousels/generate
```http
POST /projects/{projectId}/carousels/generate
```
Tag: Platform
Auth: API key
Operation ID: `createProjectsProjectIdCarouselsGenerate`
Generate carousel slides in one call (legacy)
Legacy title/body dump. Compiles onto named templates. New agents should POST /carousels/compile.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/carousels/generate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"clear_existing":true,"slide_duration_seconds":0,"background_strategy":"solid","image_model_id":"fal-ai/gpt-image-1","slides":[{"title":"string","body":"string","logos":["codex"],"background_image_url":"string","background_prompt":"string","background_color":"string"}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "slide_count": 0,
  "job_id": {},
  "ai_image_run_id": {},
  "timeline_item_ids": [
    "string"
  ],
  "overlay_ids": [
    "string"
  ],
  "fill_layer_ids": [
    "string"
  ],
  "ai_asset_ids": [
    "string"
  ],
  "logo_asset_ids": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/composition-presets/{contentItemId}/theme
```http
PATCH /projects/{projectId}/composition-presets/{contentItemId}/theme
```
Tag: Timeline Editing
Auth: API key
Operation ID: `updateProjectsProjectIdCompositionPresetsContentItemIdTheme`
Set a YouTube video outro theme
Set a YouTube video outro theme.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
contentItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/composition-presets/CONTENT_ITEM_ID/theme" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"theme":"dark"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "content_item_id": "string",
  "theme": "dark",
  "previous_background_color": "string",
  "background_color": "string",
  "text_color": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/content-items
```http
GET /projects/{projectId}/content-items
```
Tag: Timeline Editing
Auth: API key
Operation ID: `listProjectContentItems`
List editable content items
List editable content items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/content-items" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "data": [
    {
      "content_item_id": "string",
      "kind": "overlay",
      "name": "string",
      "timeline_item_id": {},
      "start_seconds": {},
      "duration_seconds": {},
      "layer_index": {},
      "playground_composition_id": {},
      "watermark_id": {},
      "spec": {},
      "compositionValidationError": {},
      "watermark": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/content-items
```http
POST /projects/{projectId}/content-items
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectContentItem`
Create editable content item
Create editable content item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/content-items" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"overlay","name":"string","text":"string","title":"string","subtitle":{},"spec":{},"watermark_style":"lower_third","watermark_text_preset":"blitzreels","start_seconds":0,"duration_seconds":0,"layer_index":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "content_item_id": "string",
  "timeline_item_id": {},
  "playground_composition_id": {},
  "watermark_id": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/content-items/{contentItemId}
```http
PATCH /projects/{projectId}/content-items/{contentItemId}
```
Tag: Timeline Editing
Auth: API key
Operation ID: `updateProjectContentItem`
Update editable content item
Update editable content item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
contentItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/content-items/CONTENT_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","text":"string","spec":{},"watermark_style":"lower_third","watermark_text_preset":"blitzreels","opacity":0,"duration_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "content_item_id": "string",
  "kind": "overlay",
  "timeline_item_id": {},
  "playground_composition_id": {},
  "watermark_id": {},
  "updated_text_count": 0,
  "previous_text": {},
  "next_text": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /projects/{projectId}/content-items/{contentItemId}
```http
DELETE /projects/{projectId}/content-items/{contentItemId}
```
Tag: Timeline Editing
Auth: API key
Operation ID: `deleteProjectContentItem`
Delete editable content item
Delete editable content item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
contentItemId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/projects/PROJECT_ID/content-items/CONTENT_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/context
```http
GET /projects/{projectId}/context
```
Tag: Project Context
Auth: API key
Operation ID: `getProjectContext`
Get project context
Get project context.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
mode | query | no | `string` (summary, assets, timeline, transcript, full) | -
search | query | no | `string` | -
asset_limit | query | no | `number` | -
asset_offset | query | no | `number` | -
timeline_limit | query | no | `number` | -
timeline_offset | query | no | `number` | -
transcript_limit | query | no | `number` | -
transcript_offset | query | no | `number` | -
caption_word_limit | query | no | `number` | -
caption_word_offset | query | no | `number` | -
media_asset_types | query | no | array of `string` (all, image, video, audio) | -
folder_ids | query | no | array of `string` | -
include_subfolders | query | no | `boolean` | -
include_transcripts | query | no | `boolean` | -
include_caption_words | query | no | `boolean` | -
include_timeline_items | query | no | `boolean` | -
include_media_assets | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/context" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "mode": "summary",
  "data": {
    "project": {
      "id": "string",
      "title": "string",
      "description": {},
      "aspectRatio": "9:16",
      "fps": 0,
      "unitsPerFrame": 0,
      "compositionWidth": 0,
      "compositionHeight": 0,
      "durationSeconds": 0
    },
    "assetCounts": {
      "video": 0,
      "audio": 0,
      "image": 0
    },
    "timelineItemCounts": {
      "video": 0,
      "audio": 0,
      "caption": 0,
      "image": 0,
      "fillLayer": 0,
      "effect": 0,
      "other": 0
    },
    "templateSettings": {
      "isTemplate": true,
      "variableCount": 0,
      "bindingCount": 0
    },
    "captionStyle": {
      "source": "organization_default",
      "captionThemeId": {},
      "captionThemeName": {},
      "wordOverrideCount": 0
    },
    "userPreferences": {}
  },
  "bounds": {
    "collections": [
      {}
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/editor-commands/execute
```http
POST /projects/{projectId}/editor-commands/execute
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdEditorCommandsExecute`
Execute a revision-checked editor command
Execute a revision-checked editor command.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/editor-commands/execute" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"command":{"kind":"editComposition","itemId":"string","edit":{"ownership":"preserve","duration":{},"structure":[null],"changes":[null]}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "projectId": "string",
  "revision": 0,
  "baseRevision": 0,
  "mutationReceiptId": "string",
  "replayed": true,
  "affectedTimelineItemIds": [
    "string"
  ],
  "createdTimelineItemIds": [
    "string"
  ],
  "deletedTimelineItemIds": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "result": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/editor-commands/preview
```http
POST /projects/{projectId}/editor-commands/preview
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdEditorCommandsPreview`
Preview the effects of an editor command
Preview the effects of an editor command.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/editor-commands/preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"command":{"kind":"editComposition","itemId":"string","edit":{"ownership":"preserve","duration":{},"structure":[null],"changes":[null]}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "elementChange": {
    "affectedElementIds": [
      "string"
    ],
    "removedElementIds": [
      "string"
    ]
  },
  "durationChange": {
    "previousSeconds": 0,
    "nextSeconds": 0,
    "placements": "preserve",
    "changes": [
      {
        "timelineItemId": "string",
        "previousDurationSeconds": 0,
        "nextDurationSeconds": 0,
        "nextTrimEndSeconds": 0
      }
    ]
  },
  "projectId": "string",
  "currentRevision": 0,
  "affectedTimelineItemIds": [
    "string"
  ],
  "wouldCreateTimelineItemIds": [
    "string"
  ],
  "wouldDeleteTimelineItemIds": [
    "string"
  ],
  "destructive": true,
  "changeCount": 0,
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/editor-commands/undo
```http
POST /projects/{projectId}/editor-commands/undo
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdEditorCommandsUndo`
Undo a saved editor action at the expected revision
Undo a saved editor action at the expected revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/editor-commands/undo" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"actionId":"string","expectedRevision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "projectId": "string",
  "revision": 0,
  "baseRevision": 0,
  "mutationReceiptId": "string",
  "replayed": true,
  "affectedTimelineItemIds": [
    "string"
  ],
  "createdTimelineItemIds": [
    "string"
  ],
  "deletedTimelineItemIds": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "result": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/editor-document
```http
GET /projects/{projectId}/editor-document
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdEditorDocument`
Read the editor composition with source timing and presentation
Read the editor composition with source timing and presentation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
offset | query | no | `integer` | -
limit | query | no | `integer` | -
expected_revision | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/editor-document" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "version": 1,
  "projectId": "string",
  "revision": 0,
  "name": "string",
  "aspectRatio": "string",
  "canvasWidth": 0,
  "canvasHeight": 0,
  "fps": 0,
  "durationSeconds": 0,
  "backgroundColor": {},
  "items": [
    {
      "id": "string",
      "type": "string",
      "contentType": {},
      "contentItemId": {},
      "captionId": {},
      "mediaAssetId": {},
      "parentGroupId": {},
      "label": "string",
      "text": "string",
      "startSeconds": 0,
      "endSeconds": 0,
      "trimStartSeconds": 0,
      "trimEndSeconds": 0,
      "layerIndex": 0,
      "ignored": true,
      "isSilentZone": true,
      "isMistake": true,
      "volume": 0,
      "audioFadeInSeconds": 0,
      "audioFadeOutSeconds": 0,
      "positionX": 0,
      "positionY": 0,
      "widthPx": {},
      "heightPx": {},
      "keepAspectRatio": true,
      "blurredBackground": true,
      "sourceView": {},
      "keyframes": [
        {}
      ],
      "properties": {}
    }
  ],
  "media": [
    {
      "id": "string",
      "assetType": "string",
      "audioType": {},
      "fileUrl": "string",
      "streamingUrl": {},
      "thumbnailUrl": {},
      "waveformPeaks": [
        0
      ],
      "sourceWidth": {},
      "sourceHeight": {},
      "creativeSource": {
        "projectId": "string",
        "artifactId": "string",
        "sourceRevisionId": "string",
        "sourceHash": "string"
      }
    }
  ],
  "tracks": [
    {
      "layerIndex": 0,
      "label": "string",
      "itemIds": [
        "string"
      ]
    }
  ],
  "bounds": {
    "offset": 0,
    "limit": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/editor-snapshot
```http
GET /projects/{projectId}/editor-snapshot
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdEditorSnapshot`
Read a compact editor snapshot with timeline captions and style
Read a compact editor snapshot with timeline captions and style.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
offset | query | no | `integer` | -
limit | query | no | `integer` | -
expected_revision | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/editor-snapshot" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "document": {
    "version": 1,
    "projectId": "string",
    "revision": 0,
    "name": "string",
    "aspectRatio": "string",
    "canvasWidth": 0,
    "canvasHeight": 0,
    "fps": 0,
    "durationSeconds": 0,
    "backgroundColor": {},
    "items": [
      {
        "id": "string",
        "type": "string",
        "contentType": {},
        "contentItemId": {},
        "captionId": {},
        "mediaAssetId": {},
        "parentGroupId": {},
        "label": "string",
        "text": "string",
        "startSeconds": 0,
        "endSeconds": 0,
        "trimStartSeconds": 0,
        "trimEndSeconds": 0,
        "layerIndex": 0,
        "ignored": true,
        "isSilentZone": true,
        "isMistake": true,
        "volume": 0,
        "audioFadeInSeconds": 0,
        "audioFadeOutSeconds": 0,
        "positionX": 0,
        "positionY": 0,
        "widthPx": {},
        "heightPx": {},
        "keepAspectRatio": true,
        "blurredBackground": true,
        "keyframes": [
          null
        ],
        "properties": {}
      }
    ],
    "media": [
      {
        "id": "string",
        "assetType": "string",
        "audioType": {},
        "fileUrl": "string",
        "streamingUrl": {},
        "thumbnailUrl": {},
        "waveformPeaks": [
          null
        ],
        "sourceWidth": {},
        "sourceHeight": {},
        "creativeSource": {}
      }
    ],
    "tracks": [
      {
        "layerIndex": 0,
        "label": "string",
        "itemIds": [
          null
        ]
      }
    ],
    "bounds": {
      "offset": 0,
      "limit": 0,
      "total": 0,
      "returned": 0,
      "hasMore": true,
      "truncated": true
    }
  },
  "preparedFor": {},
  "captions": [
    {
      "captionId": "string",
      "text": "string",
      "startSeconds": 0,
      "endSeconds": 0,
      "words": [
        {}
      ]
    }
  ],
  "captionStyle": {},
  "captionLookId": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/effects/colorgrade
```http
POST /projects/{projectId}/effects/colorgrade
```
Tag: Platform
Auth: API key
Operation ID: `addProjectColorGradeEffect`
Add a color grade effect
Add a color grade effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/colorgrade" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","content_item_id":"string","effect_id":"string","name":"string","start_time_seconds":0,"duration_seconds":0,"easing":"linear","layer_index":0,"order_index":0,"settings":{"lutEnabled":true,"lutPreset":{},"lutCustomUrl":{},"lutIntensity":0,"brightness":0,"contrast":0,"saturation":0,"temperature":0,"tint":0,"grainEnabled":true,"grainIntensity":0,"grainSize":0,"grainAnimated":true,"noiseEnabled":true,"noiseIntensity":0,"noiseType":"static","vignetteEnabled":true,"vignetteIntensity":0,"vignetteSize":0,"vignetteSoftness":0,"fadeToBlack":0,"fadeToWhite":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/effects/colorgrade/{timelineItemId}
```http
PATCH /projects/{projectId}/effects/colorgrade/{timelineItemId}
```
Tag: Platform
Auth: API key
Operation ID: `updateProjectColorGradeEffect`
Update a color grade effect
Update a color grade effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/colorgrade/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration_seconds":0,"easing":"linear","settings":{"lutEnabled":true,"lutPreset":{},"lutCustomUrl":{},"lutIntensity":0,"brightness":0,"contrast":0,"saturation":0,"temperature":0,"tint":0,"grainEnabled":true,"grainIntensity":0,"grainSize":0,"grainAnimated":true,"noiseEnabled":true,"noiseIntensity":0,"noiseType":"static","vignetteEnabled":true,"vignetteIntensity":0,"vignetteSize":0,"vignetteSoftness":0,"fadeToBlack":0,"fadeToWhite":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/effects/mask
```http
POST /projects/{projectId}/effects/mask
```
Tag: Platform
Auth: API key
Operation ID: `addProjectMaskEffect`
Add a mask effect
Add a mask effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/mask" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","content_item_id":"string","effect_id":"string","name":"string","start_time_seconds":0,"duration_seconds":0,"easing":"linear","layer_index":0,"order_index":0,"settings":{"shape":"rectangle","position":{"x":0,"y":0},"size":{"width":0,"height":0},"rotation":0,"feather":0,"blur":0,"opacity":0,"invert":true,"cornerRadius":0,"edgeFalloff":"linear","blendMode":"normal","shadow":{"enabled":true,"offsetX":0,"offsetY":0,"blur":0,"spread":0,"color":"string","opacity":0}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/effects/mask/{timelineItemId}
```http
PATCH /projects/{projectId}/effects/mask/{timelineItemId}
```
Tag: Platform
Auth: API key
Operation ID: `updateProjectMaskEffect`
Update a mask effect
Update a mask effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/mask/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration_seconds":0,"easing":"linear","settings":{"shape":"rectangle","position":{"x":0,"y":0},"size":{"width":0,"height":0},"rotation":0,"feather":0,"blur":0,"opacity":0,"invert":true,"cornerRadius":0,"edgeFalloff":"linear","blendMode":"normal","shadow":{"enabled":true,"offsetX":0,"offsetY":0,"blur":0,"spread":0,"color":"string","opacity":0}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/effects/zoom
```http
POST /projects/{projectId}/effects/zoom
```
Tag: Platform
Auth: API key
Operation ID: `addProjectZoomEffect`
Add a zoom effect
Add a zoom effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/zoom" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","content_item_id":"string","effect_id":"string","name":"string","start_time_seconds":0,"duration_seconds":0,"easing":"linear","layer_index":0,"order_index":0,"settings":{"scale":{"start":0,"end":0},"translate":{"start":{"x":0,"y":0},"end":{"x":0,"y":0}},"anchor":{"x":0,"y":0},"style":"transition","phase":"in","inDurationSeconds":0,"outDurationSeconds":0,"outScale":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/effects/zoom/{timelineItemId}
```http
PATCH /projects/{projectId}/effects/zoom/{timelineItemId}
```
Tag: Platform
Auth: API key
Operation ID: `updateProjectZoomEffect`
Update a zoom effect
Update a zoom effect.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/effects/zoom/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration_seconds":0,"easing":"linear","settings":{"scale":{"start":0,"end":0},"translate":{"start":{"x":0,"y":0},"end":{"x":0,"y":0}},"anchor":{"x":0,"y":0},"style":"transition","phase":"in","inDurationSeconds":0,"outDurationSeconds":0,"outScale":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "timeline_item_id": "string",
  "content_item_id": "string",
  "effect_id": "string",
  "effect_type": "zoom",
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/export
```http
POST /projects/{projectId}/export
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `startProjectExport`
Export project
Export a video or carousel project. For video projects, returns MP4/MOV video files or thin FCPXML timeline metadata with container_format='mp4'/'mov'/'fcpxml'. FCPXML exports do not bundle media and may reference signed cloud URLs that expire, so relinking may be required. For carousel projects, returns ZIP archive with individual slides as JPG/PNG images. Response includes container_format and image_formats fields.

Cost note: This operation may consume AI credits and can take time to complete.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/export" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":0,"resolution":"720p","format":"string","cover_frame_seconds":0,"show_watermark":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "export_id": {},
  "job_id": "string",
  "status": "string",
  "revision": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/export-quote
```http
GET /projects/{projectId}/export-quote
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getProjectsProjectIdExportQuote`
Quote project export
Read current export eligibility, estimated credits and maximum reserved USD before preparing media. This read does not reserve money or start work; admission rechecks current limits.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
expectedRevision | query | no | `object` | -
resolution | query | no | `string` (720p, 1080p, 4k) | -
renderMode | query | no | `string` (auto, standard, fast) | -
frameRate | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/export-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "projectId": "string",
  "revision": 0,
  "kind": "video",
  "renderMode": "standard"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/exports
```http
GET /projects/{projectId}/exports
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `listProjectExports`
List project exports
List project exports.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
limit | query | no | `number` | -
offset | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/exports" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "exports": [
    {
      "export_id": "string",
      "status": "string",
      "playback_url": "string",
      "download_url": {},
      "short_download_url": {},
      "thumbnail_url": {},
      "thumbnail": {},
      "platform_metadata": {},
      "expires_at": {},
      "file_size_bytes": {},
      "duration_seconds": {},
      "container_format": {},
      "resolution": {},
      "image_formats": {}
    }
  ],
  "count": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/faceless/plans
```http
POST /projects/{projectId}/faceless/plans
```
Tag: AI Generation
Auth: API key
Operation ID: `createProjectsProjectIdFacelessPlans`
Create faceless production plan revision
Requires an active paid plan. Creates an immutable generated-only 9:16 production plan. This planning call does not generate character anchors, keyframes, or video clips.

Cost note: This operation may consume AI credits and can take time to complete.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"script":"string","target_duration_seconds":0,"visual_style":"string","story_kit_id":"string","series_id":"string","planner_model_id":"string","image_model_id":"string","video_model":"string","voice_id":"string","include_captions":true,"caption_style_id":"string","generate_background_music":true,"generate_sound_effects":true,"character_ids":["string"],"style_reference_asset_ids":["string"]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series": {
    "id": "string",
    "revision": 0,
    "name": "string"
  },
  "id": "string",
  "project_id": "string",
  "revision": 0,
  "status": "draft",
  "plan": {
    "contentDirection": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "version": "faceless-production-plan-v1",
    "productionProfile": "dramatic_vertical_v1",
    "visualMode": "generated_only",
    "plannerModelId": "string",
    "imageModelId": "string",
    "videoModelId": "string",
    "aspectRatio": "9:16",
    "voiceId": {},
    "includeCaptions": true,
    "captionStyleId": {},
    "generateBackgroundMusic": true,
    "generateSoundEffects": true,
    "script": "string",
    "storyKitSnapshot": {
      "version": "story-kit-snapshot-v1",
      "storyKitId": "string",
      "revision": 0,
      "name": "string",
      "description": {},
      "visualStyle": "string",
      "styleReferenceAssetIds": [
        null
      ],
      "facts": [
        null
      ],
      "locations": [
        null
      ],
      "narratorCharacterId": {},
      "characters": [
        null
      ]
    },
    "styleAnchorPrompt": {},
    "characters": [
      {
        "id": "string",
        "name": "string",
        "canonicalDescription": "string",
        "anchorPrompt": "string",
        "source": "generated",
        "sourceCharacterId": {},
        "referenceAssetIds": [
          null
        ],
        "storyFacts": [
          null
        ],
        "voiceId": {},
        "voiceStyle": {}
      }
    ],
    "scenes": [
      {
        "index": 0,
        "title": "string",
        "narration": "string",
        "originalCue": {},
        "characterIds": [
          null
        ],
        "locationId": {},
        "imagePrompt": "string",
        "motionPrompt": "string",
        "startSeconds": 0,
        "endSeconds": 0,
        "durationSeconds": 0,
        "factualValidation": {}
      }
    ],
    "costEstimate": {
      "unit": "credits",
      "planning": 0,
      "styleAnchor": 0,
      "characterAnchors": 0,
      "keyframes": 0,
      "animation": 0,
      "semanticActionQa": 0,
      "total": 0
    }
  },
  "preproduction_assets": {
    "collectionId": {},
    "styleAnchorAssetId": {},
    "characterAnchors": [
      {}
    ],
    "keyframes": [
      {}
    ],
    "semanticActionQa": {
      "version": "semantic-action-v1",
      "status": "passed",
      "evaluatedAt": "string",
      "scenes": [
        null
      ]
    }
  },
  "review_options": {
    "style_anchor": {
      "label": "string",
      "current_asset_id": {},
      "dependent_scene_indexes": [
        null
      ],
      "estimated_regeneration_credits": 0
    },
    "scenes": [
      {
        "scene_index": 0,
        "label": "string",
        "current_asset_id": {},
        "estimated_regeneration_credits": 0
      }
    ],
    "characters": [
      {
        "character_id": "string",
        "label": "string",
        "current_asset_id": {},
        "dependent_scene_indexes": [
          null
        ],
        "estimated_regeneration_credits": 0
      }
    ]
  },
  "preproduction_job_id": {},
  "generation_job_id": {},
  "error": {},
  "plan_approved_at": {},
  "assets_approved_at": {},
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/faceless/plans/{revisionId}
```http
GET /projects/{projectId}/faceless/plans/{revisionId}
```
Tag: AI Generation
Auth: API key
Operation ID: `getProjectsProjectIdFacelessPlansRevisionId`
Get faceless production plan revision
Get faceless production plan revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revisionId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans/{revisionId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series": {
    "id": "string",
    "revision": 0,
    "name": "string"
  },
  "id": "string",
  "project_id": "string",
  "revision": 0,
  "status": "draft",
  "plan": {
    "contentDirection": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "version": "faceless-production-plan-v1",
    "productionProfile": "dramatic_vertical_v1",
    "visualMode": "generated_only",
    "plannerModelId": "string",
    "imageModelId": "string",
    "videoModelId": "string",
    "aspectRatio": "9:16",
    "voiceId": {},
    "includeCaptions": true,
    "captionStyleId": {},
    "generateBackgroundMusic": true,
    "generateSoundEffects": true,
    "script": "string",
    "storyKitSnapshot": {
      "version": "story-kit-snapshot-v1",
      "storyKitId": "string",
      "revision": 0,
      "name": "string",
      "description": {},
      "visualStyle": "string",
      "styleReferenceAssetIds": [
        null
      ],
      "facts": [
        null
      ],
      "locations": [
        null
      ],
      "narratorCharacterId": {},
      "characters": [
        null
      ]
    },
    "styleAnchorPrompt": {},
    "characters": [
      {
        "id": "string",
        "name": "string",
        "canonicalDescription": "string",
        "anchorPrompt": "string",
        "source": "generated",
        "sourceCharacterId": {},
        "referenceAssetIds": [
          null
        ],
        "storyFacts": [
          null
        ],
        "voiceId": {},
        "voiceStyle": {}
      }
    ],
    "scenes": [
      {
        "index": 0,
        "title": "string",
        "narration": "string",
        "originalCue": {},
        "characterIds": [
          null
        ],
        "locationId": {},
        "imagePrompt": "string",
        "motionPrompt": "string",
        "startSeconds": 0,
        "endSeconds": 0,
        "durationSeconds": 0,
        "factualValidation": {}
      }
    ],
    "costEstimate": {
      "unit": "credits",
      "planning": 0,
      "styleAnchor": 0,
      "characterAnchors": 0,
      "keyframes": 0,
      "animation": 0,
      "semanticActionQa": 0,
      "total": 0
    }
  },
  "preproduction_assets": {
    "collectionId": {},
    "styleAnchorAssetId": {},
    "characterAnchors": [
      {}
    ],
    "keyframes": [
      {}
    ],
    "semanticActionQa": {
      "version": "semantic-action-v1",
      "status": "passed",
      "evaluatedAt": "string",
      "scenes": [
        null
      ]
    }
  },
  "review_options": {
    "style_anchor": {
      "label": "string",
      "current_asset_id": {},
      "dependent_scene_indexes": [
        null
      ],
      "estimated_regeneration_credits": 0
    },
    "scenes": [
      {
        "scene_index": 0,
        "label": "string",
        "current_asset_id": {},
        "estimated_regeneration_credits": 0
      }
    ],
    "characters": [
      {
        "character_id": "string",
        "label": "string",
        "current_asset_id": {},
        "dependent_scene_indexes": [
          null
        ],
        "estimated_regeneration_credits": 0
      }
    ]
  },
  "preproduction_job_id": {},
  "generation_job_id": {},
  "error": {},
  "plan_approved_at": {},
  "assets_approved_at": {},
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/faceless/plans/{revisionId}/approve
```http
POST /projects/{projectId}/faceless/plans/{revisionId}/approve
```
Tag: AI Generation
Auth: API key
Operation ID: `createProjectsProjectIdFacelessPlansRevisionIdApprove`
Approve faceless plan and generate preproduction assets
Requires an active paid plan. Approves one immutable revision and starts generation of the shared style anchor, synthetic character anchors, and scene keyframes. It does not animate video clips.

Cost note: This operation may consume AI credits and can take time to complete.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revisionId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans/{revisionId}/approve" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "revision_id": "string",
  "job_id": "string",
  "status": "preproduction_processing"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/faceless/plans/{revisionId}/approve-assets
```http
POST /projects/{projectId}/faceless/plans/{revisionId}/approve-assets
```
Tag: AI Generation
Auth: API key
Operation ID: `createProjectsProjectIdFacelessPlansRevisionIdApproveAssets`
Approve keyframes and generate faceless video
Requires an active paid plan. Approves the generated character anchors and keyframes, then starts scene animation and timeline composition from those exact assets.

Cost note: This operation may consume AI credits and can take time to complete.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revisionId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans/{revisionId}/approve-assets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "revision_id": "string",
  "job_id": "string",
  "status": "generating"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/faceless/plans/{revisionId}/regenerate-assets
```http
POST /projects/{projectId}/faceless/plans/{revisionId}/regenerate-assets
```
Tag: AI Generation
Auth: API key
Operation ID: `createProjectsProjectIdFacelessPlansRevisionIdRegenerateAssets`
Regenerate one faceless preproduction asset
Requires an active paid plan. Regenerates one scene keyframe, one character anchor, or the style anchor. Character-anchor and style-anchor regeneration also refresh every dependent scene keyframe.

Cost note: This operation may consume AI credits and can take time to complete.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revisionId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans/{revisionId}/regenerate-assets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_type":"style_anchor","character_id":"string","scene_index":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "revision_id": "string",
  "job_id": "string",
  "status": "preproduction_processing",
  "asset_type": "style_anchor",
  "character_id": {},
  "scene_indexes": [
    0
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/faceless/plans/{revisionId}/revise
```http
POST /projects/{projectId}/faceless/plans/{revisionId}/revise
```
Tag: AI Generation
Auth: API key
Operation ID: `createProjectsProjectIdFacelessPlansRevisionIdRevise`
Create a revised faceless production plan
Requires an active paid plan. Copies one immutable revision into a new draft with explicit scene, character, or model changes. It does not call a planning model or generate media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revisionId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/faceless/plans/{revisionId}/revise" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"scene_updates":[{"scene_index":0,"title":"string","character_ids":["string"],"image_prompt":"string","motion_prompt":"string"}],"character_updates":[{"character_id":"string","name":"string","canonical_description":"string","anchor_prompt":"string"}],"style_anchor_prompt":"string","image_model_id":"string","video_model":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "series": {
    "id": "string",
    "revision": 0,
    "name": "string"
  },
  "id": "string",
  "project_id": "string",
  "revision": 0,
  "status": "draft",
  "plan": {
    "contentDirection": {
      "capturedAt": "string",
      "scope": {},
      "brand": {}
    },
    "version": "faceless-production-plan-v1",
    "productionProfile": "dramatic_vertical_v1",
    "visualMode": "generated_only",
    "plannerModelId": "string",
    "imageModelId": "string",
    "videoModelId": "string",
    "aspectRatio": "9:16",
    "voiceId": {},
    "includeCaptions": true,
    "captionStyleId": {},
    "generateBackgroundMusic": true,
    "generateSoundEffects": true,
    "script": "string",
    "storyKitSnapshot": {
      "version": "story-kit-snapshot-v1",
      "storyKitId": "string",
      "revision": 0,
      "name": "string",
      "description": {},
      "visualStyle": "string",
      "styleReferenceAssetIds": [
        null
      ],
      "facts": [
        null
      ],
      "locations": [
        null
      ],
      "narratorCharacterId": {},
      "characters": [
        null
      ]
    },
    "styleAnchorPrompt": {},
    "characters": [
      {
        "id": "string",
        "name": "string",
        "canonicalDescription": "string",
        "anchorPrompt": "string",
        "source": "generated",
        "sourceCharacterId": {},
        "referenceAssetIds": [
          null
        ],
        "storyFacts": [
          null
        ],
        "voiceId": {},
        "voiceStyle": {}
      }
    ],
    "scenes": [
      {
        "index": 0,
        "title": "string",
        "narration": "string",
        "originalCue": {},
        "characterIds": [
          null
        ],
        "locationId": {},
        "imagePrompt": "string",
        "motionPrompt": "string",
        "startSeconds": 0,
        "endSeconds": 0,
        "durationSeconds": 0,
        "factualValidation": {}
      }
    ],
    "costEstimate": {
      "unit": "credits",
      "planning": 0,
      "styleAnchor": 0,
      "characterAnchors": 0,
      "keyframes": 0,
      "animation": 0,
      "semanticActionQa": 0,
      "total": 0
    }
  },
  "preproduction_assets": {
    "collectionId": {},
    "styleAnchorAssetId": {},
    "characterAnchors": [
      {}
    ],
    "keyframes": [
      {}
    ],
    "semanticActionQa": {
      "version": "semantic-action-v1",
      "status": "passed",
      "evaluatedAt": "string",
      "scenes": [
        null
      ]
    }
  },
  "review_options": {
    "style_anchor": {
      "label": "string",
      "current_asset_id": {},
      "dependent_scene_indexes": [
        null
      ],
      "estimated_regeneration_credits": 0
    },
    "scenes": [
      {
        "scene_index": 0,
        "label": "string",
        "current_asset_id": {},
        "estimated_regeneration_credits": 0
      }
    ],
    "characters": [
      {
        "character_id": "string",
        "label": "string",
        "current_asset_id": {},
        "dependent_scene_indexes": [
          null
        ],
        "estimated_regeneration_credits": 0
      }
    ]
  },
  "preproduction_job_id": {},
  "generation_job_id": {},
  "error": {},
  "plan_approved_at": {},
  "assets_approved_at": {},
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/jobs
```http
GET /projects/{projectId}/jobs
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `listProjectJobs`
List jobs for project
List jobs for project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/jobs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "jobs": [
    {
      "dispatch": {},
      "audio_recovery": {},
      "job_id": "string",
      "type": "string",
      "kind": "string",
      "status": "queued",
      "progress": 0,
      "status_url": "string",
      "cancel_url": "string",
      "project_id": {},
      "export_id": {},
      "media_id": {},
      "download_url": "string",
      "estimated_credits": {},
      "created_at": "string",
      "completed_at": {},
      "error": {},
      "next_actions": [
        {}
      ],
      "result": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/media
```http
GET /projects/{projectId}/media
```
Tag: Media Library
Auth: API key
Operation ID: `getProjectsProjectIdMedia`
List project media
List project media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/media" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "media": [
    {
      "id": "string",
      "name": "string",
      "asset_type": "string",
      "mime_type": "string",
      "file_size_bytes": 0,
      "content_hash_sha256": {},
      "processing_status": "string",
      "created_at": "string",
      "deduped": true
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/media
```http
POST /projects/{projectId}/media
```
Tag: Media Library
Auth: API key
Operation ID: `createProjectsProjectIdMedia`
Upload media
Upload media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/media" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key":"string","content_hash_sha256":"string","file_name":"string","content_type":"string","file_size_bytes":0,"url":"string","name":"string","auto_process_enabled":true,"auto_transcribe":true,"auto_describe_after_transcribe":true,"auto_suggest_shorts":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "media": {
    "id": "string",
    "name": "string",
    "asset_type": "string",
    "mime_type": "string",
    "file_size_bytes": 0,
    "content_hash_sha256": {},
    "processing_status": "string",
    "created_at": "string",
    "deduped": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /projects/{projectId}/media/{mediaId}
```http
DELETE /projects/{projectId}/media/{mediaId}
```
Tag: Media Library
Auth: API key
Operation ID: `deleteProjectsProjectIdMediaMediaId`
Delete project media
Delete project media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
mediaId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/projects/PROJECT_ID/media/{mediaId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/mistakes/apply
```http
POST /projects/{projectId}/mistakes/apply
```
Tag: Timeline Editing
Auth: API key
Operation ID: `applyProjectMistakeRemoval`
Apply a reviewed mistake removal plan
Apply a reviewed mistake removal plan.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/mistakes/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","plan":{"timelineItemId":"string","mediaAssetId":"string","videoUrl":{},"analyzedSegments":[{"timelineItemId":"string","clipId":"string","label":"string","verdict":"mistake","confidence":0,"reason":{},"transcriptPreview":"string","trimStartSeconds":0,"trimEndSeconds":0,"durationSeconds":0,"mediaAssetId":"string"}],"segments":[{"timelineItemId":"string","clipId":"string","label":"string","verdict":"mistake","confidence":0,"reason":{},"transcriptPreview":"string","trimStartSeconds":0,"trimEndSeconds":0,"durationSeconds":0,"mediaAssetId":"string"}],"summary":{"analyzedCount":0,"mistakeCount":0},"model":"string"},"manual_verdicts":{},"delete_mistakes":true,"preview_confirmed":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "mistakeTimelineItemIds": [
    "string"
  ],
  "clearedTimelineItemIds": [
    "string"
  ],
  "txids": [
    0
  ],
  "summary": {
    "analyzedCount": 0,
    "mistakeCount": 0
  },
  "deletionResult": {
    "deletedCount": 0,
    "deletedCaptionTimelineItemCount": 0,
    "deletedWordCount": 0,
    "adjustedCaptionCount": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/mistakes/plan
```http
POST /projects/{projectId}/mistakes/plan
```
Tag: Timeline Editing
Auth: API key
Operation ID: `planProjectMistakeRemoval`
Preview a mistake removal plan
Preview a mistake removal plan.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/mistakes/plan" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "timelineItemId": "string",
  "mediaAssetId": "string",
  "videoUrl": {},
  "analyzedSegments": [
    {
      "timelineItemId": "string",
      "clipId": "string",
      "label": "string",
      "verdict": "mistake",
      "confidence": 0,
      "reason": {},
      "transcriptPreview": "string",
      "trimStartSeconds": 0,
      "trimEndSeconds": 0,
      "durationSeconds": 0,
      "mediaAssetId": "string"
    }
  ],
  "segments": [
    {
      "timelineItemId": "string",
      "clipId": "string",
      "label": "string",
      "verdict": "mistake",
      "confidence": 0,
      "reason": {},
      "transcriptPreview": "string",
      "trimStartSeconds": 0,
      "trimEndSeconds": 0,
      "durationSeconds": 0,
      "mediaAssetId": "string"
    }
  ],
  "summary": {
    "analyzedCount": 0,
    "mistakeCount": 0
  },
  "model": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/preparation
```http
GET /projects/{projectId}/preparation
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdPreparation`
Read project caption and editing preparation
Read project caption and editing preparation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/preparation" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "preparation": {
    "projectId": "string",
    "startedAt": "string",
    "status": "processing",
    "steps": [
      {}
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/preview-frame
```http
POST /projects/{projectId}/preview-frame
```
Tag: Project Context
Auth: API key
Operation ID: `renderProjectPreviewFrame`
Render one preview frame for a project
Render one preview frame for a project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/preview-frame" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"time_seconds":0,"target_width":0,"image_format":"jpeg"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "preview_url": "string",
  "expires_at": "string",
  "storage_key": "string",
  "captured_at": "string",
  "cached": true,
  "frame": 0,
  "time_seconds": 0,
  "width": 0,
  "height": 0,
  "image_format": "jpeg",
  "revision": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/preview-frames
```http
POST /projects/{projectId}/preview-frames
```
Tag: Project Context
Auth: API key
Operation ID: `renderProjectPreviewFrames`
Render multiple preview frames for a project
Render multiple preview frames for a project.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/preview-frames" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"times_seconds":[0],"time_seconds_list":[0],"target_width":0,"image_format":"jpeg"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "previews": [
    {
      "preview_url": "string",
      "expires_at": "string",
      "storage_key": "string",
      "captured_at": "string",
      "cached": true,
      "frame": 0,
      "time_seconds": 0,
      "width": 0,
      "height": 0,
      "image_format": "jpeg",
      "revision": 0
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/preview-quote
```http
GET /projects/{projectId}/preview-quote
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdPreviewQuote`
Quote preview rendering and optional vision analysis
Quote preview rendering and optional vision analysis.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
expectedRevision | query | no | `object` | -
frameCount | query | yes | `integer` | -
targetWidth | query | no | `object` | -
mode | query | no | `string` (render, analyze) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/preview-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "projectId": "string",
  "revision": 0,
  "kind": "video",
  "mode": "render",
  "frameCount": 0,
  "width": 0,
  "height": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/publishing/instagram
```http
POST /projects/{projectId}/publishing/instagram
```
Tag: Platform
Auth: API key
Operation ID: `createProjectsProjectIdPublishingInstagram`
Schedule Instagram publish
Schedule a completed project export for Instagram. MP4/MOV exports publish as Reels; ZIP carousel exports with JPEG slides publish as carousel posts. Trial mode is only applied to Reels. Optional include_affiliate_cta appends a Try BlitzReels for free line plus the actor's Affonso tracking URL (or affiliate_tracking_url override).

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/publishing/instagram" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"export_id":{},"connection_id":{},"caption":"string","scheduled_for":{},"timezone":{},"trial_reel":{},"trial_graduation_strategy":"MANUAL","share_to_feed":{},"include_affiliate_cta":{},"affiliate_tracking_url":"string","affiliate_cta_text":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "target_id": "string",
  "platform": "instagram",
  "status": "scheduled",
  "scheduled_for": "string",
  "connection_id": "string",
  "export_id": "string",
  "project_id": "string",
  "publish_kind": "reel",
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/realtime-token
```http
GET /projects/{projectId}/realtime-token
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdRealtimeToken`
Get a scoped realtime token for project progress
Get a scoped realtime token for project progress.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/realtime-token" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "access_token": "string",
  "expires_at": "string",
  "url": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/recipe/versions
```http
GET /projects/{projectId}/recipe/versions
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdRecipeVersions`
List saved recipe versions
List saved recipe versions.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
offset | query | no | `integer` | -
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/recipe/versions" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "projectId": "string",
  "projectRevision": 0,
  "latestVersion": 0,
  "versions": [
    {
      "id": "string",
      "projectId": "string",
      "version": 0,
      "projectRevision": 0,
      "snapshotHash": "string",
      "snapshotBytes": 0,
      "assetCount": 0,
      "artifactCount": 0,
      "createdAt": "string"
    }
  ],
  "bounds": {
    "offset": 0,
    "limit": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/recipe/versions/{version}
```http
GET /projects/{projectId}/recipe/versions/{version}
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdRecipeVersionsVersion`
Inspect a saved recipe section or exact source file
Inspect a saved recipe section or exact source file.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
version | path | yes | `integer` | -
section | query | no | `string` (overview, variables, artifacts, dependencies, assets, source) | -
sourceRevisionId | query | no | `object` | -
path | query | no | `object` | -
offset | query | no | `integer` | -
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/recipe/versions/{version}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "version": {
    "id": "string",
    "projectId": "string",
    "version": 0,
    "projectRevision": 0,
    "snapshotHash": "string",
    "snapshotBytes": 0,
    "assetCount": 0,
    "artifactCount": 0,
    "createdAt": "string"
  },
  "project": {
    "name": {
      "text": "string",
      "characters": 0,
      "truncated": true
    },
    "type": "string"
  },
  "counts": {
    "variables": 0,
    "artifacts": 0,
    "sources": 0,
    "dependencies": 0,
    "assets": 0
  },
  "items": [
    {
      "kind": "variable",
      "id": "string",
      "key": "string",
      "keyTruncated": true,
      "name": {},
      "type": "string",
      "required": true
    }
  ],
  "source": {
    "id": "string",
    "projectId": "string",
    "revision": 0,
    "sourceHash": "string",
    "entrypoint": "string",
    "controls": {},
    "controlValues": {},
    "commands": [
      "string"
    ],
    "assets": [
      {}
    ],
    "rendering": {}
  },
  "file": {
    "path": "string",
    "content": "string"
  },
  "bounds": {
    "offset": 0,
    "limit": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/reframes/{reframeId}
```http
GET /projects/{projectId}/reframes/{reframeId}
```
Tag: Project Management
Auth: API key
Operation ID: `getReframeComposition`
Get one editable Reframe composition and its source views
Get one editable Reframe composition and its source views.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
reframeId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/reframes/{reframeId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "reframe_id": "string",
  "project_id": "string",
  "timeline_item_id": "string",
  "plan_id": "string",
  "plan_revision": "string",
  "requested_layout_strategy": {},
  "content_type_hint": {},
  "source_count": 0,
  "segment_count": 0,
  "created_at": "string",
  "updated_at": "string",
  "views": [
    {
      "timeline_item_id": "string",
      "source_asset_id": "string",
      "source_name": "string",
      "start_units": "string",
      "duration_units": "string",
      "source_start_units": {},
      "source_end_units": {},
      "source_crop": {
        "x": 0,
        "y": 0,
        "width": 0,
        "height": 0
      },
      "canvas_rect": {
        "x": 0,
        "y": 0,
        "width": 0,
        "height": 0
      },
      "planner_mode": "manual",
      "sync_group_id": {},
      "ignored": true,
      "volume": 0
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/reframes/{reframeId}/sources/{sourceAssetId}
```http
PATCH /projects/{projectId}/reframes/{reframeId}/sources/{sourceAssetId}
```
Tag: Project Management
Auth: API key
Operation ID: `updateReframeCompositionSource`
Update one source across a Reframe composition
Update one source across a Reframe composition.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
reframeId | path | yes | `string` | -
sourceAssetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/reframes/{reframeId}/sources/{sourceAssetId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source_crop":{"x":0,"y":0,"width":0,"height":0},"source_offset_units":"string","ignored":{},"replacement_asset_id":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "reframe_id": "string",
  "project_id": "string",
  "source_asset_id": "string",
  "affected_timeline_item_ids": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/settings
```http
GET /projects/{projectId}/settings
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdSettings`
Get project settings
Get project settings.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/settings" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "description": {},
  "aspect_ratio": {},
  "resolution": {},
  "frame_rate": {},
  "timeline_fps": {},
  "units_per_frame": {},
  "theme": {},
  "font_size": {},
  "caption_settings": {},
  "show_scene_progress": {},
  "auto_save": {},
  "auto_save_interval": {},
  "background_color": {},
  "theme_colors": {},
  "is_template": {},
  "template_type": "intro",
  "template_visibility": "private",
  "created_at": {},
  "updated_at": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/silence/apply
```http
POST /projects/{projectId}/silence/apply
```
Tag: Timeline Editing
Auth: API key
Operation ID: `applyProjectSilenceRemoval`
Apply a reviewed silence removal plan
Apply a reviewed silence removal plan.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/silence/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","all_media_items":true,"padding_ms":0,"silence_threshold_db":0,"min_silence_duration_seconds":0,"remove_blips_max_duration_seconds":0,"use_caption_validation":true,"delete_silent_clips":true,"manual_segment_overrides":{},"segments":[{"timeline_item_id":"string","start_seconds":0,"end_seconds":0}],"reviewed_plan":{"timelineItemId":"string","startUnits":"string","endUnits":"string","segments":[{"index":0,"startUnits":"string","endUnits":"string","durationUnits":"string","kind":"keep"}]},"preview_confirmed":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "session_id": "string",
  "applied_count": 0,
  "timeline_item_id": "string",
  "timeline_item_ids": [
    "string"
  ],
  "result": {},
  "results": [
    {
      "timeline_item_id": "string",
      "result": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/silence/plan
```http
POST /projects/{projectId}/silence/plan
```
Tag: Timeline Editing
Auth: API key
Operation ID: `planProjectSilenceRemoval`
Preview a silence removal plan
Preview a silence removal plan.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/silence/plan" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","strategy":"audio","padding_ms":0,"silence_threshold_db":0,"min_silence_duration_seconds":0,"remove_blips_max_duration_seconds":0,"use_caption_validation":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "status": "queued",
  "status_url": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/source
```http
GET /projects/{projectId}/source
```
Tag: Creative Source
Auth: API key
Operation ID: `getProjectsProjectIdSource`
Read saved Remotion source files
Read saved Remotion source files.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revision | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/source" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "sourceHash": "string",
  "entrypoint": "string",
  "fileCount": 0,
  "createdAt": "string",
  "source": {
    "entrypoint": "string",
    "controls": {
      "file": "string",
      "fields": [
        null
      ]
    },
    "build": {
      "packageJson": "string",
      "packageLock": "string",
      "commands": [
        "string"
      ]
    },
    "rendering": {
      "gl": "swangle",
      "encoding": "quality"
    },
    "files": [
      {
        "path": "string",
        "content": "string"
      }
    ],
    "assets": [
      {
        "path": "string",
        "hash": "string",
        "bytes": 0,
        "assetId": "string"
      }
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/source
```http
PATCH /projects/{projectId}/source
```
Tag: Creative Source
Auth: API key
Operation ID: `updateProjectsProjectIdSource`
Revise source files, asset bindings or declared controls without changing the timeline
Revise source files, asset bindings or declared controls without changing the timeline.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/source" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"edits":[{"path":"string","content":"string"}],"assetEdits":[{"path":"string","value":{}}],"controlValues":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "sourceHash": "string",
  "entrypoint": "string",
  "fileCount": 0,
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /projects/{projectId}/source
```http
PUT /projects/{projectId}/source
```
Tag: Creative Source
Auth: API key
Operation ID: `replaceProjectsProjectIdSource`
Save a revision of a Remotion source tree
Save a revision of a Remotion source tree.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/projects/PROJECT_ID/source" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"source":{"entrypoint":"string","controls":{"file":"string","fields":[null]},"build":{"packageJson":"string","packageLock":"string","commands":["string"]},"rendering":{"gl":"swangle","encoding":"quality"},"files":[{"path":"string","content":"string"}],"assets":[{"path":"string","hash":"string","bytes":0,"assetId":"string"}]}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "sourceHash": "string",
  "entrypoint": "string",
  "fileCount": 0,
  "createdAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/source/apply
```http
POST /projects/{projectId}/source/apply
```
Tag: Creative Source
Auth: API key
Operation ID: `createProjectsProjectIdSourceApply`
Add or replace a timeline item with a completed pinned source render
Add or replace a timeline item with a completed pinned source render.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/source/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timelineItemId":"string","jobId":"string","expectedSourceRevision":0,"expectedProjectRevision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "projectId": "string",
  "timelineItemId": "string",
  "jobId": "string",
  "sourceRevision": 0,
  "revision": 0,
  "mutationReceiptId": "string",
  "replayed": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/source/build-quote
```http
GET /projects/{projectId}/source/build-quote
```
Tag: Creative Source
Auth: API key
Operation ID: `getProjectsProjectIdSourceBuildQuote`
Quote isolated source build spending
Quote isolated source build spending.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revision | query | yes | `integer` | -
compositionId | query | yes | `string` | -
frame | query | yes | `integer` | -
output | query | no | `string` (frame, video, alpha-video) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/source/build-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "currency": "USD",
  "firstPassUsd": 0,
  "maximumUsd": 0,
  "policyVersion": "string",
  "retentionDays": 0,
  "workerDispatchLimit": 0,
  "runtimeId": "string",
  "components": {
    "workerMaximumUsd": 0,
    "computeMaximumUsd": 0,
    "transferMaximumUsd": 0,
    "requestsMaximumUsd": 0,
    "overheadMaximumUsd": 0,
    "storage": {
      "maximumUsd": 0,
      "maximumBytes": 0,
      "days": 0,
      "usdPerGbMonth": 0,
      "bytesPerGb": 0,
      "daysPerMonth": 0,
      "pricingVersion": "string"
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/source/builds
```http
POST /projects/{projectId}/source/builds
```
Tag: Creative Source
Auth: API key
Operation ID: `createProjectsProjectIdSourceBuilds`
Build a pinned source revision as a frame or video
Requires Idempotency-Key and an enabled workspace. Reserves the configured full execution quote under shared USD caps. quoteId locks a prior quote; null accepts current configured bounds. Identical retries recover the same operation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/source/builds" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"revision":0,"compositionId":"string","frame":0,"output":"frame","quoteId":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "status": "queued",
  "artifactId": "string",
  "frameUrl": {},
  "mediaAssetId": "string",
  "videoUrl": {},
  "logs": "string",
  "error": {},
  "runtime": "string",
  "reservedUsd": 0,
  "computeUpperBoundUsd": {},
  "elapsedMs": {},
  "createdAt": "string",
  "receiptUrl": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/source/files
```http
GET /projects/{projectId}/source/files
```
Tag: Creative Source
Auth: API key
Operation ID: `getProjectsProjectIdSourceFiles`
Inspect source file hashes or read one file; download the full source through GET source
Inspect source file hashes or read one file; download the full source through GET source.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
revision | query | no | `object` | -
path | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/source/files" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "revision": 0,
  "sourceHash": "string",
  "entrypoint": "string",
  "fileCount": 0,
  "createdAt": "string",
  "files": [
    {
      "path": "string",
      "bytes": 0,
      "hash": "string"
    }
  ],
  "assets": [
    {
      "path": "string",
      "hash": "string",
      "bytes": 0,
      "assetId": "string"
    }
  ],
  "file": {
    "path": "string",
    "content": "string"
  },
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "controls": {
    "file": "string",
    "fields": [
      null
    ]
  },
  "controlValues": {},
  "download": {
    "path": "string",
    "revision": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/templates
```http
GET /projects/{projectId}/templates
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdTemplates`
List available templates
List available templates.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
type | query | no | `object` | -
visibility | query | no | `string` (own, team, public, all) | -
search | query | no | `string` | -
limit | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/templates" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "templates": [
    {
      "template_id": "string",
      "name": "string",
      "description": {},
      "type": "intro",
      "visibility": "private",
      "duration_seconds": 0,
      "variable_count": 0,
      "preview_thumbnail_url": {},
      "owner_name": {},
      "is_own": true
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/templates/{templateId}
```http
GET /projects/{projectId}/templates/{templateId}
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdTemplatesTemplateId`
Get template details
Get template details.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
templateId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/templates/{templateId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "template_id": "string",
  "name": "string",
  "description": {},
  "type": "intro",
  "visibility": "private",
  "duration_seconds": 0,
  "variables": [
    {
      "id": "string",
      "key": "string",
      "name": "string",
      "type": "text",
      "default_value": {},
      "required": true
    }
  ],
  "timeline_item_summary": {
    "fill_layer_count": 0,
    "caption_count": 0,
    "total_item_count": 0
  },
  "preview_thumbnail_url": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/timeline/at
```http
GET /projects/{projectId}/timeline/at
```
Tag: Project Context
Auth: API key
Operation ID: `getTimelineAtTime`
Get timeline items at time
Get timeline items at time.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
time_seconds | query | yes | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/at" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "timeSeconds": 0,
  "items": [
    {
      "id": "string",
      "type": "string",
      "label": "string",
      "layerIndex": 0,
      "volume": {},
      "startSeconds": 0,
      "endSeconds": 0,
      "mediaAssetId": {},
      "contentItemId": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/audio
```http
POST /projects/{projectId}/timeline/audio
```
Tag: Timeline Editing
Auth: API key
Operation ID: `insertProjectTimelineAudio`
Insert audio on timeline
Insert audio on timeline.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/audio" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"asset_id":"string","start_seconds":0,"duration_seconds":0,"volume":0,"fade_in_seconds":0,"fade_out_seconds":0,"loop":true}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "inserted": [
    {
      "asset_id": "string",
      "timeline_item_id": {},
      "start_seconds": 0,
      "duration_seconds": 0,
      "volume": 0,
      "fade_in_seconds": 0,
      "fade_out_seconds": 0,
      "loop": true,
      "success": true,
      "message": {}
    }
  ],
  "summary": {
    "total": 0,
    "inserted": 0,
    "failed": 0
  },
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/timeline/audio/{timelineItemId}
```http
PATCH /projects/{projectId}/timeline/audio/{timelineItemId}
```
Tag: Timeline Editing
Auth: API key
Operation ID: `updateProjectsProjectIdTimelineAudioTimelineItemId`
Update audio timeline item
Update audio timeline item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/audio/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"duration_seconds":0,"volume":0,"fade_in_seconds":0,"fade_out_seconds":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timeline_item_id": "string",
  "duration_seconds": 0,
  "volume": 0,
  "fade_in_seconds": 0,
  "fade_out_seconds": 0,
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/batch-delete
```http
POST /projects/{projectId}/timeline/batch-delete
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineBatchDelete`
Batch delete timeline items
Batch delete timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/batch-delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_ids":["string"],"auto_pack":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "deleted_count": 0,
  "failed_count": 0,
  "deleted_items": [
    {
      "id": "string",
      "name": "string",
      "type": "string"
    }
  ],
  "failed_items": [
    {
      "timeline_item_id": "string",
      "error": "string",
      "error_code": "validation_error",
      "retryable": true,
      "error_details": {}
    }
  ],
  "captions_removed": 0,
  "packed": true,
  "clips_shifted": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/batch-move
```http
POST /projects/{projectId}/timeline/batch-move
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineBatchMove`
Batch move timeline items
Batch move timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/batch-move" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"timeline_item_id":"string","new_start_seconds":0,"new_layer_index":0}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "repositioned_count": 0,
  "failed_count": 0,
  "items": [
    {
      "timeline_item_id": "string",
      "previous_start_seconds": 0,
      "new_start_seconds": 0,
      "previous_layer_index": 0,
      "new_layer_index": 0
    }
  ],
  "failed_items": [
    {
      "timeline_item_id": "string",
      "error": "string",
      "error_code": "validation_error",
      "retryable": true,
      "error_details": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/batch-transform
```http
POST /projects/{projectId}/timeline/batch-transform
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineBatchTransform`
Batch update timeline item transforms
Batch update timeline item transforms.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/batch-transform" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"timeline_item_id":"string","position_x":0,"position_y":0,"width_px":0,"height_px":0,"keep_aspect_ratio":true}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "updated_count": 0,
  "failed_count": 0,
  "items": [
    {
      "timeline_item_id": "string",
      "success": true,
      "error": {}
    }
  ],
  "failed_items": [
    {
      "timeline_item_id": "string",
      "error": "string",
      "error_code": "validation_error",
      "retryable": true,
      "error_details": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/batch-trim
```http
POST /projects/{projectId}/timeline/batch-trim
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineBatchTrim`
Batch trim timeline items
Batch trim timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/batch-trim" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"timeline_item_id":"string","trim_start_delta_seconds":0,"trim_end_delta_seconds":0}],"snap_to_frame":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "trimmed_count": 0,
  "failed_count": 0,
  "items": [
    {
      "timeline_item_id": "string",
      "success": true,
      "trim_start_seconds": {},
      "trim_end_seconds": {},
      "new_duration_seconds": {},
      "error": {}
    }
  ],
  "failed_items": [
    {
      "timeline_item_id": "string",
      "error": "string",
      "error_code": "validation_error",
      "retryable": true,
      "error_details": {}
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/cut
```http
POST /projects/{projectId}/timeline/cut
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineCut`
Cut media ranges and ripple linked captions
Cut media ranges and ripple linked captions.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/cut" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","cuts":[{"start_seconds":0,"end_seconds":0,"trim_following_seconds":0}],"snap_to_frame":true,"ripple":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timeline_item_id": "string",
  "cuts_applied": 0,
  "created_splits": 0,
  "deleted_segments": 0,
  "deleted_words": 0,
  "trimmed_following": 0,
  "shifted_items": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/edits
```http
POST /projects/{projectId}/timeline/edits
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineEdits`
Edit timeline items
Edit timeline items.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Optional retry key for trim and split actions, including batch trim. Other actions do not consume this header.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/edits" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "action": "trim",
  "result": {
    "success": true,
    "trimmed_count": 0,
    "failed_count": 0,
    "items": [
      null
    ],
    "failed_items": [
      null
    ],
    "message": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /projects/{projectId}/timeline/items/{timelineItemId}
```http
DELETE /projects/{projectId}/timeline/items/{timelineItemId}
```
Tag: Timeline Editing
Auth: API key
Operation ID: `deleteProjectsProjectIdTimelineItemsTimelineItemId`
Delete a timeline item
Delete a timeline item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/items/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "deleted_item_id": "string",
  "deleted_item_name": {},
  "deleted_item_type": {},
  "captions_removed": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/media
```http
POST /projects/{projectId}/timeline/media
```
Tag: Media Library
Auth: API key
Operation ID: `createProjectsProjectIdTimelineMedia`
Insert media on timeline
Insert media on timeline.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/media" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"asset_id":"string","source_start_seconds":0,"start_seconds":0,"duration_seconds":0,"layer_index":0,"placement_intent":"overlay","position_preset":"center","position_x":0,"position_y":0,"width_px":0,"height_px":0,"keep_aspect_ratio":true,"scale":0,"opacity":0,"volume":0,"animation_preset":"none"}],"allow_duplicate":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "inserted": [
    {
      "asset_id": "string",
      "start_seconds": 0,
      "success": true,
      "already_existed": true,
      "timeline_item_id": {},
      "message": {},
      "animation_applied": {},
      "layer_index": 0,
      "placement_intent": "overlay",
      "placement": {},
      "warnings": [
        "string"
      ]
    }
  ],
  "summary": {
    "total": 0,
    "actually_inserted": 0,
    "already_in_timeline": 0,
    "failed": 0
  },
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/media-views/duplicate
```http
POST /projects/{projectId}/timeline/media-views/duplicate
```
Tag: Media Library
Auth: API key
Operation ID: `createProjectsProjectIdTimelineMediaViewsDuplicate`
Duplicate a linked source view from one timeline item to another
Duplicate a linked source view from one timeline item to another.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/media-views/duplicate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":0,"source_timeline_item_id":"string","target_timeline_item_id":"string","sync_group_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "txid": 0,
  "base_revision": 0,
  "revision": 0,
  "media_view": {
    "timeline_item_id": "string",
    "source_asset_id": "string",
    "source_start_units": "string",
    "source_end_units": "string",
    "source_crop_x": 0,
    "source_crop_y": 0,
    "source_crop_width": 0,
    "source_crop_height": 0,
    "canvas_x": 0,
    "canvas_y": 0,
    "canvas_width": 0,
    "canvas_height": 0,
    "fit_mode": "contain",
    "mask_shape": "none",
    "mask_radius": 0,
    "sync_group_id": {},
    "planner_mode": "manual",
    "planner_metadata": {
      "templateKey": {},
      "notes": [
        null
      ],
      "analysisStatus": "missing",
      "analysisVersion": {},
      "confidence": {},
      "fallbackReason": {},
      "repairApplied": true,
      "speakerCount": 0
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/media-views/items/{timelineItemId}
```http
POST /projects/{projectId}/timeline/media-views/items/{timelineItemId}
```
Tag: Media Library
Auth: API key
Operation ID: `createProjectsProjectIdTimelineMediaViewsItemsTimelineItemId`
Upsert a public media view for a project timeline item
Upsert a public media view for a project timeline item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/media-views/items/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":0,"source_asset_id":"string","source_start_units":"string","source_end_units":"string","source_crop_x":0,"source_crop_y":0,"source_crop_width":0,"source_crop_height":0,"canvas_x":0,"canvas_y":0,"canvas_width":0,"canvas_height":0,"fit_mode":"contain","mask_shape":"none","mask_radius":0,"sync_group_id":"string","planner_mode":"manual","planner_metadata":{"templateKey":{},"notes":["string"],"analysisStatus":"missing","analysisVersion":{},"confidence":{},"fallbackReason":{},"repairApplied":true,"dominantSpeakerSide":"left","speakerCount":0,"stylePolicy":{"schemaVersion":0,"styleId":"auto_default","requestedContentTypeHint":"auto","requestedLayoutStrategy":"auto","fillPosture":"fill_portrait","fallbackPosture":"repair_then_safe_layout","safetyProfile":"speaker_subject","targetPriority":"speaker","allowedLayouts":[null]},"decisionTrace":{"schemaVersion":0,"styleId":"auto_default","segmentKey":"string","candidateLayouts":[null],"records":[null]}}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "txid": 0,
  "base_revision": 0,
  "revision": 0,
  "media_view": {
    "timeline_item_id": "string",
    "source_asset_id": "string",
    "source_start_units": "string",
    "source_end_units": "string",
    "source_crop_x": 0,
    "source_crop_y": 0,
    "source_crop_width": 0,
    "source_crop_height": 0,
    "canvas_x": 0,
    "canvas_y": 0,
    "canvas_width": 0,
    "canvas_height": 0,
    "fit_mode": "contain",
    "mask_shape": "none",
    "mask_radius": 0,
    "sync_group_id": {},
    "planner_mode": "manual",
    "planner_metadata": {
      "templateKey": {},
      "notes": [
        "string"
      ],
      "analysisStatus": "missing",
      "analysisVersion": {},
      "confidence": {},
      "fallbackReason": {},
      "repairApplied": true,
      "dominantSpeakerSide": "left",
      "speakerCount": 0,
      "stylePolicy": {},
      "decisionTrace": {}
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /projects/{projectId}/timeline/media/{timelineItemId}
```http
PATCH /projects/{projectId}/timeline/media/{timelineItemId}
```
Tag: Media Library
Auth: API key
Operation ID: `updateProjectsProjectIdTimelineMediaTimelineItemId`
Update media overlay transform
Update media overlay transform.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
timelineItemId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/media/TIMELINE_ITEM_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"position_preset":"center","position_x":0,"position_y":0,"width_px":0,"height_px":0,"keep_aspect_ratio":true,"scale":0,"opacity":0,"animation_preset":"none","remove_animations":true,"blurred_background":true,"volume":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timelineItemId": "string",
  "updated": {
    "positionX": 0,
    "positionY": 0,
    "widthPx": {},
    "heightPx": {},
    "keepAspectRatio": true,
    "opacity": {},
    "blurredBackground": true,
    "volume": 0
  },
  "animationApplied": {},
  "keyframeCount": 0,
  "warnings": [
    "string"
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/move
```http
POST /projects/{projectId}/timeline/move
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineMove`
Move a timeline item
Move a timeline item.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/move" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","new_start_seconds":0,"new_layer_index":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timeline_item_id": "string",
  "previous_start_seconds": 0,
  "new_start_seconds": 0,
  "previous_layer_index": 0,
  "new_layer_index": 0,
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/operations/execute
```http
POST /projects/{projectId}/timeline/operations/execute
```
Tag: Timeline Editing
Auth: API key
Operation ID: `executeSequenceTimingOperation`
Execute a sequence timing operation
Execute a sequence timing operation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/operations/execute" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"operation":{"operation_id":"timeline.item.trim","timeline_item_id":"string","trim_start_delta_seconds":0,"trim_end_delta_seconds":0,"snap_to_frame":true},"expected_revision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "mutation_receipt_id": "string",
  "idempotency_key": "string",
  "base_revision": 0,
  "revision": 0,
  "replayed": true,
  "txid": 0,
  "affected_timeline_item_ids": [
    "string"
  ],
  "created_timeline_item_ids": [
    "string"
  ],
  "deleted_timeline_item_ids": [
    "string"
  ],
  "warnings": [
    "string"
  ],
  "operation_id": "timeline.item.trim",
  "result": {
    "timeline_item_id": "string",
    "trim_start_units": "string",
    "trim_end_units": "string",
    "trim_start_seconds": 0,
    "trim_end_seconds": 0,
    "message": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/operations/preview
```http
POST /projects/{projectId}/timeline/operations/preview
```
Tag: Timeline Editing
Auth: API key
Operation ID: `previewSequenceTimingOperation`
Preview a sequence timing operation
Preview a sequence timing operation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/operations/preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"operation":{"operation_id":"timeline.item.trim","timeline_item_id":"string","trim_start_delta_seconds":0,"trim_end_delta_seconds":0,"snap_to_frame":true},"expected_revision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "operation_id": "timeline.item.trim",
  "project_id": "string",
  "current_revision": 0,
  "expected_revision": 0,
  "destructive": true,
  "affected_timeline_item_ids": [
    "string"
  ],
  "would_create_timeline_item_ids": [
    "string"
  ],
  "would_delete_timeline_item_ids": [
    "string"
  ],
  "change_count": 0,
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/split
```http
POST /projects/{projectId}/timeline/split
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineSplit`
Split a timeline item
Deprecated compatibility response. Use POST /projects/{projectId}/timeline/operations/execute.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/split" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","split_at_seconds":0,"snap_to_frame":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "left_id": "string",
  "right_id": "string",
  "split_at_seconds": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/transform
```http
POST /projects/{projectId}/timeline/transform
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineTransform`
Update a timeline item transform
Update a timeline item transform.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/transform" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","position_x":0,"position_y":0,"width_px":0,"height_px":0,"keep_aspect_ratio":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timeline_item_id": "string",
  "asset_type": {},
  "previous": {
    "position_x": {},
    "position_y": {},
    "width_px": {},
    "height_px": {},
    "keep_aspect_ratio": {}
  },
  "updated": {
    "position_x": {},
    "position_y": {},
    "width_px": {},
    "height_px": {},
    "keep_aspect_ratio": {}
  },
  "message": "string",
  "error": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/timeline/trim
```http
POST /projects/{projectId}/timeline/trim
```
Tag: Timeline Editing
Auth: API key
Operation ID: `createProjectsProjectIdTimelineTrim`
Trim timeline item edges
Deprecated compatibility response. Use POST /projects/{projectId}/timeline/operations/execute.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/timeline/trim" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeline_item_id":"string","trim_start_delta_seconds":0,"trim_end_delta_seconds":0,"snap_to_frame":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "timeline_item_id": "string",
  "trim_start_units": 0,
  "trim_end_units": 0,
  "trim_start_seconds": 0,
  "trim_end_seconds": 0,
  "new_duration_seconds": 0,
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/transcribe
```http
POST /projects/{projectId}/transcribe
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdTranscribe`
Start transcription
Start transcription.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/transcribe" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"media_id":"string","force":true,"auto_suggest_shorts":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job_id": "string",
  "status": "string",
  "estimated_seconds": 0,
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/transcript
```http
GET /projects/{projectId}/transcript
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getProjectsProjectIdTranscript`
Get transcript
Get transcript.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
media_id | query | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/transcript" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "assetId": "string",
  "assetName": "string",
  "language": {},
  "durationSeconds": 0,
  "wordCount": 0,
  "segmentCount": 0,
  "averageConfidence": {},
  "fullText": "string",
  "segments": [
    {
      "id": "string",
      "startSeconds": 0,
      "endSeconds": 0,
      "text": "string",
      "confidence": {},
      "speakerLabel": {},
      "speakerConfidence": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/transcript/corrections
```http
POST /projects/{projectId}/transcript/corrections
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdTranscriptCorrections`
Bulk replace transcript words
Bulk replace transcript words.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/transcript/corrections" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"media_asset_id":"string","timeline_item_id":"string","replacements":[{"from":"string","to":"string","match_case":true,"match_whole_word":true}],"phrase_replacements":[{"from_words":["string"],"to_words":["string"],"match_case":true}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "asset_id": "string",
  "updated_segments": 0,
  "updated_words": 0,
  "replacements_applied": 0,
  "unmatched_phrase_replacements": [
    {
      "from_words": [
        "string"
      ],
      "to_words": [
        "string"
      ],
      "match_case": true
    }
  ],
  "message": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/transcript/segments
```http
GET /projects/{projectId}/transcript/segments
```
Tag: Project Context
Auth: API key
Operation ID: `getProjectsProjectIdTranscriptSegments`
Get transcript segments
Get transcript segments.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
chunk_strategy | query | no | `string` (sentence, paragraph, time-window) | -
max_chunk_seconds | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/transcript/segments" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "totalSegments": 0,
  "totalWords": 0,
  "totalDurationSeconds": 0,
  "segments": [
    {
      "text": "string",
      "startSeconds": 0,
      "endSeconds": 0,
      "durationSeconds": 0,
      "wordCount": 0
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/visual-analysis
```http
POST /projects/{projectId}/visual-analysis
```
Tag: Project Management
Auth: API key
Operation ID: `createProjectsProjectIdVisualAnalysis`
Render and visually analyze one or more project frames
Render and visually analyze one or more project frames.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/visual-analysis" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"time_seconds":0,"times_seconds":[0],"target_width":0,"image_format":"jpeg","instruction":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "summary": "string",
  "issues": [
    {
      "severity": "info",
      "title": "string",
      "details": "string",
      "suggested_fix": {}
    }
  ],
  "suggested_next_edits": [
    "string"
  ],
  "confidence": 0,
  "frames": [
    {
      "preview_url": "string",
      "expires_at": "string",
      "storage_key": "string",
      "captured_at": "string",
      "cached": true,
      "frame": 0,
      "time_seconds": 0,
      "width": 0,
      "height": 0,
      "image_format": "jpeg",
      "revision": 0,
      "analysis": {
        "summary": "string",
        "visibleText": [
          null
        ],
        "issues": [
          null
        ],
        "suggestedNextEdits": [
          null
        ],
        "confidence": 0
      }
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /projects/{projectId}/visual-debug
```http
GET /projects/{projectId}/visual-debug
```
Tag: Project Management
Auth: API key
Operation ID: `getProjectsProjectIdVisualDebug`
Return machine-readable visual layout debug data
Return machine-readable visual layout debug data.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -
time_seconds | query | yes | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/projects/PROJECT_ID/visual-debug" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "revision": 0,
  "captured_at": "string",
  "cached": true,
  "layout_key": {},
  "visible_media_rect": {
    "left": 0,
    "top": 0,
    "width": 0,
    "height": 0
  },
  "visible_media_rects": [
    {
      "left": 0,
      "top": 0,
      "width": 0,
      "height": 0,
      "timeline_item_id": "string"
    }
  ],
  "caption_rects": [
    {
      "left": 0,
      "top": 0,
      "width": 0,
      "height": 0,
      "timeline_item_id": "string"
    }
  ],
  "canvas_rects": [
    {
      "left": 0,
      "top": 0,
      "width": 0,
      "height": 0,
      "timeline_item_id": "string"
    }
  ],
  "source_crops": [
    {
      "timeline_item_id": "string",
      "x": 0,
      "y": 0,
      "width": 0,
      "height": 0,
      "fit_mode": "contain",
      "planner_mode": "string"
    }
  ],
  "speaker_regions": [
    {
      "asset_id": "string",
      "side": "left",
      "confidence": 0,
      "coverage_ratio": 0,
      "dominant_ratio": 0,
      "box": {
        "x": 0,
        "y": 0,
        "width": 0,
        "height": 0
      }
    }
  ],
  "face_boxes": [
    {
      "asset_id": "string",
      "subject_id": "string",
      "label": "string",
      "role": "primary",
      "side": "left",
      "confidence": 0,
      "box": {
        "x": 0,
        "y": 0,
        "width": 0,
        "height": 0
      }
    }
  ],
  "active_split_gap_rect": {
    "left": 0,
    "top": 0,
    "width": 0,
    "height": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{projectId}/visuals/apply
```http
POST /projects/{projectId}/visuals/apply
```
Tag: Platform
Auth: API key
Operation ID: `createProjectsProjectIdVisualsApply`
Create or update visual presets atomically; supports dry run
Create or update visual presets atomically; supports dry run.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
projectId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/PROJECT_ID/visuals/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"string","at":0,"duration":0,"preset":"broll-headline","text":"string","assetId":"string"}],"expectedRevision":0,"dryRun":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dryRun": true,
  "revision": 0,
  "mutationReceiptId": {},
  "replayed": true,
  "items": [
    {
      "id": "string",
      "timelineItemId": "string",
      "contentItemId": "string",
      "compositionId": "string",
      "status": "created"
    }
  ],
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /projects/{project_id}/captions/magic-emojis
```http
POST /projects/{project_id}/captions/magic-emojis
```
Tag: Captions and Themes
Auth: API key
Operation ID: `createProjectsProjectIdCaptionsMagicEmojis`
Generate caption emoji accents
Generate caption emoji accents.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
project_id | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/projects/{project_id}/captions/magic-emojis" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "project_id": "string",
  "asset_id": "string",
  "status": "queued",
  "run_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /publishing/capabilities
```http
GET /publishing/capabilities
```
Tag: Platform
Auth: API key
Operation ID: `getPublishingCapabilities`
Read supported formats and provider limits
Read supported formats and provider limits.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/publishing/capabilities" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "platforms": [
    {
      "platform": "youtube",
      "formats": [
        "string"
      ],
      "native_reel_story_share": "manual_required",
      "limitations": [
        "string"
      ]
    }
  ],
  "modes": [
    "schedule"
  ],
  "max_targets": 0,
  "time_format": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /publishing/connections
```http
GET /publishing/connections
```
Tag: Platform
Auth: API key
Operation ID: `getPublishingConnections`
List publishing connections
List publishing connections.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/publishing/connections" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "connections": [
    {
      "id": "string",
      "connection_id": "string",
      "platform": "youtube",
      "username": {},
      "display_name": {},
      "status": "active",
      "external_account_id": "string"
    }
  ],
  "count": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/network/schedule
```http
POST /publishing/network/schedule
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingNetworkSchedule`
Schedule an X, LinkedIn or Threads post
Schedule text or a completed project export. X is text-only and requires verified free API access. LinkedIn publishes to the authorized member profile. Requires Idempotency-Key; replay with the same key and input to recover the original receipt.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/network/schedule" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"platform":"x","connection_id":"string","project_id":"string","export_id":"string","caption":"string","scheduled_for":"string","timezone":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /publishing/posts
```http
GET /publishing/posts
```
Tag: Platform
Auth: API key
Operation ID: `getPublishingPosts`
List posts with bounded status and provider receipts
List posts with bounded status and provider receipts.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -
status | query | no | `string` (draft, scheduled, publishing, published, partially_published, draft_sent, failed, cancelled) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/publishing/posts" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "posts": [
    {
      "post_id": "string",
      "status": "string",
      "revision": "string",
      "draft_input": {},
      "project_id": {},
      "export_id": {},
      "caption": {},
      "scheduled_for": {},
      "timezone": "string",
      "scheduled_local": {},
      "targets": [
        {}
      ],
      "next_poll_after_ms": 0
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "has_more": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/posts
```http
POST /publishing/posts
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingPosts`
Create a post for one or more accounts
Requires Idempotency-Key. Validates all targets before creating one post. Schedule mode requires a future RFC3339 instant; now mode queues immediately. Native Reel-to-Story sharing returns a manual follow-up. Provider publication is asynchronous and may partially fail.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/posts" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":{"type":"text"},"caption":"string","mode":"schedule","scheduled_for":"string","timezone":"string","contains_synthetic_media":true,"targets":[{"connection_id":"string","caption":"string","platform":"instagram","share_to_story":true,"trial_reel":true,"trial_graduation_strategy":"MANUAL","share_to_feed":true}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/posts/validate
```http
POST /publishing/posts/validate
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingPostsValidate`
Validate a post without creating or publishing it
Checks accounts, media, captions, time and provider capabilities; returns all target issues. Credentials may refresh during capability checks. No post, export or upload is created.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/posts/validate" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":{"type":"text"},"caption":"string","mode":"schedule","scheduled_for":"string","timezone":"string","contains_synthetic_media":true,"targets":[{"connection_id":"string","caption":"string","platform":"instagram","share_to_story":true,"trial_reel":true,"trial_graduation_strategy":"MANUAL","share_to_feed":true}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "valid": true,
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "issues": [
    {
      "code": "string",
      "message": "string",
      "field": {},
      "connection_id": {},
      "platform": "youtube",
      "retryable": true
    }
  ],
  "warnings": [
    {
      "code": "string",
      "message": "string",
      "field": {},
      "connection_id": {},
      "platform": "youtube",
      "retryable": true
    }
  ],
  "targets": [
    {
      "connection_id": "string",
      "platform": "youtube",
      "account_name": {},
      "caption": "string",
      "publish_kind": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /publishing/posts/{postId}
```http
GET /publishing/posts/{postId}
```
Tag: Platform
Auth: API key
Operation ID: `getPublishingPostsPostId`
Read publishing status and provider receipts
Read publishing status and provider receipts.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/publishing/posts/{postId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /publishing/posts/{postId}/approvals
```http
GET /publishing/posts/{postId}/approvals
```
Tag: Platform
Auth: API key
Operation ID: `getPublishingPostsPostIdApprovals`
Read retained publishing approval history
Read retained publishing approval history.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/publishing/posts/{postId}/approvals" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "approvals": [
    {
      "approval": {
        "id": "string",
        "digest": "string",
        "approved_by": "string",
        "approved_at": "string",
        "authority": "user",
        "series_policy": {},
        "previous_approval_ids": [
          null
        ]
      },
      "project_id": "string",
      "export_id": "string",
      "targets": [
        {}
      ]
    }
  ],
  "has_more": true,
  "next_offset": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /publishing/posts/{postId}/draft
```http
PATCH /publishing/posts/{postId}/draft
```
Tag: Platform
Auth: API key
Operation ID: `updatePublishingPostsPostIdDraft`
Replace an unscheduled draft using its current revision
Replace an unscheduled draft using its current revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/publishing/posts/{postId}/draft" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string","post":{"source":{"type":"text"},"caption":"string","mode":"schedule","scheduled_for":"string","timezone":"string","contains_synthetic_media":true,"targets":[{}]}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /publishing/posts/{postId}/draft
```http
DELETE /publishing/posts/{postId}/draft
```
Tag: Platform
Auth: API key
Operation ID: `deletePublishingPostsPostIdDraft`
Delete an unscheduled draft using its current revision
Delete an unscheduled draft using its current revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -
expected_revision | query | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/publishing/posts/{postId}/draft" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "deleted": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/posts/{postId}/replace
```http
POST /publishing/posts/{postId}/replace
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingPostsPostIdReplace`
Approve an explicit replacement for unstarted destinations
Requires Idempotency-Key, the current post revision and every edited target revision. Retains approval history. In-flight, delivered and uncertain destinations cannot be replaced.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/posts/{postId}/replace" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string","expected_targets":[{"target_id":"string","revision":"string"}],"post":{"source":{"type":"text"},"caption":"string","mode":"schedule","scheduled_for":"string","timezone":"string","contains_synthetic_media":true,"targets":[{}]}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/posts/{postId}/schedule
```http
POST /publishing/posts/{postId}/schedule
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingPostsPostIdSchedule`
Validate and schedule a draft atomically, preserving its post ID
Validate and schedule a draft atomically, preserving its post ID.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
postId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/posts/{postId}/schedule" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string","mode":"schedule","scheduled_for":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/targets/{targetId}/cancel
```http
POST /publishing/targets/{targetId}/cancel
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingTargetsTargetIdCancel`
Cancel one unpublished target with its current revision
Cancel one unpublished target with its current revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
targetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/targets/{targetId}/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/targets/{targetId}/reschedule
```http
POST /publishing/targets/{targetId}/reschedule
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingTargetsTargetIdReschedule`
Move one unpublished target to a future time with its current revision
Move one unpublished target to a future time with its current revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
targetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/targets/{targetId}/reschedule" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string","scheduled_for":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/targets/{targetId}/retry
```http
POST /publishing/targets/{targetId}/retry
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingTargetsTargetIdRetry`
Retry one eligible failed target with its current revision
Preserves successful targets. Unconfirmed publication outcomes cannot be blindly retried.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
targetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/targets/{targetId}/retry" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expected_revision":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "string",
  "revision": "string",
  "draft_input": {
    "source": {},
    "caption": "string",
    "mode": "schedule",
    "scheduled_for": "string",
    "timezone": "string",
    "contains_synthetic_media": true,
    "targets": [
      null
    ]
  },
  "project_id": {},
  "export_id": {},
  "caption": {},
  "scheduled_for": {},
  "timezone": "string",
  "scheduled_local": {},
  "targets": [
    {
      "target_id": "string",
      "connection_id": {},
      "platform": "youtube",
      "status": "scheduled",
      "account_name": {},
      "approval": {},
      "caption": {},
      "scheduled_for": {},
      "scheduled_local": {},
      "requested_publish_kind": {},
      "publish_kind": {},
      "remote_post_id": {},
      "remote_post_url": {},
      "published_at": {},
      "error_code": {},
      "error_message": {},
      "can_retry": true,
      "can_cancel": true,
      "can_reschedule": true,
      "next_attempt_at": {},
      "revision": "string",
      "follow_ups": [
        {}
      ],
      "visibility": {},
      "analytics": {}
    }
  ],
  "next_poll_after_ms": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/tiktok/schedule
```http
POST /publishing/tiktok/schedule
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingTiktokSchedule`
Schedule TikTok publishing
Schedule a completed BlitzReels video or slideshow export, or create a slideshow from ordered workspace image assets. Supports TikTok direct posting and inbox drafts.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/tiktok/schedule" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":{},"export_id":{},"media_asset_ids":["string"],"project_name":"string","connection_id":{},"caption":"string","scheduled_for":{},"timezone":{},"publish_mode":"direct_post","privacy_level":"PUBLIC_TO_EVERYONE","allow_comment":{},"allow_duet":{},"allow_stitch":{},"cover_timestamp_ms":0,"photo_cover_index":0,"auto_add_music":{},"commercial_content_enabled":{},"brand_organic":{},"branded_content":{},"is_ai_generated":{},"consent_accepted":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "target_id": "string",
  "platform": "tiktok",
  "status": "scheduled",
  "scheduled_for": "string",
  "connection_id": "string",
  "export_id": "string",
  "project_id": "string",
  "source": "project_export",
  "source_media_asset_ids": [
    "string"
  ],
  "media_type": "video",
  "publish_mode": "direct_post",
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /publishing/video/schedule
```http
POST /publishing/video/schedule
```
Tag: Platform
Auth: API key
Operation ID: `createPublishingVideoSchedule`
Schedule an uploaded video
Schedule one workspace video asset to YouTube, Instagram, Facebook, TikTok, LinkedIn, or Threads without requiring an existing BlitzReels project. Duration and dimensions must be processed first. Pending metadata returns a retryable conflict with media_asset_id before creating a publishing source or post.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/publishing/video/schedule" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"media_asset_id":"string","project_name":"string","caption":"string","contains_synthetic_media":{},"scheduled_for":"string","timezone":"string","include_affiliate_cta":{},"affiliate_tracking_url":"string","affiliate_cta_text":"string","targets":[{"platform":"linkedin","connection_id":{}}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "post_id": "string",
  "status": "scheduled",
  "scheduled_for": "string",
  "project_id": "string",
  "export_id": "string",
  "source": "media_asset",
  "source_media_asset_id": "string",
  "targets": [
    {
      "target_id": "string",
      "connection_id": "string",
      "platform": "youtube",
      "status": "scheduled"
    }
  ],
  "next_actions": [
    {
      "method": "GET",
      "path": "string",
      "reason": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /recording-sets
```http
GET /recording-sets
```
Tag: Platform
Auth: API key
Operation ID: `getRecordingSets`
List Recording Sets
List Recording Sets.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
status | query | no | `object` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/recording-sets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_sets": [
    {
      "recording_set_id": "string",
      "name": "string",
      "status": "collecting_assets",
      "media_folder_id": {},
      "anchor_asset_id": {},
      "alignment_strategy": "padded",
      "duration_seconds": {},
      "alignment_confidence": {},
      "warnings": [
        "string"
      ],
      "analysis_error": {},
      "tracks": [
        {}
      ],
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "has_more": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /recording-sets
```http
POST /recording-sets
```
Tag: Platform
Auth: API key
Operation ID: `createRecordingSet`
Create a synchronized Recording Set
Create a synchronized Recording Set.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/recording-sets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "media_folder_id": {},
  "status": "collecting_assets"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /recording-sets/{recordingSetId}
```http
GET /recording-sets/{recordingSetId}
```
Tag: Platform
Auth: API key
Operation ID: `getRecordingSet`
Get a Recording Set and its synchronized assets
Get a Recording Set and its synchronized assets.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recordingSetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/recording-sets/{recordingSetId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "name": "string",
  "status": "collecting_assets",
  "media_folder_id": {},
  "anchor_asset_id": {},
  "alignment_strategy": "padded",
  "duration_seconds": {},
  "alignment_confidence": {},
  "warnings": [
    "string"
  ],
  "analysis_error": {},
  "tracks": [
    {
      "track_id": "string",
      "asset_id": "string",
      "role": "camera",
      "participant_label": {},
      "participant_name": {},
      "is_primary": true,
      "alignment_offset_seconds": 0,
      "content_windows": [
        {}
      ],
      "order_index": 0
    }
  ],
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /recording-sets/{recordingSetId}
```http
DELETE /recording-sets/{recordingSetId}
```
Tag: Platform
Auth: API key
Operation ID: `deleteRecordingSetsRecordingSetId`
Delete an empty unfinalized Recording Set
Delete an empty unfinalized Recording Set.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recordingSetId | path | yes | `string` | -
confirm_delete | query | yes | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/recording-sets/{recordingSetId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "deleted": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /recording-sets/{recordingSetId}/clip-batches
```http
POST /recording-sets/{recordingSetId}/clip-batches
```
Tag: Platform
Auth: API key
Operation ID: `createRecordingSetClipBatch`
Generate clips from an analyzed Recording Set
Generate clips from an analyzed Recording Set.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recordingSetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/recording-sets/{recordingSetId}/clip-batches" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"clip_preset_id":"default","create_flow_options":{},"branding_options":{},"max_clip_count":0,"max_duration_seconds":30}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "batch_id": "string",
  "project_folder_id": {},
  "estimated_clip_count": 0,
  "studio_sound": {
    "requested": true,
    "status": "disabled",
    "source_asset_id": {},
    "enhanced_asset_id": {},
    "version": {},
    "processing_run_id": {},
    "error_message": {}
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /recording-sets/{recordingSetId}/finalize
```http
POST /recording-sets/{recordingSetId}/finalize
```
Tag: Platform
Auth: API key
Operation ID: `finalizeRecordingSet`
Finalize assets and analyze a Recording Set
Finalize assets and analyze a Recording Set.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recordingSetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/recording-sets/{recordingSetId}/finalize" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "status": "collecting_assets",
  "anchor_asset_id": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /recording-sets/{recordingSetId}/tracks
```http
POST /recording-sets/{recordingSetId}/tracks
```
Tag: Platform
Auth: API key
Operation ID: `attachRecordingSetTrack`
Attach a camera or screen asset to a Recording Set
Attach a camera or screen asset to a Recording Set.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
recordingSetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/recording-sets/{recordingSetId}/tracks" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_id":"string","role":"camera","participant_label":"string","participant_name":"string","is_primary":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "recording_set_id": "string",
  "track_id": "string",
  "asset_id": "string",
  "role": "camera"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /series
```http
GET /series
```
Tag: Platform
Auth: API key
Operation ID: `getSeries`
List optional Series
List optional Series.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/series" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "name": "string",
      "defaultCreationMode": "podcast",
      "description": "string",
      "coverAssetId": "string",
      "logoAssetId": "string",
      "storyKitId": "string",
      "captionThemeId": "string",
      "id": "string",
      "revision": 0,
      "createdAt": "string",
      "updatedAt": "string",
      "coverUrl": {},
      "projectCount": 0,
      "sourceCount": 0
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /series
```http
POST /series
```
Tag: Platform
Auth: API key
Operation ID: `createSeries`
Create an optional Series
Create an optional Series.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/series" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","default_creation_mode":"podcast","description":"string","cover_asset_id":"string","logo_asset_id":"string","story_kit_id":"string","caption_theme_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "name": "string",
  "defaultCreationMode": "podcast",
  "description": "string",
  "coverAssetId": "string",
  "logoAssetId": "string",
  "storyKitId": "string",
  "captionThemeId": "string",
  "id": "string",
  "revision": 0,
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /series-content
```http
GET /series-content
```
Tag: Platform
Auth: API key
Operation ID: `getSeriesContent`
List Series content or standalone content
Omit series_id to list standalone sources or projects. source_id filters projects by their existing clip-source relationship.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -
series_id | query | no | `string` | -
kind | query | yes | `string` (project, source) | -
source_id | query | no | `string` | -
search | query | no | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/series-content" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "id": "string",
      "kind": "project",
      "name": "string",
      "seriesId": "string",
      "sourceId": "string",
      "thumbnailUrl": {},
      "durationSeconds": {}
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /series-content/{contentId}
```http
PUT /series-content/{contentId}
```
Tag: Platform
Auth: API key
Operation ID: `replaceSeriesContentContentId`
Assign, move or detach content from a Series
Changes only the selected source or project. Sources do not move their existing clips. Null series_id detaches content. Repeated identical assignments are safe; stale expected_series_id values conflict.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
contentId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/series-content/{contentId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"kind":"project","series_id":"string","expected_series_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "kind": "project",
  "seriesId": "string",
  "previousSeriesId": "string",
  "changed": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /series/{seriesId}
```http
GET /series/{seriesId}
```
Tag: Platform
Auth: API key
Operation ID: `getSeriesSeriesId`
Inspect a Series and its revision
Inspect a Series and its revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/series/{seriesId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "name": "string",
  "defaultCreationMode": "podcast",
  "description": "string",
  "coverAssetId": "string",
  "logoAssetId": "string",
  "storyKitId": "string",
  "captionThemeId": "string",
  "id": "string",
  "revision": 0,
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /series/{seriesId}
```http
PUT /series/{seriesId}
```
Tag: Platform
Auth: API key
Operation ID: `replaceSeriesSeriesId`
Replace Series defaults at an expected revision
Replaces the Series identity and defaults. Existing projects and exports are unchanged. Null reference fields clear their defaults.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/series/{seriesId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","default_creation_mode":"podcast","description":"string","cover_asset_id":"string","logo_asset_id":"string","story_kit_id":"string","caption_theme_id":"string","expected_revision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "name": "string",
  "defaultCreationMode": "podcast",
  "description": "string",
  "coverAssetId": "string",
  "logoAssetId": "string",
  "storyKitId": "string",
  "captionThemeId": "string",
  "id": "string",
  "revision": 0,
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /series/{seriesId}
```http
DELETE /series/{seriesId}
```
Tag: Platform
Auth: API key
Operation ID: `deleteSeriesSeriesId`
Delete a Series while preserving all content
Delete a Series while preserving all content.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -
expected_revision | query | yes | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/series/{seriesId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "detachedProjects": 0,
  "detachedSources": 0,
  "contentPreserved": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /series/{seriesId}/creation
```http
GET /series/{seriesId}/creation
```
Tag: Platform
Auth: API key
Operation ID: `getSeriesSeriesIdCreation`
Read a recurring creation schedule and occurrence history
Read a recurring creation schedule and occurrence history.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -
limit | query | no | `integer` | -
before | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/series/{seriesId}/creation" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "admissionEnabled": true,
  "schedule": {
    "id": "string",
    "seriesId": "string",
    "revision": 0,
    "status": "active",
    "config": {
      "timezone": "string",
      "slots": [
        null
      ],
      "brief": "string",
      "format": "video",
      "language": "en",
      "draftsPerOccurrence": 0,
      "maxAttemptsPerDraft": 0,
      "maximumAgentUsd": 0,
      "maxLatenessMinutes": 0
    },
    "nextOccurrenceAt": "string",
    "updatedAt": "string"
  },
  "occurrences": [
    {
      "id": "string",
      "scheduledFor": "string",
      "status": "pending",
      "scheduleRevision": 0,
      "nextCheckAt": "string",
      "completedAt": "string",
      "reason": {},
      "cancelRequested": true,
      "items": [
        {}
      ]
    }
  ],
  "nextCursor": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /series/{seriesId}/creation
```http
PUT /series/{seriesId}/creation
```
Tag: Platform
Auth: API key
Operation ID: `replaceSeriesSeriesIdCreation`
Save recurring creation settings at an expected revision
Save recurring creation settings at an expected revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/series/{seriesId}/creation" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"idempotencyKey":"string","config":{"timezone":"string","slots":[{"day":0,"time":"string"}],"brief":"string","format":"video","language":"en","draftsPerOccurrence":0,"maxAttemptsPerDraft":0,"maximumAgentUsd":0,"maxLatenessMinutes":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "admissionEnabled": true,
  "schedule": {
    "id": "string",
    "seriesId": "string",
    "revision": 0,
    "status": "active",
    "config": {
      "timezone": "string",
      "slots": [
        null
      ],
      "brief": "string",
      "format": "video",
      "language": "en",
      "draftsPerOccurrence": 0,
      "maxAttemptsPerDraft": 0,
      "maximumAgentUsd": 0,
      "maxLatenessMinutes": 0
    },
    "nextOccurrenceAt": "string",
    "updatedAt": "string"
  },
  "occurrences": [
    {
      "id": "string",
      "scheduledFor": "string",
      "status": "pending",
      "scheduleRevision": 0,
      "nextCheckAt": "string",
      "completedAt": "string",
      "reason": {},
      "cancelRequested": true,
      "items": [
        {}
      ]
    }
  ],
  "nextCursor": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /series/{seriesId}/creation/control
```http
POST /series/{seriesId}/creation/control
```
Tag: Platform
Auth: API key
Operation ID: `createSeriesSeriesIdCreationControl`
Pause, resume or cancel recurring creation
Pause, resume or cancel recurring creation.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/series/{seriesId}/creation/control" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"idempotencyKey":"string","action":"pause"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "admissionEnabled": true,
  "schedule": {
    "id": "string",
    "seriesId": "string",
    "revision": 0,
    "status": "active",
    "config": {
      "timezone": "string",
      "slots": [
        null
      ],
      "brief": "string",
      "format": "video",
      "language": "en",
      "draftsPerOccurrence": 0,
      "maxAttemptsPerDraft": 0,
      "maximumAgentUsd": 0,
      "maxLatenessMinutes": 0
    },
    "nextOccurrenceAt": "string",
    "updatedAt": "string"
  },
  "occurrences": [
    {
      "id": "string",
      "scheduledFor": "string",
      "status": "pending",
      "scheduleRevision": 0,
      "nextCheckAt": "string",
      "completedAt": "string",
      "reason": {},
      "cancelRequested": true,
      "items": [
        {}
      ]
    }
  ],
  "nextCursor": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /series/{seriesId}/publishing
```http
GET /series/{seriesId}/publishing
```
Tag: Platform
Auth: API key
Operation ID: `getSeriesSeriesIdPublishing`
Read automatic publication settings
Read automatic publication settings.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/series/{seriesId}/publishing" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "seriesId": "string",
  "activationEnabled": true,
  "policy": {
    "revision": 0,
    "status": "paused",
    "authorizedBy": "string",
    "updatedAt": "string",
    "config": {
      "targets": [
        null
      ],
      "formats": [
        null
      ],
      "maxPublicationsPer24h": 0,
      "minimumIntervalMinutes": 0,
      "maximumCreativeUsdPerDraft": 0,
      "maximumCreativeUsdPer24h": 0,
      "maximumDraftAgeHours": 0,
      "containsSyntheticMedia": true
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /series/{seriesId}/publishing
```http
PUT /series/{seriesId}/publishing
```
Tag: Platform
Auth: API key
Operation ID: `replaceSeriesSeriesIdPublishing`
Save automatic publication limits; pauses publication until explicitly activated
Save automatic publication limits; pauses publication until explicitly activated.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/series/{seriesId}/publishing" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"idempotencyKey":"string","config":{"targets":[{}],"formats":["video"],"maxPublicationsPer24h":0,"minimumIntervalMinutes":0,"maximumCreativeUsdPerDraft":0,"maximumCreativeUsdPer24h":0,"maximumDraftAgeHours":0,"containsSyntheticMedia":true}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "seriesId": "string",
  "activationEnabled": true,
  "policy": {
    "revision": 0,
    "status": "paused",
    "authorizedBy": "string",
    "updatedAt": "string",
    "config": {
      "targets": [
        null
      ],
      "formats": [
        null
      ],
      "maxPublicationsPer24h": 0,
      "minimumIntervalMinutes": 0,
      "maximumCreativeUsdPerDraft": 0,
      "maximumCreativeUsdPer24h": 0,
      "maximumDraftAgeHours": 0,
      "containsSyntheticMedia": true
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /series/{seriesId}/publishing/control
```http
POST /series/{seriesId}/publishing/control
```
Tag: Platform
Auth: API key
Operation ID: `createSeriesSeriesIdPublishingControl`
Explicitly activate, pause or revoke automatic publication
Explicitly activate, pause or revoke automatic publication.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/series/{seriesId}/publishing/control" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedRevision":0,"idempotencyKey":"string","action":"activate","confirmAutomaticPublication":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "seriesId": "string",
  "activationEnabled": true,
  "policy": {
    "revision": 0,
    "status": "paused",
    "authorizedBy": "string",
    "updatedAt": "string",
    "config": {
      "targets": [
        null
      ],
      "formats": [
        null
      ],
      "maxPublicationsPer24h": 0,
      "minimumIntervalMinutes": 0,
      "maximumCreativeUsdPerDraft": 0,
      "maximumCreativeUsdPer24h": 0,
      "maximumDraftAgeHours": 0,
      "containsSyntheticMedia": true
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /story-kits
```http
GET /story-kits
```
Tag: AI Generation
Auth: API key
Operation ID: `getStoryKits`
List reusable Story Kits
List reusable Story Kits.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/story-kits" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "id": "string",
      "revision": 0,
      "name": "string",
      "description": {},
      "visual_style": "string",
      "style_reference_asset_ids": [
        "string"
      ],
      "facts": [
        "string"
      ],
      "locations": [
        {}
      ],
      "character_ids": [
        "string"
      ],
      "narrator_character_id": "string",
      "created_at": "string",
      "updated_at": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "has_more": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /story-kits
```http
POST /story-kits
```
Tag: AI Generation
Auth: API key
Operation ID: `createStoryKits`
Create a reusable Story Kit
Create a reusable Story Kit.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/story-kits" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","visual_style":"string","style_reference_asset_ids":["string"],"facts":["string"],"locations":[{"id":"string","name":"string","canonical_description":"string","reference_asset_ids":["string"],"facts":["string"]}],"character_ids":["string"],"narrator_character_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "revision": 0,
  "name": "string",
  "description": {},
  "visual_style": "string",
  "style_reference_asset_ids": [
    "string"
  ],
  "facts": [
    "string"
  ],
  "locations": [
    {
      "id": "string",
      "name": "string",
      "canonical_description": "string",
      "reference_asset_ids": [
        "string"
      ],
      "facts": [
        "string"
      ]
    }
  ],
  "character_ids": [
    "string"
  ],
  "narrator_character_id": "string",
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /story-kits/{storyKitId}
```http
GET /story-kits/{storyKitId}
```
Tag: AI Generation
Auth: API key
Operation ID: `getStoryKitsStoryKitId`
Inspect a reusable Story Kit
Inspect a reusable Story Kit.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
storyKitId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/story-kits/{storyKitId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "revision": 0,
  "name": "string",
  "description": {},
  "visual_style": "string",
  "style_reference_asset_ids": [
    "string"
  ],
  "facts": [
    "string"
  ],
  "locations": [
    {
      "id": "string",
      "name": "string",
      "canonical_description": "string",
      "reference_asset_ids": [
        "string"
      ],
      "facts": [
        "string"
      ]
    }
  ],
  "character_ids": [
    "string"
  ],
  "narrator_character_id": "string",
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /story-kits/{storyKitId}
```http
PATCH /story-kits/{storyKitId}
```
Tag: AI Generation
Auth: API key
Operation ID: `updateStoryKitsStoryKitId`
Update a Story Kit using optimistic concurrency
Update a Story Kit using optimistic concurrency.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
storyKitId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/story-kits/{storyKitId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","visual_style":"string","style_reference_asset_ids":["string"],"facts":["string"],"locations":[{"id":"string","name":"string","canonical_description":"string","reference_asset_ids":["string"],"facts":["string"]}],"character_ids":["string"],"narrator_character_id":"string","expected_revision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "revision": 0,
  "name": "string",
  "description": {},
  "visual_style": "string",
  "style_reference_asset_ids": [
    "string"
  ],
  "facts": [
    "string"
  ],
  "locations": [
    {
      "id": "string",
      "name": "string",
      "canonical_description": "string",
      "reference_asset_ids": [
        "string"
      ],
      "facts": [
        "string"
      ]
    }
  ],
  "character_ids": [
    "string"
  ],
  "narrator_character_id": "string",
  "created_at": "string",
  "updated_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /styles
```http
GET /styles
```
Tag: Captions and Themes
Auth: API key
Operation ID: `getStyles`
List caption styles
List caption styles.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/styles" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "styles": [
    {
      "id": "string",
      "name": "string",
      "description": "string",
      "preview_url": {},
      "poster_url": {}
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /visual-styles
```http
GET /visual-styles
```
Tag: AI Generation
Auth: API key
Operation ID: `getVisualStyles`
List visual styles
List visual styles.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/visual-styles" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "visual_styles": [
    {
      "id": "string",
      "slug": "string",
      "name": "string",
      "description": "string",
      "tags": [
        "string"
      ],
      "aliases": [
        "string"
      ]
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /visuals/presets
```http
GET /visuals/presets
```
Tag: Platform
Auth: API key
Operation ID: `getVisualsPresets`
List versioned visual presets
List versioned visual presets.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/visuals/presets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "version": 1,
  "presets": [
    {
      "id": "string",
      "number": "string",
      "name": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /voices
```http
GET /voices
```
Tag: AI Generation
Auth: API key
Operation ID: `getVoices`
List voices
List voices.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/voices" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "voices": [
    {
      "id": "string",
      "name": "string",
      "language": "string",
      "gender": "string",
      "accent": "string",
      "category": "string",
      "description": "string",
      "previewUrl": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /webhooks
```http
GET /webhooks
```
Tag: Platform
Auth: API key
Operation ID: `getWebhooks`
List webhooks
List webhooks.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/webhooks" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "webhooks": [
    {
      "id": "string",
      "url": "string",
      "events": [
        "string"
      ],
      "secret": "string",
      "created_at": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /webhooks
```http
POST /webhooks
```
Tag: Platform
Auth: API key
Operation ID: `createWebhooks`
Create webhook
Create webhook.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/webhooks" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"string","events":["project.created"],"secret":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "url": "string",
  "events": [
    "string"
  ],
  "secret": "string",
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /webhooks/{webhookId}
```http
GET /webhooks/{webhookId}
```
Tag: Platform
Auth: API key
Operation ID: `getWebhooksWebhookId`
Get webhook details
Get webhook details.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
webhookId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/webhooks/{webhookId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "url": "string",
  "events": [
    "string"
  ],
  "secret": "string",
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /webhooks/{webhookId}
```http
DELETE /webhooks/{webhookId}
```
Tag: Platform
Auth: API key
Operation ID: `deleteWebhooksWebhookId`
Delete webhook
Delete webhook.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
webhookId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/webhooks/{webhookId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace
```http
GET /workspace
```
Tag: Project Management
Auth: API key
Operation ID: `getWorkspace`
Get workspace info
Get workspace info.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "workspace": {
    "id": "string",
    "name": "string",
    "slug": {},
    "plan": "string",
    "description": {},
    "memberCount": 0,
    "defaults": {
      "aspectRatio": {},
      "resolution": {},
      "frameRate": {},
      "autoManageBroll": {}
    },
    "createdAt": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/content/batches
```http
GET /workspace/content/batches
```
Tag: Platform
Auth: API key
Operation ID: `getWorkspaceContentBatches`
List saved workspace batches with pagination and per-item outcomes
List saved workspace batches with pagination and per-item outcomes.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -
status | query | no | `string` (all, active) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/content/batches" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "jobs": [
    {
      "runId": "string",
      "triggerRunId": {},
      "requestId": "string",
      "attempt": 0,
      "status": "queued",
      "stage": "queued",
      "completed": 0,
      "failed": 0,
      "count": 0,
      "done": true,
      "failedRun": true,
      "canceled": true,
      "error": {},
      "items": [
        {}
      ],
      "createdAt": "string",
      "completedAt": "string",
      "observationError": {}
    }
  ],
  "bounds": {
    "limit": 0,
    "maxLimit": 50,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/content/batches
```http
POST /workspace/content/batches
```
Tag: Platform
Auth: API key
Operation ID: `createWorkspaceContentBatches`
Create a saved batch of up to twelve content drafts
Requires Idempotency-Key equal to requestId. Uses generation credits; no publishing. Identical requests recover the original admission receipt. Read the job for current per-item outcomes.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/content/batches" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"requestId":"string","profileId":"string","language":"en","options":{"carousels":0,"videos":0,"memes":0,"videoMode":"footage","ugcFormat":"before_after","imageSources":["curated"],"imageUrls":["string"]}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runId": "string",
  "triggerRunId": {},
  "requestId": "string",
  "attempt": 0,
  "status": "queued",
  "stage": "queued",
  "completed": 0,
  "failed": 0,
  "count": 0,
  "done": true,
  "failedRun": true,
  "canceled": true,
  "error": {},
  "items": [
    {
      "index": 0,
      "draftId": {},
      "status": "pending",
      "projectId": "string",
      "error": {}
    }
  ],
  "createdAt": "string",
  "completedAt": "string",
  "quote": {
    "count": 0,
    "actorSetupCredits": 0,
    "animationCredits": 0,
    "orchestrationCredits": 0,
    "voiceCredits": 0,
    "writing": 0,
    "imageCredits": 0,
    "videoCredits": 0,
    "ugcImages": 0,
    "estimatedCredits": 0,
    "generatedImages": 0,
    "ugcCount": 0
  },
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "content.batches.create",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/content/batches/quote
```http
POST /workspace/content/batches/quote
```
Tag: Platform
Auth: API key
Operation ID: `createWorkspaceContentBatchesQuote`
Estimate generation credits for a bounded content batch without starting work
Estimate generation credits for a bounded content batch without starting work.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/content/batches/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"options":{"carousels":0,"videos":0,"memes":0,"videoMode":"footage","ugcFormat":"before_after","imageSources":["curated"],"imageUrls":["string"]}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "count": 0,
  "actorSetupCredits": 0,
  "animationCredits": 0,
  "orchestrationCredits": 0,
  "voiceCredits": 0,
  "writing": 0,
  "imageCredits": 0,
  "videoCredits": 0,
  "ugcImages": 0,
  "estimatedCredits": 0,
  "generatedImages": 0,
  "ugcCount": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/content/batches/{jobId}
```http
GET /workspace/content/batches/{jobId}
```
Tag: Platform
Auth: API key
Operation ID: `getWorkspaceContentBatchesJobId`
Read a saved batch and its current per-item outcomes
Read a saved batch and its current per-item outcomes.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/content/batches/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runId": "string",
  "triggerRunId": {},
  "requestId": "string",
  "attempt": 0,
  "status": "queued",
  "stage": "queued",
  "completed": 0,
  "failed": 0,
  "count": 0,
  "done": true,
  "failedRun": true,
  "canceled": true,
  "error": {},
  "items": [
    {
      "index": 0,
      "draftId": {},
      "status": "pending",
      "projectId": "string",
      "error": {}
    }
  ],
  "createdAt": "string",
  "completedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/content/batches/{jobId}/retry
```http
POST /workspace/content/batches/{jobId}/retry
```
Tag: Platform
Auth: API key
Operation ID: `createWorkspaceContentBatchesJobIdRetry`
Retry unfinished batch items while retaining successful work
Requires the current expectedAttempt. Repeating it recovers the same next attempt. Up to five attempts; active and unknown workers block retry. May use generation credits for confirmed failed work. No scheduling or publication.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/content/batches/JOB_ID/retry" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"expectedAttempt":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "runId": "string",
  "triggerRunId": {},
  "requestId": "string",
  "attempt": 0,
  "status": "queued",
  "stage": "queued",
  "completed": 0,
  "failed": 0,
  "count": 0,
  "done": true,
  "failedRun": true,
  "canceled": true,
  "error": {},
  "items": [
    {
      "index": 0,
      "draftId": {},
      "status": "pending",
      "projectId": "string",
      "error": {}
    }
  ],
  "createdAt": "string",
  "completedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/content/review
```http
POST /workspace/content/review
```
Tag: Platform
Auth: API key
Operation ID: `createWorkspaceContentReview`
Submit a saved Project revision for review without rendering or publishing
Submit a saved Project revision for review without rendering or publishing.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/content/review" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"projectId":"string","expectedProjectRevision":0,"caption":"string","reason":"string","language":"en"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "draftId": "string",
  "projectId": "string",
  "projectRevision": 0,
  "reviewVersion": 0,
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "content.review.submit",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /workspace/creative-budget
```http
PUT /workspace/creative-budget
```
Tag: Platform
Auth: API key
Operation ID: `replaceWorkspaceCreativeBudget`
Set a revision-checked workspace creative budget or pause
Set a revision-checked workspace creative budget or pause.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/workspace/creative-budget" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"monthlyLimitUsd":0,"paused":true,"expectedRevision":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "revision": 0,
  "monthlyLimitUsd": 0,
  "paused": true,
  "updatedAt": "string",
  "updatedBy": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/creative-usage
```http
GET /workspace/creative-usage
```
Tag: Platform
Auth: API key
Operation ID: `getWorkspaceCreativeUsage`
Read creative spending limits, reservations and reconciled usage
Read creative spending limits, reservations and reconciled usage.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
before | query | no | `object` | -
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/creative-usage" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "periodStart": "string",
  "periodEnd": "string",
  "configured": true,
  "admissionOpen": true,
  "admissionReason": "unconfigured",
  "budget": {
    "revision": 0,
    "monthlyLimitUsd": 0,
    "paused": true,
    "updatedAt": "string",
    "updatedBy": "string"
  },
  "canManageBudget": true,
  "platformLimitUsd": 0,
  "coveredOperations": [
    "research"
  ],
  "workspaceLimitUsd": 0,
  "workspaceRemainingUsd": 0,
  "accountedUsd": 0,
  "reservedUsd": 0,
  "providerReportedUsd": 0,
  "allocatedUpperBoundUsd": 0,
  "retention": {
    "state": "ready",
    "basis": "accrued",
    "estimatedUsd": 0,
    "checkedAt": "string"
  },
  "unresolvedJobs": 0,
  "activeJobs": 0,
  "activeJobLimit": 0,
  "policyVersion": {},
  "entries": [
    {
      "id": "string",
      "jobId": "string",
      "unitId": "string",
      "operation": "research",
      "result": "complete",
      "exposed": true,
      "reservedUsd": 0,
      "accountedUsd": 0,
      "costBasis": "provider_reported",
      "providerReportedUsd": 0,
      "createdAt": "string"
    }
  ],
  "nextCursor": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/credits
```http
GET /workspace/credits
```
Tag: Project Management
Auth: API key
Operation ID: `getWorkspaceCredits`
Get workspace AI credits
Get workspace AI credits.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/credits" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "credits": {
    "maxCredits": 0,
    "usedCredits": 0,
    "remainingCredits": 0,
    "usagePercent": 0,
    "billingPeriodStart": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/hosted-work-quote
```http
GET /workspace/hosted-work-quote
```
Tag: Platform
Auth: API key
Operation ID: `getWorkspaceHostedWorkQuote`
Quote worker and planning costs, excluding generated child jobs
Quote worker and planning costs, excluding generated child jobs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
taskId | query | yes | `string` (completed-clip-export-visual-qa, export-clip-visual-qa, run-workflow, run-interactive-workflow, run-interactive-workflow-step, prompt-to-video, generate-faceless-plan, prepare-faceless-plan-assets, regenerate-faceless-plan-asset, transcribe-video, describe-media, suggest-shorts, generate-broll-suggestions, generate-magic-emojis, generate-title-card, generate-transitions, generate-pro-enhancements, auto-reframe-after-transcribe, process-video, process-video-metadata, extract-video-thumbnail, generate-short-suggestion-thumbnail, generate-media-asset-reframe-analysis, analyze-video, reframe-analysis-prefetch, generate-streaming-proxy, batch-generate-ai-images, generate-content-posts, generate-creative-learning, prepare-creative-map, generate-ugc-video, generate-ai-content) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/hosted-work-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "taskId": "completed-clip-export-visual-qa",
  "excludesChildJobs": true,
  "excludesTranscriptionProvider": true,
  "transcriptionAudio": {
    "maxSourceBytes": 0,
    "maxReadBytes": 0,
    "maxReadRequests": 0,
    "maxConcurrentReads": 0,
    "requestSeconds": 0,
    "maxAudioSeconds": 0,
    "maxPreparedBytes": 0,
    "preparationSeconds": 0
  },
  "transcriptionRecovery": {
    "maxAttempts": 0,
    "maxRequests": 0,
    "maxSeconds": 0,
    "maxResponseBytes": 0,
    "providerMaxUsd": 0,
    "ioMaxUsd": 0
  },
  "maxTranscriptionProviderUsd": 0,
  "maxTranscriptionRequests": 0,
  "streamingProxyIo": {
    "maxSourceBytes": 0,
    "maxReadBytes": 0,
    "maxReadRequests": 0,
    "maxConcurrentReads": 0,
    "requestSeconds": 0,
    "maxOutputBytes": 0,
    "maxOutputFiles": 0,
    "maxOutputFileBytes": 0,
    "maxWriteRequests": 0,
    "probeSeconds": 0,
    "probeOutputBytes": 0
  },
  "cpuAnalysisIo": {
    "maxSourceBytes": 0,
    "maxReadBytes": 0,
    "maxReadRequests": 0,
    "maxConcurrentReads": 0,
    "requestSeconds": 0,
    "maxVideoSeconds": 0,
    "maxFrames": 0,
    "maxFrameBytes": 0,
    "maxPreparedBytes": 0,
    "maxResultBytes": 0,
    "maxFramePixels": 0,
    "preparationSeconds": 0,
    "processOutputBytes": 0
  },
  "qaPreparation": {
    "maximumUsdPerAttempt": 0,
    "includedInMaximumUsd": false,
    "timeoutSeconds": 0,
    "maxReadBytes": 0,
    "maxReadRequests": 0,
    "maxOutputBytes": 0,
    "maxVideoSeconds": 0,
    "maxFrames": 0,
    "policyVersion": "string",
    "expiresAt": "string"
  },
  "modalAnalysis": {
    "io": {},
    "maximumUsd": 0,
    "includedInMaximumUsd": false,
    "maxShards": 0,
    "providerSeconds": 0,
    "requestSeconds": 0,
    "maxSourceSeconds": 0,
    "maxSourceBytes": 0,
    "maxRequestBytes": 0,
    "maxResponseBytes": 0,
    "policyVersion": "string",
    "expiresAt": "string"
  },
  "maxWorkerAttempts": 0,
  "maxPayloadBytes": 0,
  "maxModelCalls": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /workspace/icon
```http
DELETE /workspace/icon
```
Tag: Platform
Auth: API key
Operation ID: `deleteWorkspaceIcon`
Delete workspace icon
Delete workspace icon.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/workspace/icon" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "settings": {
    "id": "string",
    "name": "string",
    "description": {},
    "safeWords": [
      "string"
    ],
    "protected_words": [
      "string"
    ],
    "icon_storage_key": {},
    "icon_url": {},
    "defaults": {
      "aspectRatio": {},
      "aspect_ratio": {},
      "orientation": {},
      "resolution": {},
      "frameRate": {},
      "frame_rate": {},
      "autoManageBroll": {},
      "auto_manage_broll": {},
      "captionThemeId": {},
      "caption_theme_id": {}
    },
    "updated_at": "string"
  },
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/icon/upload/init
```http
POST /workspace/icon/upload/init
```
Tag: Project Management
Auth: API key
Operation ID: `createWorkspaceIconUploadInit`
Initialize a workspace icon upload
Initialize a workspace icon upload.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/icon/upload/init" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"file_name":"string","content_type":"string","file_size_bytes":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "upload_url": "string",
  "icon_storage_key": "string",
  "icon_url": "string",
  "expires_in": 0,
  "instructions": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/intake-quote
```http
GET /workspace/intake-quote
```
Tag: Platform
Auth: API key
Operation ID: `getWorkspaceIntakeQuote`
Read import spending bounds without fetching media
Read import spending bounds without fetching media.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
kind | query | yes | `string` (remote_url, social_metadata, social_import) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/intake-quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "currency": "USD",
  "maximumUsd": 0,
  "estimatedCredits": 0,
  "creditsRemaining": 0,
  "workspaceRemainingUsd": 0,
  "policyVersion": {},
  "expiresAt": "string",
  "retentionDays": 0,
  "allowed": true,
  "reason": {},
  "kind": "remote_url",
  "basis": "allocated_upper_bound",
  "excludesChildJobs": true,
  "excludesRetention": true,
  "stages": [
    {
      "kind": "remote_url",
      "maximumUsd": 0
    }
  ],
  "limits": {
    "kind": "remote_url",
    "timeoutSeconds": 0,
    "downloadSeconds": 0,
    "maxRedirects": 0,
    "maxBytes": 0,
    "maxImageBytes": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge
```http
GET /workspace/knowledge
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledge`
List and search current Markdown knowledge
List and search current Markdown knowledge.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -
search | query | no | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "canEdit": true,
  "canCorrect": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PUT /workspace/knowledge
```http
PUT /workspace/knowledge
```
Tag: Knowledge
Auth: API key
Operation ID: `replaceWorkspaceKnowledge`
Save Markdown at expectedRevision; zero creates a path
Requires Idempotency-Key. Paths are unique per workspace. Owner corrections require the owner role. imports/ snapshots are read-only. Creative direction is limited to 2000 characters; other documents to 65536. Identical retries return the original revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | yes | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PUT "https://blitzreels.com/api/v1/workspace/knowledge" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"string","title":"string","kind":"brief","markdown":"string","expectedRevision":0,"sources":[{"url":"string","title":"string"}],"changeRequest":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "directionChange": {
    "scope": {
      "kind": "brand",
      "seriesId": "string",
      "name": "string"
    },
    "request": "string",
    "before": {
      "title": "string",
      "sources": [
        {}
      ],
      "path": "string",
      "documentId": "string",
      "revision": 0,
      "markdown": "string",
      "contentHash": "string"
    },
    "after": {
      "title": "string",
      "sources": [
        {}
      ],
      "path": "string",
      "documentId": "string",
      "revision": 0,
      "markdown": "string",
      "contentHash": "string"
    }
  },
  "document": {
    "id": "string",
    "path": "string",
    "title": "string",
    "kind": "brief",
    "revision": 0,
    "updatedAt": "string",
    "content": {
      "documentId": "string",
      "revision": 0,
      "title": "string",
      "kind": "brief",
      "markdown": "string",
      "sources": [
        {}
      ],
      "authorUserId": {},
      "origin": "web",
      "sourceRef": {},
      "contentHash": "string",
      "createdAt": "string"
    }
  },
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "string",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/context
```http
GET /workspace/knowledge/context
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeContext`
Read bounded knowledge with owner corrections first
Read bounded knowledge with owner corrections first.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
seriesId | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/context" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "direction": {
    "capturedAt": "string",
    "scope": {
      "kind": "brand",
      "seriesId": "string",
      "name": "string"
    },
    "brand": {
      "title": "string",
      "sources": [
        {}
      ],
      "path": "string",
      "documentId": "string",
      "revision": 0,
      "markdown": "string",
      "contentHash": "string"
    },
    "series": {
      "title": "string",
      "sources": [
        null
      ],
      "path": "string",
      "revision": 0,
      "markdown": "string",
      "contentHash": "string"
    }
  },
  "precedence": [
    "string"
  ],
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string",
      "content": {
        "documentId": "string",
        "revision": 0,
        "title": "string",
        "kind": "brief",
        "markdown": "string",
        "sources": [
          null
        ],
        "authorUserId": {},
        "origin": "web",
        "sourceRef": {},
        "contentHash": "string",
        "createdAt": "string"
      }
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "characterLimit": 0,
  "truncatedDocumentIds": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/documents/{documentId}
```http
GET /workspace/knowledge/documents/{documentId}
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeDocumentsDocumentId`
Read a current or historical knowledge revision
Read a current or historical knowledge revision.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
documentId | path | yes | `string` | -
revision | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/documents/{documentId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "path": "string",
  "title": "string",
  "kind": "brief",
  "revision": 0,
  "updatedAt": "string",
  "content": {
    "documentId": "string",
    "revision": 0,
    "title": "string",
    "kind": "brief",
    "markdown": "string",
    "sources": [
      {
        "url": "string",
        "title": "string"
      }
    ],
    "authorUserId": {},
    "origin": "web",
    "sourceRef": {},
    "contentHash": "string",
    "createdAt": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/documents/{documentId}/export
```http
GET /workspace/knowledge/documents/{documentId}/export
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeDocumentsDocumentIdExport`
Export exact Markdown and its filename
Export exact Markdown and its filename.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
documentId | path | yes | `string` | -
revision | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/documents/{documentId}/export" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "filename": "string",
  "markdown": "string",
  "revision": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/documents/{documentId}/history
```http
GET /workspace/knowledge/documents/{documentId}/history
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeDocumentsDocumentIdHistory`
Read immutable knowledge revision metadata
Read immutable knowledge revision metadata.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
documentId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/documents/{documentId}/history" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "revisions": [
    {
      "documentId": "string",
      "revision": 0,
      "title": "string",
      "kind": "brief",
      "sources": [
        {}
      ],
      "authorUserId": {},
      "origin": "web",
      "sourceRef": {},
      "contentHash": "string",
      "createdAt": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/research
```http
GET /workspace/knowledge/research
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeResearch`
List saved research jobs with bounded workspace summaries
Returns newest jobs first, including jobs started by other workspace agents. status=active filters to queued/running work. Source bodies, private storage keys and internal checkpoints are excluded.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -
status | query | no | `string` (all, active) | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/research" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "jobs": [
    {
      "id": "string",
      "status": "queued",
      "request": {
        "prompt": "string",
        "language": "string",
        "maxSources": 0,
        "maxCredits": 0,
        "social": {}
      },
      "createdAt": "string",
      "updatedAt": "string",
      "diagnostic": {},
      "document": {}
    }
  ],
  "canEdit": true,
  "bounds": {
    "limit": 0,
    "maxLimit": 20,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/knowledge/research
```http
POST /workspace/knowledge/research
```
Tag: Knowledge
Auth: API key
Operation ID: `createWorkspaceKnowledgeResearch`
Start quoted web research and save a cited brief
Requires Idempotency-Key and an unchanged quoteId. Returns a durable job before completion. Identical retries replay admission without repeating paid work. delivery.dispatched only reports queue acknowledgment; inspect the job for results.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | yes | `string` | Retry key for research admission. Repeat the same request and key after disconnect to recover the accepted job. A replay returns current job state without redispatching paid work.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/knowledge/research" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","productUrl":"string","seriesId":"string","language":"string","maxSources":0,"maxCredits":0,"social":{"platform":"tiktok","targetUrl":"string","page":0,"cursor":0},"quoteId":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job": {
    "id": "string",
    "status": "queued",
    "request": {
      "prompt": "string",
      "productUrl": "string",
      "seriesId": "string",
      "language": "string",
      "maxSources": 0,
      "maxCredits": 0,
      "social": {
        "platform": "tiktok",
        "page": 0
      }
    },
    "createdAt": "string",
    "updatedAt": "string",
    "cancelRequested": true,
    "diagnostic": {
      "code": "budget_exhausted",
      "message": "string",
      "retryable": true
    },
    "document": {
      "id": "string",
      "revision": 0
    },
    "captures": [
      {
        "id": "string",
        "sourceUrl": "string",
        "finalUrl": "string",
        "title": "string",
        "capturedAt": "string",
        "sha256": "string",
        "byteLength": 0,
        "contentType": "string",
        "social": {}
      }
    ],
    "socialDiscovery": {
      "provider": "scrapecreators",
      "platform": "tiktok",
      "observedAt": "string",
      "coverage": "public_search",
      "page": 0,
      "returned": 0,
      "omitted": 0,
      "truncated": true,
      "next": {}
    },
    "credits": {
      "limit": 0,
      "completed": 0,
      "reserved": 0,
      "uncertain": 0,
      "remaining": 0
    },
    "steps": [
      {
        "id": "string",
        "kind": "discovery",
        "status": "pending",
        "attempts": 0
      }
    ],
    "canResume": true
  },
  "delivery": {
    "dispatched": true
  },
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "knowledge.research.create",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/knowledge/research/quote
```http
POST /workspace/knowledge/research/quote
```
Tag: Knowledge
Auth: API key
Operation ID: `createWorkspaceKnowledgeResearchQuote`
Quote bounded web research without starting paid work
Fixed credits per attempt. Includes a first-pass ceiling and total budget. Does not reserve balance or a worker slot.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/knowledge/research/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt":"string","productUrl":"string","seriesId":"string","language":"string","maxSources":0,"maxCredits":0,"social":{"platform":"tiktok","targetUrl":"string","page":0,"cursor":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "spending": {
    "id": "string",
    "currency": "USD",
    "firstPassUsd": 0,
    "maximumUsd": 0,
    "policyVersion": "string",
    "retentionDays": 0,
    "workerDispatchLimit": 0,
    "providerAttemptLimit": 0
  },
  "id": "string",
  "rates": {
    "version": "string",
    "discovery": 0,
    "capture": 0,
    "synthesis": 0
  },
  "firstPassCredits": 0,
  "creditLimit": 0,
  "maxSources": 0,
  "maxActiveJobs": 0,
  "canStart": true,
  "blockers": [
    "runtime_unavailable"
  ],
  "billing": "fixed_per_attempt",
  "retriesUseRemainingBudget": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/knowledge/research/{jobId}
```http
GET /workspace/knowledge/research/{jobId}
```
Tag: Knowledge
Auth: API key
Operation ID: `getWorkspaceKnowledgeResearchJobId`
Read research progress, credits, captures and saved brief
Read research progress, credits, captures and saved brief.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/knowledge/research/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "prompt": "string",
    "productUrl": "string",
    "seriesId": "string",
    "language": "string",
    "maxSources": 0,
    "maxCredits": 0,
    "social": {
      "platform": "tiktok",
      "targetUrl": "string",
      "page": 0,
      "cursor": 0
    }
  },
  "createdAt": "string",
  "updatedAt": "string",
  "cancelRequested": true,
  "diagnostic": {
    "code": "budget_exhausted",
    "message": "string",
    "retryable": true
  },
  "document": {
    "id": "string",
    "revision": 0
  },
  "captures": [
    {
      "id": "string",
      "sourceUrl": "string",
      "finalUrl": "string",
      "title": "string",
      "capturedAt": "string",
      "sha256": "string",
      "byteLength": 0,
      "contentType": "string",
      "social": {
        "provider": "scrapecreators",
        "platform": "tiktok",
        "kind": "post",
        "observedAt": "string",
        "metricsSource": "public_research",
        "format": "video",
        "counters": {}
      }
    }
  ],
  "socialDiscovery": {
    "provider": "scrapecreators",
    "platform": "tiktok",
    "observedAt": "string",
    "coverage": "public_search",
    "page": 0,
    "returned": 0,
    "omitted": 0,
    "truncated": true,
    "next": {
      "page": 0
    }
  },
  "credits": {
    "limit": 0,
    "completed": 0,
    "reserved": 0,
    "uncertain": 0,
    "remaining": 0
  },
  "steps": [
    {
      "id": "string",
      "kind": "discovery",
      "status": "pending",
      "sourceUrl": "string",
      "attempts": 0,
      "diagnostic": {}
    }
  ],
  "canResume": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/knowledge/research/{jobId}/cancel
```http
POST /workspace/knowledge/research/{jobId}/cancel
```
Tag: Knowledge
Auth: API key
Operation ID: `createWorkspaceKnowledgeResearchJobIdCancel`
Stop new research work and reconcile accepted charges
Completed or uncertain provider charges are retained. Repeated cancellation is safe.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/knowledge/research/JOB_ID/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job": {
    "id": "string",
    "status": "queued",
    "request": {
      "prompt": "string",
      "productUrl": "string",
      "seriesId": "string",
      "language": "string",
      "maxSources": 0,
      "maxCredits": 0,
      "social": {
        "platform": "tiktok",
        "page": 0
      }
    },
    "createdAt": "string",
    "updatedAt": "string",
    "cancelRequested": true,
    "diagnostic": {
      "code": "budget_exhausted",
      "message": "string",
      "retryable": true
    },
    "document": {
      "id": "string",
      "revision": 0
    },
    "captures": [
      {
        "id": "string",
        "sourceUrl": "string",
        "finalUrl": "string",
        "title": "string",
        "capturedAt": "string",
        "sha256": "string",
        "byteLength": 0,
        "contentType": "string",
        "social": {}
      }
    ],
    "socialDiscovery": {
      "provider": "scrapecreators",
      "platform": "tiktok",
      "observedAt": "string",
      "coverage": "public_search",
      "page": 0,
      "returned": 0,
      "omitted": 0,
      "truncated": true,
      "next": {}
    },
    "credits": {
      "limit": 0,
      "completed": 0,
      "reserved": 0,
      "uncertain": 0,
      "remaining": 0
    },
    "steps": [
      {
        "id": "string",
        "kind": "discovery",
        "status": "pending",
        "attempts": 0
      }
    ],
    "canResume": true
  },
  "delivery": {
    "dispatched": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/knowledge/research/{jobId}/resume
```http
POST /workspace/knowledge/research/{jobId}/resume
```
Tag: Knowledge
Auth: API key
Operation ID: `createWorkspaceKnowledgeResearchJobIdResume`
Resume eligible research using its original remaining budget
Retains accepted prices and inputs. Unknown provider outcomes are not dispatched again. Inspect canResume and diagnostics before requesting recovery.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/knowledge/research/JOB_ID/resume" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job": {
    "id": "string",
    "status": "queued",
    "request": {
      "prompt": "string",
      "productUrl": "string",
      "seriesId": "string",
      "language": "string",
      "maxSources": 0,
      "maxCredits": 0,
      "social": {
        "platform": "tiktok",
        "page": 0
      }
    },
    "createdAt": "string",
    "updatedAt": "string",
    "cancelRequested": true,
    "diagnostic": {
      "code": "budget_exhausted",
      "message": "string",
      "retryable": true
    },
    "document": {
      "id": "string",
      "revision": 0
    },
    "captures": [
      {
        "id": "string",
        "sourceUrl": "string",
        "finalUrl": "string",
        "title": "string",
        "capturedAt": "string",
        "sha256": "string",
        "byteLength": 0,
        "contentType": "string",
        "social": {}
      }
    ],
    "socialDiscovery": {
      "provider": "scrapecreators",
      "platform": "tiktok",
      "observedAt": "string",
      "coverage": "public_search",
      "page": 0,
      "returned": 0,
      "omitted": 0,
      "truncated": true,
      "next": {}
    },
    "credits": {
      "limit": 0,
      "completed": 0,
      "reserved": 0,
      "uncertain": 0,
      "remaining": 0
    },
    "steps": [
      {
        "id": "string",
        "kind": "discovery",
        "status": "pending",
        "attempts": 0
      }
    ],
    "canResume": true
  },
  "delivery": {
    "dispatched": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/knowledge/seed
```http
POST /workspace/knowledge/seed
```
Tag: Knowledge
Auth: API key
Operation ID: `createWorkspaceKnowledgeSeed`
Import missing brand and creative direction briefs once
Import missing brand and creative direction briefs once.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/knowledge/seed" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "documents": [
    {
      "id": "string",
      "path": "string",
      "title": "string",
      "kind": "brief",
      "revision": 0,
      "updatedAt": "string"
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  },
  "canEdit": true,
  "canCorrect": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets
```http
GET /workspace/media/assets
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssets`
List media library assets
List media library assets.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
folder_id | query | no | `string` | -
asset_type | query | no | `string` (video, audio, image, document, all) | -
search | query | no | `string` | -
min_duration_seconds | query | no | `number` | -
orientation | query | no | `string` (landscape, portrait, square) | -
aspect_ratio | query | no | `string` (9:16, 16:9, 1:1, 4:5) | -
sort_by | query | no | `string` (newest, oldest) | -
limit | query | no | `number` | -
offset | query | no | `number` | -
cursor | query | no | `string` | -
include_total | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "assets": [
    {
      "id": "string",
      "name": {},
      "assetType": "string",
      "folderId": {},
      "thumbnailUrl": {},
      "description": {},
      "aiDescription": {},
      "aiTags": [
        "string"
      ],
      "aiMood": {},
      "aiCameraMovement": {},
      "importSource": "string",
      "fileSizeBytes": 0,
      "allowUsingAsBroll": {},
      "processingStatus": {},
      "audioType": {},
      "durationSeconds": {},
      "dimensionsWidth": {},
      "dimensionsHeight": {},
      "orientation": "landscape",
      "createdAt": {}
    }
  ],
  "items": [
    {
      "id": "string",
      "name": {},
      "assetType": "string",
      "folderId": {},
      "thumbnailUrl": {},
      "description": {},
      "aiDescription": {},
      "aiTags": [
        "string"
      ],
      "aiMood": {},
      "aiCameraMovement": {},
      "importSource": "string",
      "fileSizeBytes": 0,
      "allowUsingAsBroll": {},
      "processingStatus": {},
      "audioType": {},
      "durationSeconds": {},
      "dimensionsWidth": {},
      "dimensionsHeight": {},
      "orientation": "landscape",
      "createdAt": {}
    }
  ],
  "count": 0,
  "totalCount": {},
  "total_count_exact": true,
  "limit": 0,
  "offset": 0,
  "next_cursor": {},
  "has_more": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/batch-delete
```http
POST /workspace/media/assets/batch-delete
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsBatchDelete`
Delete selected workspace media assets
Delete selected workspace media assets.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/batch-delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["string"],"search":"string","name_prefix":"string","confirm_delete":true,"dry_run":true,"reason":"string","delete_generated_clips":true,"delete_linked_projects":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "selected_count": 0,
  "deleted_count": 0,
  "selected_ids": [
    "string"
  ],
  "deleted_ids": [
    "string"
  ],
  "failed_count": 0,
  "failed_items": [
    {
      "id": "string",
      "error": "string"
    }
  ],
  "impact": {
    "linked_project_count": 0,
    "linked_projects": [
      {
        "id": "string",
        "name": "string"
      }
    ],
    "generated_clip_count": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/move
```http
POST /workspace/media/assets/move
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsMove`
Move media assets to a folder
Move media assets to a folder.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/move" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"asset_ids":["string"],"target_folder_id":{}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "moved_count": 0,
  "target_folder_id": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}
```http
GET /workspace/media/assets/{assetId}
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetId`
Get media asset details
Get media asset details.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset": {
    "sourceFile": {
      "hash": "string",
      "bytes": 0,
      "mimeType": "string"
    },
    "streaming_proxy": {
      "status": "not_requested",
      "available": true,
      "manifest_url": {},
      "run_id": {},
      "recovery": {}
    },
    "id": "string",
    "name": "string",
    "assetType": "video",
    "thumbnailUrl": {},
    "fileUrl": {},
    "description": {},
    "aiDescription": {},
    "aiTags": [
      "string"
    ],
    "aiMood": {},
    "aiCameraMovement": {},
    "audioType": {},
    "importSource": "string",
    "waveformPeaks": [
      0
    ],
    "fileSizeBytes": 0,
    "processingStatus": {},
    "processingSubstage": {},
    "processingError": {},
    "processingErrors": {},
    "processingAttempts": 0,
    "retryable": true,
    "providerRequestIds": {
      "processJobRunId": {},
      "transcribeJobRunId": {},
      "providerRequestId": {}
    },
    "processing_substage": {},
    "processing_error": {},
    "processing_errors": {},
    "processing_attempts": 0,
    "provider_request_ids": {
      "process_job_run_id": {},
      "transcribe_job_run_id": {},
      "provider_request_id": {}
    },
    "durationSeconds": {},
    "dimensionsWidth": {},
    "dimensionsHeight": {},
    "allowUsingAsBroll": true,
    "folderName": {},
    "recordingSetId": {},
    "recording_set_id": {}
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /workspace/media/assets/{assetId}
```http
PATCH /workspace/media/assets/{assetId}
```
Tag: Media Library
Auth: API key
Operation ID: `updateWorkspaceMediaAssetsAssetId`
Update a media asset
Update a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","folder_id":{},"allow_using_as_broll":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "asset": {
    "id": "string",
    "name": "string",
    "description": {},
    "folderId": {},
    "allowUsingAsBroll": true,
    "updatedAt": "string"
  },
  "txid": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/clipping-status
```http
GET /workspace/media/assets/{assetId}/clipping-status
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdClippingStatus`
Get clipping readiness and canonical duration for an asset
Get clipping readiness and canonical duration for an asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
project_id | query | no | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/clipping-status" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "project_id": {},
  "media_processing_status": {},
  "processing": {
    "processing_status": {},
    "processing_substage": {},
    "processing_error": {},
    "processing_errors": {},
    "processing_attempts": 0,
    "retryable": true,
    "provider_request_ids": {
      "process_job_run_id": {},
      "transcribe_job_run_id": {},
      "provider_request_id": {}
    }
  },
  "transcript_status": {},
  "transcript_word_count": 0,
  "captions_status": "not_requested",
  "short_suggestions_status": "missing",
  "suggestion_outcome": {
    "run_id": "string",
    "suggestion_count": 0,
    "no_clip_reason": {}
  },
  "suggestion_counts": {
    "drafts": 0,
    "saved": 0,
    "total": 0
  },
  "durations": {
    "asset_reported_duration_seconds": {},
    "transcript_duration_seconds": {},
    "max_suggestion_end_seconds": {},
    "project_timeline_duration_seconds": {},
    "canonical_duration_seconds": {},
    "consistency": "consistent"
  },
  "readiness": {
    "transcript_ready": true,
    "suggestions_ready": true,
    "captions_ready": true,
    "ready_to_apply": true,
    "ready_to_export": true
  },
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/delete
```http
POST /workspace/media/assets/{assetId}/delete
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdDelete`
Delete a media asset
Delete a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/delete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/narration
```http
GET /workspace/media/assets/{assetId}/narration
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdNarration`
Read retained narration inputs, audio identity and paginated word timing
Read retained narration inputs, audio identity and paginated word timing.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/narration" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "assetId": "string",
  "take": {
    "requestFingerprint": "string",
    "preparedRequest": {
      "version": 1,
      "provider": "elevenlabs",
      "voiceId": "string",
      "body": {},
      "processing": {}
    },
    "timingSource": "provider",
    "durationSeconds": 0,
    "durationSource": "decoded",
    "audio": {
      "sha256": "string",
      "bytes": 0,
      "contentType": "audio/mpeg"
    }
  },
  "wordTimings": [
    {
      "word": "string",
      "startSeconds": 0,
      "endSeconds": 0,
      "index": 0
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/reframe-analysis
```http
GET /workspace/media/assets/{assetId}/reframe-analysis
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdReframeAnalysis`
Get automatic layout analysis status for a media asset
Get automatic layout analysis status for a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-analysis" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "status": "missing",
  "analysis_version": {},
  "error_message": {},
  "primary_classification": "unknown",
  "classification_confidence": {},
  "fallback_template_key": "manual",
  "dominant_speaker_side": "left",
  "frames_analyzed": {},
  "low_confidence": {}
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/reframe-analysis
```http
POST /workspace/media/assets/{assetId}/reframe-analysis
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdReframeAnalysis`
Queue or confirm automatic layout analysis for a media asset
Queue or confirm automatic layout analysis for a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-analysis" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "asset_id": "string",
  "status": "missing",
  "run_id": {},
  "analysis_version": {},
  "triggered": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/reframe-plan
```http
POST /workspace/media/assets/{assetId}/reframe-plan
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdReframePlan`
Generate an inspectable automatic layout plan for a media asset
Generate an inspectable automatic layout plan for a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-plan" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":{},"aspect_ratio":"9:16","trim_start_seconds":0,"trim_end_seconds":0,"content_type_hint":"auto","layout_strategy":"auto"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "project_id": {},
  "aspect_ratio": "9:16",
  "trim_start_seconds": 0,
  "trim_end_seconds": 0,
  "analysis": {
    "status": "missing",
    "analysis_version": {},
    "error_message": {},
    "primary_classification": "unknown",
    "classification_confidence": {},
    "fallback_template_key": "manual",
    "dominant_speaker_side": "left",
    "frames_analyzed": {},
    "low_confidence": {}
  },
  "layout_summary": {
    "primary_layout": "manual",
    "layouts_used": [
      "manual"
    ],
    "segment_count": 0,
    "split_segment_count": 0,
    "focus_segment_count": 0,
    "letterbox_segment_count": 0,
    "fallback_segment_count": 0
  },
  "segments": [
    {
      "segment_key": "string",
      "layout_key": "manual",
      "trim_start_seconds": 0,
      "trim_end_seconds": 0,
      "output_start_seconds": 0,
      "output_duration_seconds": 0,
      "confidence": {},
      "fallback_reason": {},
      "notes": [
        "string"
      ],
      "views": [
        {}
      ]
    }
  ],
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/reframe-plan/apply
```http
POST /workspace/media/assets/{assetId}/reframe-plan/apply
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdReframePlanApply`
Apply an automatic layout plan to a project timeline
Apply an automatic layout plan to a project timeline.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-plan/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":"string","expected_revision":0,"replace_timeline_item_id":{},"aspect_ratio":"9:16","trim_start_seconds":0,"trim_end_seconds":0,"content_type_hint":"auto","layout_strategy":"auto"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "asset_id": "string",
  "project_id": "string",
  "reframe_id": "string",
  "timeline_item_id": "string",
  "primary_timeline_item_id": "string",
  "timeline_item_ids": [
    "string"
  ],
  "base_revision": 0,
  "revision": 0,
  "aspect_ratio": "9:16",
  "analysis": {
    "status": "missing",
    "analysis_version": {},
    "error_message": {},
    "primary_classification": "unknown",
    "classification_confidence": {},
    "fallback_template_key": "manual",
    "dominant_speaker_side": "left",
    "frames_analyzed": {},
    "low_confidence": {}
  },
  "layout_summary": {
    "primary_layout": "manual",
    "layouts_used": [
      "manual"
    ],
    "segment_count": 0,
    "split_segment_count": 0,
    "focus_segment_count": 0,
    "letterbox_segment_count": 0,
    "fallback_segment_count": 0
  },
  "segments": [
    {
      "segment_key": "string",
      "layout_key": "manual",
      "trim_start_seconds": 0,
      "trim_end_seconds": 0,
      "output_start_seconds": 0,
      "output_duration_seconds": 0,
      "confidence": {},
      "fallback_reason": {},
      "notes": [
        "string"
      ],
      "views": [
        {}
      ]
    }
  ],
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/reframe-plan/preview
```http
POST /workspace/media/assets/{assetId}/reframe-plan/preview
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdReframePlanPreview`
Generate an automatic layout plan plus preview frames before apply
Generate an automatic layout plan plus preview frames before apply.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-plan/preview" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":"string","aspect_ratio":"9:16","trim_start_seconds":0,"trim_end_seconds":0,"content_type_hint":"auto","layout_strategy":"auto","preview_times_seconds":[0],"target_width":0,"image_format":"jpeg"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "project_id": {},
  "aspect_ratio": "9:16",
  "trim_start_seconds": 0,
  "trim_end_seconds": 0,
  "analysis": {
    "status": "missing",
    "analysis_version": {},
    "error_message": {},
    "primary_classification": "unknown",
    "classification_confidence": {},
    "fallback_template_key": "manual",
    "dominant_speaker_side": "left",
    "frames_analyzed": {},
    "low_confidence": {}
  },
  "layout_summary": {
    "primary_layout": "manual",
    "layouts_used": [
      "manual"
    ],
    "segment_count": 0,
    "split_segment_count": 0,
    "focus_segment_count": 0,
    "letterbox_segment_count": 0,
    "fallback_segment_count": 0
  },
  "segments": [
    {
      "segment_key": "string",
      "layout_key": "manual",
      "trim_start_seconds": 0,
      "trim_end_seconds": 0,
      "output_start_seconds": 0,
      "output_duration_seconds": 0,
      "confidence": {},
      "fallback_reason": {},
      "notes": [
        "string"
      ],
      "views": [
        {}
      ]
    }
  ],
  "warnings": [
    "string"
  ],
  "previews": [
    {
      "preview_url": "string",
      "expires_at": "string",
      "storage_key": "string",
      "frame": 0,
      "time_seconds": 0,
      "width": 0,
      "height": 0,
      "image_format": "jpeg"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/reframe-preflight
```http
GET /workspace/media/assets/{assetId}/reframe-preflight
```
Tag: Media Library
Auth: API key
Operation ID: `getMediaReframePreflight`
Assess source resolution and a full-source fallback without starting billable work
Assess source resolution and a full-source fallback without starting billable work.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
aspect_ratio | query | yes | `string` (9:16, 16:9, 1:1, 4:5) | -
resolution | query | yes | `string` (720p, 1080p, 4k) | -
crop_width | query | no | `number` | -
crop_height | query | no | `number` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/reframe-preflight" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "status": "native_resolution",
  "source": {
    "width": 0,
    "height": 0
  },
  "output": {
    "width": 0,
    "height": 0
  },
  "cover_crop_pixels": {
    "width": 0,
    "height": 0
  },
  "upscale_factor": {},
  "requested_crop": {
    "width": 0,
    "height": 0
  },
  "subject_detection_performed": false,
  "billable_work_started": false,
  "fallback": {
    "layout_mode": "preserve_full_source",
    "content_pixels": {
      "width": 0,
      "height": 0
    },
    "upscale_factor": {}
  },
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/short-suggestions
```http
GET /workspace/media/assets/{assetId}/short-suggestions
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdShortSuggestions`
List native short suggestions for an asset
List native short suggestions for an asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/short-suggestions" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "saved": [
    {
      "id": "string",
      "status": "saved",
      "title": "string",
      "hook": "string",
      "transcript_excerpt": "string",
      "call_to_action": {},
      "start_seconds": 0,
      "end_seconds": 0,
      "duration_seconds": 0,
      "ai_run_id": {},
      "metadata": {},
      "score": {},
      "created_at": "string",
      "updated_at": "string",
      "thumbnail_url": {},
      "thumbnail_expires_at": {}
    }
  ],
  "drafts": [
    {
      "id": "string",
      "status": "saved",
      "title": "string",
      "hook": "string",
      "transcript_excerpt": "string",
      "call_to_action": {},
      "start_seconds": 0,
      "end_seconds": 0,
      "duration_seconds": 0,
      "ai_run_id": {},
      "metadata": {},
      "score": {},
      "created_at": "string",
      "updated_at": "string",
      "thumbnail_url": {},
      "thumbnail_expires_at": {}
    }
  ],
  "bounds": {
    "collections": [
      {
        "name": "saved",
        "offset": 0,
        "limit": 0,
        "total": 0,
        "returned": 0,
        "hasMore": true,
        "truncated": true
      }
    ]
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/short-suggestions
```http
POST /workspace/media/assets/{assetId}/short-suggestions
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdShortSuggestions`
Generate native short suggestions for an asset
Generate native short suggestions for an asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/short-suggestions" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"content_profile":"auto","auto_trim_silence":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "run_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/apply
```http
POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/apply
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdShortSuggestionsSuggestionIdApply`
Apply a short suggestion to a project timeline
Apply a short suggestion to a project timeline.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
suggestionId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/short-suggestions/{suggestionId}/apply" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"project_id":"string","caption_style_id":{},"mark_saved":true,"allow_unverified_export":true,"automatic_layout":{"enabled":true,"content_type_hint":"auto","layout_strategy":"auto","aspect_ratio_override":"9:16"}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "project_id": "string",
  "asset_id": "string",
  "suggestion_id": "string",
  "suggestion_status": "saved",
  "timeline_item_id": "string",
  "trim_start_seconds": 0,
  "trim_end_seconds": 0,
  "duration_seconds": 0,
  "source_duration_seconds": 0,
  "captions_added": 0,
  "caption_style_id": {},
  "automatic_layout_attempted": true,
  "automatic_layout_applied": true,
  "automatic_layout_fallback_used": true,
  "speaker_aware_applied": true,
  "visual_qa_status": "not_required",
  "visual_qa_required": true,
  "visual_qa_passed": true,
  "preview_frame_count": 0,
  "qa_bypassed": true,
  "visual_qa": {
    "summary": "string",
    "issues": [
      {}
    ],
    "suggested_next_edits": [
      "string"
    ],
    "confidence": 0,
    "previews": [
      {}
    ],
    "visual_debug": {}
  },
  "primary_layout": "manual",
  "analysis_status": "missing",
  "analysis_version": {},
  "layout_summary": {
    "primary_layout": "manual",
    "layouts_used": [
      "manual"
    ],
    "segment_count": 0,
    "split_segment_count": 0,
    "focus_segment_count": 0,
    "letterbox_segment_count": 0,
    "fallback_segment_count": 0
  },
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/thumbnail
```http
POST /workspace/media/assets/{assetId}/short-suggestions/{suggestionId}/thumbnail
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaAssetsAssetIdShortSuggestionsSuggestionIdThumbnail`
Regenerate a short suggestion thumbnail
Regenerate a short suggestion thumbnail.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
suggestionId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/short-suggestions/{suggestionId}/thumbnail" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "suggestion_id": "string",
  "status": "queued",
  "run_id": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/transcript
```http
GET /workspace/media/assets/{assetId}/transcript
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdTranscript`
Get media asset transcript
Get media asset transcript.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/transcript" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "assetId": "string",
  "status": {},
  "wordCount": {},
  "lastGeneratedAt": {},
  "text": "string",
  "segments": [
    {
      "text": "string",
      "start": 0,
      "end": 0,
      "speakerLabel": {}
    }
  ],
  "bounds": {
    "limit": 0,
    "offset": 0,
    "total": 0,
    "returned": 0,
    "hasMore": true,
    "truncated": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/upscale
```http
GET /workspace/media/assets/{assetId}/upscale
```
Tag: Media Library
Auth: API key
Operation ID: `getMediaVideoUpscaleEstimate`
Estimate ByteDance video upscale credits. Returns eligible=false when the asset cannot be upscaled; does not spend credits.
Estimate ByteDance video upscale credits. Returns eligible=false when the asset cannot be upscaled; does not spend credits.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -
target_resolution | query | yes | `string` (1080p, 4k) | -
project_id | query | no | `object` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/upscale" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "eligible": true,
  "ineligible_reason": {},
  "target_resolution": "1080p",
  "target_fps": "30fps",
  "credits_required": 0,
  "duration_seconds": 0,
  "source_long_edge": 0,
  "target_long_edge": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/assets/{assetId}/upscale
```http
POST /workspace/media/assets/{assetId}/upscale
```
Tag: Media Library
Auth: API key
Operation ID: `createMediaVideoUpscale`
Queue a ByteDance upscale of a stored video asset
Queue a ByteDance upscale of a stored video asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/upscale" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target_resolution":"1080p","project_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "source_asset_id": "string",
  "target_resolution": "1080p",
  "credits_required": 0,
  "run_id": "string",
  "status": "queued"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{assetId}/verify
```http
GET /workspace/media/assets/{assetId}/verify
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaAssetsAssetIdVerify`
Verify a media asset storage object
Verify a media asset storage object.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
assetId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/ASSET_ID/verify" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "processing_status": "string",
  "storage_provider": "string",
  "storage_object": "present",
  "ready_for_download": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/assets/{asset_id}/clip-batch
```http
GET /workspace/media/assets/{asset_id}/clip-batch
```
Tag: Clip Creation
Auth: API key
Operation ID: `getLatestClipBatchForAsset`
Get the latest clip batch for a media asset
Get the latest clip batch for a media asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
asset_id | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/assets/{asset_id}/clip-batch" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "batch": {
    "batch_id": "string",
    "status": "string",
    "asset_id": "string",
    "project_folder_id": {},
    "estimated_clip_count": 0,
    "total_clip_count": 0,
    "rendered_count": 0,
    "failed_count": 0,
    "review_count": 0,
    "activity": {},
    "clips": [
      {}
    ],
    "zip_download_url": {},
    "last_error_message": {},
    "studio_sound": {
      "requested": true,
      "status": "disabled",
      "source_asset_id": {},
      "enhanced_asset_id": {},
      "version": {},
      "processing_run_id": {},
      "error_message": {}
    }
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/captures
```http
GET /workspace/media/captures
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaCaptures`
List saved screenshot jobs
List saved screenshot jobs.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
limit | query | no | `integer` | -
offset | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/captures" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "jobs": [
    {
      "id": "string",
      "status": "queued",
      "request": {
        "url": "string",
        "viewport": {},
        "fullPage": true,
        "settleMs": 0,
        "maxCredits": 0
      },
      "attempts": 0,
      "creditsCommitted": 0,
      "remainingCredits": 0,
      "canResume": true,
      "asset": {},
      "diagnostic": {},
      "createdAt": "string",
      "updatedAt": "string"
    }
  ],
  "hasMore": true,
  "nextOffset": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/captures
```http
POST /workspace/media/captures
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaCaptures`
Start a quoted screenshot job and retain a workspace image
Requires Idempotency-Key. Capture settings and credits per attempt are frozen. Retries consume the remaining maximum credits; recovery reuses saved bytes. No login cookies or credentials are accepted.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/captures" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"request":{"url":"string","viewport":{"width":0,"height":0},"fullPage":true,"readySelector":"string","settleMs":0,"maxCredits":0},"quoteId":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "job": {
    "id": "string",
    "status": "queued",
    "request": {
      "url": "string",
      "viewport": {
        "width": 0,
        "height": 0
      },
      "fullPage": true,
      "readySelector": "string",
      "settleMs": 0,
      "maxCredits": 0
    },
    "attempts": 0,
    "creditsCommitted": 0,
    "remainingCredits": 0,
    "canResume": true,
    "asset": {
      "assetId": "string",
      "sha256": "string",
      "bytes": 0,
      "width": 0,
      "height": 0,
      "sourceUrl": "string",
      "finalUrl": "string",
      "capturedAt": "string"
    },
    "diagnostic": {
      "code": "source_blocked",
      "message": "string",
      "retryable": true
    },
    "createdAt": "string",
    "updatedAt": "string"
  },
  "dispatched": true,
  "replayed": true,
  "receiptId": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/captures/quote
```http
POST /workspace/media/captures/quote
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaCapturesQuote`
Quote a public website screenshot without starting browser work
Quote a public website screenshot without starting browser work.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/captures/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"string","viewport":{"width":0,"height":0},"fullPage":true,"readySelector":"string","settleMs":0,"maxCredits":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "creditsPerAttempt": 0,
  "maxCredits": 0,
  "canStart": true,
  "blockers": [
    "runtime_unavailable"
  ],
  "runtimeId": "string",
  "maxActiveJobs": 0,
  "spending": {
    "id": "string",
    "currency": "USD",
    "firstPassUsd": 0,
    "maximumUsd": 0,
    "policyVersion": "string",
    "retentionDays": 0,
    "workerDispatchLimit": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/captures/{jobId}
```http
GET /workspace/media/captures/{jobId}
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaCapturesJobId`
Read screenshot progress, budget, diagnostics and retained asset
Read screenshot progress, budget, diagnostics and retained asset.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/captures/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "url": "string",
    "viewport": {
      "width": 0,
      "height": 0
    },
    "fullPage": true,
    "readySelector": "string",
    "settleMs": 0,
    "maxCredits": 0
  },
  "attempts": 0,
  "creditsCommitted": 0,
  "remainingCredits": 0,
  "canResume": true,
  "asset": {
    "assetId": "string",
    "sha256": "string",
    "bytes": 0,
    "width": 0,
    "height": 0,
    "sourceUrl": "string",
    "finalUrl": "string",
    "capturedAt": "string"
  },
  "diagnostic": {
    "code": "source_blocked",
    "message": "string",
    "retryable": true
  },
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/captures/{jobId}/cancel
```http
POST /workspace/media/captures/{jobId}/cancel
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaCapturesJobIdCancel`
Cancel screenshot work while retaining completed image bytes
Cancel screenshot work while retaining completed image bytes.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/captures/JOB_ID/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "url": "string",
    "viewport": {
      "width": 0,
      "height": 0
    },
    "fullPage": true,
    "readySelector": "string",
    "settleMs": 0,
    "maxCredits": 0
  },
  "attempts": 0,
  "creditsCommitted": 0,
  "remainingCredits": 0,
  "canResume": true,
  "asset": {
    "assetId": "string",
    "sha256": "string",
    "bytes": 0,
    "width": 0,
    "height": 0,
    "sourceUrl": "string",
    "finalUrl": "string",
    "capturedAt": "string"
  },
  "diagnostic": {
    "code": "source_blocked",
    "message": "string",
    "retryable": true
  },
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/captures/{jobId}/resume
```http
POST /workspace/media/captures/{jobId}/resume
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaCapturesJobIdResume`
Recover a screenshot or explicitly retry within its remaining budget
Recover a screenshot or explicitly retry within its remaining budget.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/captures/JOB_ID/resume" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "status": "queued",
  "request": {
    "url": "string",
    "viewport": {
      "width": 0,
      "height": 0
    },
    "fullPage": true,
    "readySelector": "string",
    "settleMs": 0,
    "maxCredits": 0
  },
  "attempts": 0,
  "creditsCommitted": 0,
  "remainingCredits": 0,
  "canResume": true,
  "asset": {
    "assetId": "string",
    "sha256": "string",
    "bytes": 0,
    "width": 0,
    "height": 0,
    "sourceUrl": "string",
    "finalUrl": "string",
    "capturedAt": "string"
  },
  "diagnostic": {
    "code": "source_blocked",
    "message": "string",
    "retryable": true
  },
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/media/folders
```http
GET /workspace/media/folders
```
Tag: Media Library
Auth: API key
Operation ID: `getWorkspaceMediaFolders`
List media folders
List media folders.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
parent_folder_id | query | no | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/media/folders" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "folders": [
    {
      "id": "string",
      "name": "string",
      "parentFolderId": {},
      "description": {},
      "iconType": {},
      "assetCount": 0,
      "createdAt": {}
    }
  ],
  "count": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/folders
```http
POST /workspace/media/folders
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaFolders`
Create a media folder
Create a media folder.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/folders" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","parent_folder_id":{},"description":"string","icon_type":"folder"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "folder": {
    "id": "string",
    "name": "string",
    "parentFolderId": {},
    "description": {},
    "iconType": {}
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /workspace/media/folders/{folderId}
```http
PATCH /workspace/media/folders/{folderId}
```
Tag: Media Library
Auth: API key
Operation ID: `updateWorkspaceMediaFoldersFolderId`
Update a media folder
Update a media folder.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
folderId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/workspace/media/folders/{folderId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","parent_folder_id":{},"description":"string","icon_type":"folder"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "folder": {
    "id": "string",
    "name": "string",
    "parentFolderId": {},
    "description": {},
    "iconType": {}
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### DELETE /workspace/media/folders/{folderId}
```http
DELETE /workspace/media/folders/{folderId}
```
Tag: Media Library
Auth: API key
Operation ID: `deleteWorkspaceMediaFoldersFolderId`
Delete a media folder
Delete a media folder.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
folderId | path | yes | `string` | -
cascade | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X DELETE "https://blitzreels.com/api/v1/workspace/media/folders/{folderId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/folders/{folderId}/empty
```http
POST /workspace/media/folders/{folderId}/empty
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaFoldersFolderIdEmpty`
Delete every media asset in a folder without deleting it
Delete every media asset in a folder without deleting it.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
folderId | path | yes | `string` | -

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/folders/{folderId}/empty" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"confirm_delete":true,"dry_run":true,"reason":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "success": true,
  "dry_run": true,
  "selected_count": 0,
  "deleted_count": 0,
  "selected_ids": [
    "string"
  ],
  "deleted_ids": [
    "string"
  ],
  "failed_count": 0,
  "failed_items": [
    {
      "id": "string",
      "error": "string"
    }
  ],
  "impact": {
    "linked_project_count": 0,
    "linked_projects": [
      {
        "id": "string",
        "name": "string"
      }
    ],
    "generated_clip_count": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/import/google-drive
```http
POST /workspace/media/import/google-drive
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaImportGoogleDrive`
Import a Google Drive video into workspace media library
Import a Google Drive video into workspace media library.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/import/google-drive" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"string","folder_id":"string","short_suggestion_content_profile":"auto","auto_trim_silence":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "status": "processing",
  "provider": "google_drive",
  "run_id": {},
  "txid": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/import/youtube
```http
POST /workspace/media/import/youtube
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaImportYoutube`
Import a YouTube video into workspace media library
Import a YouTube video into workspace media library.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/import/youtube" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"string","folder_id":"string","quality":"144p","fps":0,"audio_language":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset_id": "string",
  "status": "processing",
  "quality": "144p",
  "run_id": {},
  "txid": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/finalize
```http
POST /workspace/media/upload/finalize
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadFinalize`
Finalize a media upload after presigned PUT
Finalize a media upload after presigned PUT.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | no | `string` | Retry key (8-200 characters). Reusing it with identical input returns the original response; different input returns 409.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/finalize" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key":"string","file_name":"string","content_type":"string","file_size_bytes":0,"content_hash_sha256":"string","auto_process_enabled":true,"auto_transcribe":true,"auto_describe_after_transcribe":true,"auto_suggest_shorts":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "asset_type": "string",
  "content_hash_sha256": "string",
  "file_size_bytes": 0,
  "mime_type": "string",
  "processing_status": "string",
  "processing_run_id": {},
  "deduped": true,
  "follow_up": {
    "transcription_requested": true,
    "description_requested": true,
    "short_suggestions_requested": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/init
```http
POST /workspace/media/upload/init
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadInit`
Initialize a presigned media upload
Initialize a presigned media upload.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/init" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"file_name":"string","content_type":"string","file_size_bytes":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "upload_url": "string",
  "storage_key": "string",
  "expires_in": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/multipart/abort
```http
POST /workspace/media/upload/multipart/abort
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadMultipartAbort`
Abort a multipart media upload
Abort a multipart media upload.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/multipart/abort" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key":"string","upload_id":"string"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "aborted": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/multipart/complete
```http
POST /workspace/media/upload/multipart/complete
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadMultipartComplete`
Complete a multipart media upload
Complete a multipart media upload.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/multipart/complete" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key":"string","upload_id":"string","parts":[{"etag":"string","part_number":0}]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "completed": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/multipart/init
```http
POST /workspace/media/upload/multipart/init
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadMultipartInit`
Initialize a multipart media upload
Initialize a multipart media upload.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/multipart/init" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"file_name":"string","content_type":"string","file_size_bytes":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "storage_key": "string",
  "upload_id": "string",
  "part_size_bytes": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/media/upload/multipart/parts
```http
POST /workspace/media/upload/multipart/parts
```
Tag: Media Library
Auth: API key
Operation ID: `createWorkspaceMediaUploadMultipartParts`
Create multipart media upload part URLs
Create multipart media upload part URLs.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/media/upload/multipart/parts" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"storage_key":"string","upload_id":"string","part_numbers":[0]}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "parts": [
    {
      "part_number": 0,
      "upload_url": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/members
```http
GET /workspace/members
```
Tag: Project Management
Auth: API key
Operation ID: `getWorkspaceMembers`
List workspace members
List workspace members.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/members" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "members": [
    {
      "userId": "string",
      "email": "string",
      "displayName": {},
      "role": "string",
      "joinedAt": {}
    }
  ],
  "count": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/recipes/jobs
```http
POST /workspace/recipes/jobs
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createWorkspaceRecipesJobs`
Save or copy a recipe using an accepted quote and Idempotency-Key; retry the same request to recover delivery
Save or copy a recipe using an accepted quote and Idempotency-Key; retry the same request to recover delivery.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
Idempotency-Key | header | yes | `string` | Recipe admission retry key. Identical inputs recover the same job and charge; changed inputs conflict. The receipt covers admission, not completion.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/recipes/jobs" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"request":{"kind":"capture","value":{"projectId":"string","expectedProjectRevision":0,"expectedVersion":0,"makeReusable":true}},"limits":{"transferBytes":0,"storageBytes":0,"operations":0,"r2Requests":0},"quoteId":"string","maxCredits":0}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "status": "queued",
  "attempts": 0,
  "output": {
    "kind": "capture",
    "projectId": "string",
    "projectRevision": 0,
    "templateRevisionId": "string",
    "version": 0
  },
  "diagnostic": {
    "code": "string",
    "message": "string"
  },
  "billing": {
    "quote": {
      "creditUnitVersion": 2,
      "id": "string",
      "organizationId": "string",
      "userId": "string",
      "requestHash": "string",
      "limits": {},
      "rates": {},
      "currency": "USD",
      "basis": "allocated_estimate",
      "execution": {},
      "estimate": {},
      "reserveCredits": 0
    },
    "maxCredits": 0,
    "hold": "pending",
    "exposed": true,
    "releasedCredits": 0
  },
  "transfers": {
    "charged": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "confirmed": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "pendingOperations": 0
  },
  "storage": {
    "objects": 0,
    "allocatedBytes": 0,
    "retainedBytes": 0,
    "unconfirmedBytes": 0,
    "releasedBytes": 0
  },
  "delivery": {
    "generation": 0,
    "dispatchAttempts": 0,
    "acknowledged": true,
    "blocked": true
  },
  "createdAt": "string",
  "updatedAt": "string",
  "mutationReceipt": {
    "id": "string",
    "key": "string",
    "operation": "templates.jobs.create",
    "status": "completed",
    "replayed": true
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/recipes/jobs/{jobId}
```http
GET /workspace/recipes/jobs/{jobId}
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `getWorkspaceRecipesJobsJobId`
Read recipe progress, saved output and bounded cost summary
Read recipe progress, saved output and bounded cost summary.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/recipes/jobs/JOB_ID" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "status": "queued",
  "attempts": 0,
  "output": {
    "kind": "capture",
    "projectId": "string",
    "projectRevision": 0,
    "templateRevisionId": "string",
    "version": 0
  },
  "diagnostic": {
    "code": "string",
    "message": "string"
  },
  "billing": {
    "quote": {
      "creditUnitVersion": 2,
      "id": "string",
      "organizationId": "string",
      "userId": "string",
      "requestHash": "string",
      "limits": {},
      "rates": {},
      "currency": "USD",
      "basis": "allocated_estimate",
      "execution": {},
      "estimate": {},
      "reserveCredits": 0
    },
    "maxCredits": 0,
    "hold": "pending",
    "exposed": true,
    "releasedCredits": 0
  },
  "transfers": {
    "charged": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "confirmed": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "pendingOperations": 0
  },
  "storage": {
    "objects": 0,
    "allocatedBytes": 0,
    "retainedBytes": 0,
    "unconfirmedBytes": 0,
    "releasedBytes": 0
  },
  "delivery": {
    "generation": 0,
    "dispatchAttempts": 0,
    "acknowledged": true,
    "blocked": true
  },
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/recipes/jobs/{jobId}/cancel
```http
POST /workspace/recipes/jobs/{jobId}/cancel
```
Tag: Exports and Jobs
Auth: API key
Operation ID: `createWorkspaceRecipesJobsJobIdCancel`
Stop new recipe work; completed copies and exposed charges remain
Stop new recipe work; completed copies and exposed charges remain.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
jobId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/recipes/jobs/JOB_ID/cancel" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "projectId": "string",
  "status": "queued",
  "attempts": 0,
  "output": {
    "kind": "capture",
    "projectId": "string",
    "projectRevision": 0,
    "templateRevisionId": "string",
    "version": 0
  },
  "diagnostic": {
    "code": "string",
    "message": "string"
  },
  "billing": {
    "quote": {
      "creditUnitVersion": 2,
      "id": "string",
      "organizationId": "string",
      "userId": "string",
      "requestHash": "string",
      "limits": {},
      "rates": {},
      "currency": "USD",
      "basis": "allocated_estimate",
      "execution": {},
      "estimate": {},
      "reserveCredits": 0
    },
    "maxCredits": 0,
    "hold": "pending",
    "exposed": true,
    "releasedCredits": 0
  },
  "transfers": {
    "charged": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "confirmed": {
      "transferBytes": 0,
      "storageBytes": 0,
      "operations": 0
    },
    "pendingOperations": 0
  },
  "storage": {
    "objects": 0,
    "allocatedBytes": 0,
    "retainedBytes": 0,
    "unconfirmedBytes": 0,
    "releasedBytes": 0
  },
  "delivery": {
    "generation": 0,
    "dispatchAttempts": 0,
    "acknowledged": true,
    "blocked": true
  },
  "createdAt": "string",
  "updatedAt": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/recipes/quote
```http
POST /workspace/recipes/quote
```
Tag: Project Management
Auth: API key
Operation ID: `createWorkspaceRecipesQuote`
Quote a bounded recipe capture or copy without starting work
Quote a bounded recipe capture or copy without starting work.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/recipes/quote" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"request":{"kind":"capture","value":{"projectId":"string","expectedProjectRevision":0,"expectedVersion":0,"makeReusable":true}},"limits":{"transferBytes":0,"storageBytes":0,"operations":0,"r2Requests":0}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "creditUnitVersion": 2,
  "id": "string",
  "organizationId": "string",
  "userId": "string",
  "requestHash": "string",
  "limits": {
    "transferBytes": 0,
    "storageBytes": 0,
    "operations": 0,
    "r2Requests": 0
  },
  "rates": {
    "version": "string",
    "evidence": "string",
    "validUntil": "string",
    "workerSecondUsd": 0,
    "workerInvocationUsd": 0,
    "classARequestUsd": 0,
    "classBRequestUsd": 0,
    "transferGbUsd": 0,
    "storageGbMonthUsd": 0,
    "storageDays": 0,
    "allocatedOverheadUsd": 0,
    "creditsPerUsd": 0
  },
  "currency": "USD",
  "basis": "allocated_estimate",
  "execution": {
    "machine": "small-2x",
    "workerStarts": 0,
    "workerSeconds": 0
  },
  "estimate": {
    "compute": 0,
    "requests": 0,
    "transfer": 0,
    "storage": 0,
    "overhead": 0,
    "total": 0
  },
  "reserveCredits": 0
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/settings
```http
GET /workspace/settings
```
Tag: Project Management
Auth: API key
Operation ID: `getWorkspaceSettings`
Get workspace settings
Get workspace settings.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/settings" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "settings": {
    "id": "string",
    "name": "string",
    "description": {},
    "safeWords": [
      "string"
    ],
    "protected_words": [
      "string"
    ],
    "icon_storage_key": {},
    "icon_url": {},
    "defaults": {
      "aspectRatio": {},
      "aspect_ratio": {},
      "orientation": {},
      "resolution": {},
      "frameRate": {},
      "frame_rate": {},
      "autoManageBroll": {},
      "auto_manage_broll": {},
      "captionThemeId": {},
      "caption_theme_id": {}
    },
    "updated_at": "string"
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### PATCH /workspace/settings
```http
PATCH /workspace/settings
```
Tag: Project Management
Auth: API key
Operation ID: `updateWorkspaceSettings`
Update workspace settings
Update workspace settings.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X PATCH "https://blitzreels.com/api/v1/workspace/settings" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","description":"string","protected_words":["string"],"safe_words":["string"],"icon_storage_key":"string","defaults":{"aspect_ratio":"16:9","orientation":"landscape","resolution":"1","frame_rate":"24","auto_manage_broll":true,"caption_theme_id":"string"}}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "settings": {
    "id": "string",
    "name": "string",
    "description": {},
    "safeWords": [
      "string"
    ],
    "protected_words": [
      "string"
    ],
    "icon_storage_key": {},
    "icon_url": {},
    "defaults": {
      "aspectRatio": {},
      "aspect_ratio": {},
      "orientation": {},
      "resolution": {},
      "frameRate": {},
      "frame_rate": {},
      "autoManageBroll": {},
      "auto_manage_broll": {},
      "captionThemeId": {},
      "caption_theme_id": {}
    },
    "updated_at": "string"
  },
  "success": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/stock-media/import
```http
POST /workspace/stock-media/import
```
Tag: Media Library
Auth: API key
Operation ID: `importStockMedia`
Import vetted stock media into workspace media
Import vetted stock media into workspace media.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/stock-media/import" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"provider":"pexels","provider_asset_id":"string","asset_type":"image","variant_id":"string","folder_id":"string","audio_type":"sound_effect"}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "asset": {
    "id": "string",
    "name": "string",
    "asset_type": "image",
    "processing_status": "string",
    "source_url": "string",
    "license_code": "string",
    "license_url": {}
  },
  "imported": true,
  "deduped": true
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/stock-media/search
```http
GET /workspace/stock-media/search
```
Tag: Media Library
Auth: API key
Operation ID: `searchStockMedia`
Search vetted stock media providers
Search vetted stock media providers.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
query | query | yes | `string` | -
asset_type | query | yes | `string` (image, video, audio) | -
provider | query | no | `object` | -
orientation | query | no | `object` | -
page | query | no | `integer` | -
limit | query | no | `integer` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/stock-media/search" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "provider": "pexels",
      "provider_asset_id": "string",
      "asset_type": "image",
      "title": "string",
      "preview_url": {},
      "thumbnail_url": {},
      "source_url": "string",
      "author_name": {},
      "author_url": {},
      "license_code": "string",
      "license_url": {},
      "requires_attribution": true,
      "width": {},
      "height": {},
      "duration_seconds": {},
      "variants": [
        {}
      ]
    }
  ],
  "warnings": [
    "string"
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/storage
```http
GET /workspace/storage
```
Tag: Project Management
Auth: API key
Operation ID: `getWorkspaceStorage`
Get workspace storage usage
Get workspace storage usage.

#### Parameters

No path or query parameters.

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/storage" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "storage": {
    "totalBytes": 0,
    "totalMB": 0,
    "assetCount": 0
  }
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/voices
```http
GET /workspace/voices
```
Tag: AI Generation
Auth: API key
Operation ID: `listWorkspaceVoices`
List workspace voices
Lists cloned workspace voices. Their IDs work as voice_id for voiceovers and as a character default_voice_id.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
include_archived | query | no | `boolean` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/voices" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "items": [
    {
      "id": "string",
      "name": "string",
      "provider": "string",
      "status": "ready",
      "character_id": "string",
      "sample_asset_ids": [
        "string"
      ],
      "reference_clip_asset_id": "string",
      "consent": {
        "speaker_name": "string",
        "consent_asset_id": "string",
        "statement": "string",
        "attested_at": "string"
      },
      "provider_cached": true,
      "last_used_at": {},
      "created_at": "string"
    }
  ]
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/voices
```http
POST /workspace/voices
```
Tag: AI Generation
Auth: API key
Operation ID: `cloneWorkspaceVoice`
Clone a voice
Creates a workspace voice from uploaded audio assets: 10-600s of samples (1-2 minutes of clean speech works best) plus a 2-30s recording of the speaker saying: "I, {speaker}, agree that this BlitzReels workspace may create and use a synthetic copy of my voice." At most 5 active voices per workspace. No credits are charged; voiceovers use their usual pricing. With character_id, the voice becomes that character's default voice and its reference clip is used as reference audio on Seedance.

#### Parameters

No path or query parameters.

#### Request Body

Schema: `object`

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/voices" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"string","sample_asset_ids":["string"],"speaker_name":"string","consent_asset_id":"string","character_id":"string","remove_background_noise":true}'
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "provider": "string",
  "status": "ready",
  "character_id": "string",
  "sample_asset_ids": [
    "string"
  ],
  "reference_clip_asset_id": "string",
  "consent": {
    "speaker_name": "string",
    "consent_asset_id": "string",
    "statement": "string",
    "attested_at": "string"
  },
  "provider_cached": true,
  "last_used_at": {},
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### GET /workspace/voices/{voiceId}
```http
GET /workspace/voices/{voiceId}
```
Tag: AI Generation
Auth: API key
Operation ID: `getWorkspaceVoice`
Get workspace voice
Get workspace voice.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
voiceId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X GET "https://blitzreels.com/api/v1/workspace/voices/{voiceId}" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
404 | Not found | `error.NOT_FOUND`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "provider": "string",
  "status": "ready",
  "character_id": "string",
  "sample_asset_ids": [
    "string"
  ],
  "reference_clip_asset_id": "string",
  "consent": {
    "speaker_name": "string",
    "consent_asset_id": "string",
    "statement": "string",
    "attested_at": "string"
  },
  "provider_cached": true,
  "last_used_at": {},
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 404: Not found

```json
{
  "code": "NOT_FOUND",
  "message": "Not found",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

### POST /workspace/voices/{voiceId}/archive
```http
POST /workspace/voices/{voiceId}/archive
```
Tag: AI Generation
Auth: API key
Operation ID: `archiveWorkspaceVoice`
Archive workspace voice
Archives the voice, deletes its provider clone and clears it as any character's default voice.

#### Parameters

| Name | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
voiceId | path | yes | `string` | -

#### Request Body

No JSON request body.

#### cURL

```bash
curl -sS -X POST "https://blitzreels.com/api/v1/workspace/voices/{voiceId}/archive" \
  -H "Authorization: Bearer $BLITZREELS_API_KEY"
```

#### Responses

| Status | Description | Schema |
| --- | --- | --- |
200 | Successful response | `object`
400 | Invalid input data | `error.BAD_REQUEST`
401 | Authorization not provided | `error.UNAUTHORIZED`
403 | Insufficient access | `error.FORBIDDEN`
500 | Internal server error | `error.INTERNAL_SERVER_ERROR`

#### Response Example

```json
{
  "id": "string",
  "name": "string",
  "provider": "string",
  "status": "ready",
  "character_id": "string",
  "sample_asset_ids": [
    "string"
  ],
  "reference_clip_asset_id": "string",
  "consent": {
    "speaker_name": "string",
    "consent_asset_id": "string",
    "statement": "string",
    "attested_at": "string"
  },
  "provider_cached": true,
  "last_used_at": {},
  "created_at": "string"
}
```

#### Errors

| Status | Condition | Body Shape |
| --- | --- | --- |
401 | Missing or invalid API key | `{ "message": "Missing or invalid API key" }`
400 | Invalid input or unsupported operation | `{ "message": "..." }`
404 | Resource not found or outside the workspace | `{ "message": "..." }`
429 | Rate limit or concurrent job limit reached | `{ "message": "..." }`
500 | Unexpected server error | `{ "message": "An internal error occurred" }`

#### Route-Specific Errors

- 400: Invalid input data

```json
{
  "code": "BAD_REQUEST",
  "message": "Invalid input data",
  "issues": []
}
```

- 401: Authorization not provided

```json
{
  "code": "UNAUTHORIZED",
  "message": "Authorization not provided",
  "issues": []
}
```

- 403: Insufficient access

```json
{
  "code": "FORBIDDEN",
  "message": "Insufficient access",
  "issues": []
}
```

- 500: Internal server error

```json
{
  "code": "INTERNAL_SERVER_ERROR",
  "message": "Internal server error",
  "issues": []
}
```

## Schemas

| Schema | Shape |
| --- | --- |
| `CompositionAnimatedStyle` | `object` |
| `CompositionAnimatedValue` | `object` |
| `__schema0` | `object` |
| `error.BAD_REQUEST` | `object` |
| `error.FORBIDDEN` | `object` |
| `error.INTERNAL_SERVER_ERROR` | `object` |
| `error.NOT_FOUND` | `object` |
| `error.UNAUTHORIZED` | `object` |
