Basics#
- Base URL
https://azimo.ai- Authentication
- Every
/v1 request sends Authorization: Bearer <API key>. Create a key in your account; the raw key is shown only once. - Projects
X-Project-ID selects a project; the default project is used when it is omitted.- Idempotency
- Send an
Idempotency-Key with requests that create something and reuse it when retrying; the same value with a different request returns 409. - Asynchronous jobs
POST /v1/videos returns 202 and a video id; poll GET /v1/videos/{job_id} or receive a webhook. needs_input means something is missing, not that the video is done.- Pagination
- Lists return
data, next_cursor and has_more; pass next_cursor as cursor to get the next page. - Pricing
- The API never returns prices. For a quote, contact sales@azimo.ai.
Errors
Errors are JSON with the fields below; include the request_id when you report a problem.
| Name | Type | Description |
|---|
errorrequired | object | |
error.coderequired | string | Stable machine-readable code, e.g. unauthenticated, not_found, idempotency_conflict, validation_error, rate_limited, insufficient_balance, budget_exceeded, contact_sales, internal_error |
error.messagerequired | string | |
error.details | any | Structured context: validation errors, unmet workflow requirements, or null |
error.request_idrequired | string | nullable |
| Status | Meaning |
|---|
401 | Missing or invalid bearer key (`WWW-Authenticate: Bearer`) |
402 | Wallet balance or spending limit would be exceeded |
403 | Key role or project scope does not allow this; `contact_sales` for anything about pricing |
404 | Resource not found in this organization/project |
409 | State conflict, or Idempotency-Key reused with a different request |
422 | Validation error; `details` lists the failing fields or requirements |
429 | Hourly limit reached (`Retry-After` in seconds) |
500 | Unexpected failure; cite `request_id` when reporting it |
Account and capabilities#
Who the current key is, and which workflows and video types are available.
GET/v1/me
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
key_idrequired | string | Same as id |
organization_idrequired | string | |
project_idrequired | string | |
rolerequired | string | One of: owner editor viewer |
billing_moderequired | string | One of: budget prepaid |
walletrequired | object | |
permissionsrequired | map<string, boolean> | |
Example
curl "https://azimo.ai/v1/me" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/workflows
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
routerrequired | object | |
workflowsrequired | map<string, object> | |
Example
curl "https://azimo.ai/v1/workflows" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/workflows/creative_video/skills
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<any> | |
Example
curl "https://azimo.ai/v1/workflows/creative_video/skills" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/video-types
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
langquery | string | Display language, zh (default) or en; when absent the first zh/en entry of Accept-Language is used; length ≤ 16; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
accept-languageheader | string | nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].versionrequired | any | |
data[].template | any | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/video-types" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/playground
API key requiredSuccess 200
The workflow gallery: seven fixed entries, each with routing values, whether this account can start it now, and a runnable example.
Parameters
| Name | Type | Description |
|---|
langquery | string | Display language, zh (default) or en; when absent the first zh/en entry of Accept-Language is used; length ≤ 16; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
accept-languageheader | string | nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | Stable catalogue id |
data[].namerequired | string | |
data[].summaryrequired | string | One benefit-oriented sentence |
data[].workflowrequired | string | Backend routing value for options.workflow; null when the entry cannot be started yet; nullable |
data[].video_typerequired | string | options.video_type for structured explainers, otherwise null; nullable |
data[].aspectrequired | string | One of: 16:9 9:16 1:1 |
data[].durationrequired | integer | Default options.duration_max in seconds |
data[].duration_rangerequired | array<integer> | [minimum, maximum] seconds the workflow accepts |
data[].needs_assetsrequired | boolean | Reference material (photos, product pictures) is strongly recommended |
data[].availablerequired | boolean | |
data[].reasonrequired | string | Why available is false: coming_soon, not_configured (this environment) or contact_sales (not sold to this account); One of: coming_soon not_configured contact_sales; nullable |
data[].coming_soonrequired | boolean | |
data[].examplerequired | object | |
data[].example.promptrequired | string | A ready-to-run creative brief for POST /v1/videos or POST /v1/plans |
data[].example.content_datarequired | map<string, string> | Sample value for every input of the workflow's video type (options.content_data); empty when the workflow has none |
Example
curl "https://azimo.ai/v1/playground" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Assets#
Upload PDFs, slides and pictures; reference the returned asset ids in a plan.
GET/v1/assets
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].filenamerequired | string | |
data[].bytesrequired | integer | |
data[].sha256required | string | |
data[].created_atrequired | number | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/assets" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/assets
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body multipart/form-data
| Name | Type | Description |
|---|
filerequired | file | |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
filenamerequired | string | |
bytesrequired | integer | |
sha256required | string | |
created_atrequired | number | |
Example
curl -X POST "https://azimo.ai/v1/assets" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "file=@deck.pdf"
GET/v1/assets/{asset_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
asset_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
filenamerequired | string | |
bytesrequired | integer | |
sha256required | string | |
created_atrequired | number | |
Example
curl "https://azimo.ai/v1/assets/<asset_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
DELETE/v1/assets/{asset_id}
API key requiredSuccess 200
Remove an upload and its bytes. Jobs that already consumed it keep their own copies.
Parameters
| Name | Type | Description |
|---|
asset_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/assets/<asset_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/assets/{asset_id}/file
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
asset_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/octet-stream
Returns the file bytes.
Example
curl "https://azimo.ai/v1/assets/<asset_id>/file" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Plans#
Plan before producing: workflow, specs, assets and structure are frozen and anything missing is reported.
GET/v1/plans
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].kindrequired | string | |
data[].namerequired | string | |
data[].versionrequired | integer | |
data[].created_atrequired | number | |
data[].updated_atrequired | number | |
data[].datarequired | object | |
data[].data.statusrequired | string | One of: planning ready needs_input unavailable |
data[].data.requestrequired | object | |
data[].data.assets | array<object> | |
data[].data.routing | object | nullable |
data[].data.requirements | array<object> | |
data[].data.reason | string | nullable |
data[].data.job_id | string | The production this plan started; a plan starts at most one; nullable |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/plans" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/plans
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
prompt | string | length ≤ 4000 |
assets | array<string> | up to 30 items |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
webhook_url | string | length ≤ 2000; nullable |
plan_id | string | nullable |
template_id | string | nullable |
brand_id | string | nullable |
variables | map<string, string> | |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
data.statusrequired | string | One of: planning ready needs_input unavailable |
data.requestrequired | object | |
data.assets | array<object> | |
data.routing | object | nullable |
data.requirements | array<object> | |
data.reason | string | nullable |
data.job_id | string | The production this plan started; a plan starts at most one; nullable |
Example
curl -X POST "https://azimo.ai/v1/plans" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"prompt": "<prompt>", "assets": ["<asset id>"]}'
GET/v1/plans/{plan_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
plan_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
data.statusrequired | string | One of: planning ready needs_input unavailable |
data.requestrequired | object | |
data.assets | array<object> | |
data.routing | object | nullable |
data.requirements | array<object> | |
data.reason | string | nullable |
data.job_id | string | The production this plan started; a plan starts at most one; nullable |
Example
curl "https://azimo.ai/v1/plans/<plan_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/route
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
prompt | string | length ≤ 4000 |
assets | array<string> | up to 30 items |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
webhook_url | string | length ≤ 2000; nullable |
plan_id | string | nullable |
template_id | string | nullable |
brand_id | string | nullable |
variables | map<string, string> | |
Response 200 application/json
| Name | Type | Description |
|---|
plan_idrequired | string | |
workflow | string | nullable |
requirements | array<object> | |
Example
curl -X POST "https://azimo.ai/v1/route" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"prompt": "<prompt>", "assets": ["<asset id>"]}'
Videos#
Produce a video from a confirmed plan, follow its progress, download it, resume, revise or cancel it.
GET/v1/videos
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
statusquery | string | One of: queued running needs_input complete rejected failed cancelled; nullable |
batch_idquery | string | length ≤ 32; nullable |
created_afterquery | number | range ≥ 0; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].batch_id | string | nullable |
data[].parent_id | string | nullable |
data[].statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
data[].stagerequired | string | nullable |
data[].progressrequired | integer | nullable |
data[].error | string | nullable |
data[].created_atrequired | number | nullable |
data[].updated_at | number | nullable |
data[].started_at | number | nullable |
data[].finished_at | number | nullable |
data[].deleted_at | number | nullable |
data[].recoveryrequired | object | |
data[].recovery.attemptrequired | integer | |
data[].recovery.max_attemptsrequired | integer | |
data[].recovery.retry_at | number | nullable |
data[].result | object | nullable |
data[].result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
data[].result.duration | number | nullable |
data[].result.shot_count | integer | nullable |
data[].result.visual_mix | any | |
data[].result.qa | any | |
data[].result.brief | any | |
data[].result.workflow | string | nullable |
data[].result.routing | any | |
data[].result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
data[].result.native_project | any | |
data[].requested_workflowrequired | string | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/videos" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/videos
API key requiredSuccess 202
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
prompt | string | length ≤ 4000 |
assets | array<string> | up to 30 items |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
webhook_url | string | length ≤ 2000; nullable |
plan_id | string | nullable |
template_id | string | nullable |
brand_id | string | nullable |
variables | map<string, string> | |
Response 202 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
batch_id | string | nullable |
parent_id | string | nullable |
statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
stagerequired | string | nullable |
progressrequired | integer | nullable |
error | string | nullable |
created_atrequired | number | nullable |
updated_at | number | nullable |
started_at | number | nullable |
finished_at | number | nullable |
deleted_at | number | nullable |
recoveryrequired | object | |
recovery.attemptrequired | integer | |
recovery.max_attemptsrequired | integer | |
recovery.retry_at | number | nullable |
result | object | nullable |
result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
result.duration | number | nullable |
result.shot_count | integer | nullable |
result.visual_mix | any | |
result.qa | any | |
result.brief | any | |
result.workflow | string | nullable |
result.routing | any | |
result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
result.native_project | any | |
requested_workflowrequired | string | |
webhook_signing_secret | string | Only present when the request set webhook_url: the project secret that signs that per-job callback (Vidgen-Signature). Store it; verify deliveries with it; nullable |
Example
curl -X POST "https://azimo.ai/v1/videos" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"prompt": "<prompt>", "assets": ["<asset id>"]}'
POST/v1/videos/{job_id}/resume
API key requiredSuccess 202
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
message | string | length ≤ 4000 |
questionnaire_id | string | length ≤ 200; nullable |
answers | array<object> | up to 30 items |
assets | array<string> | up to 9 items |
approve_budget | boolean | Approve the pending budget stop; the server computes the new limit; Default false |
credit_budget | integer | Legacy: explicit new Vikoo credit budget for a credit budget stop; range 1–1000000; nullable |
budget_usd | number | Legacy: explicit new total USD limit for a budget stop; range 0–100000; nullable |
Response 202 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
batch_id | string | nullable |
parent_id | string | nullable |
statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
stagerequired | string | nullable |
progressrequired | integer | nullable |
error | string | nullable |
created_atrequired | number | nullable |
updated_at | number | nullable |
started_at | number | nullable |
finished_at | number | nullable |
deleted_at | number | nullable |
recoveryrequired | object | |
recovery.attemptrequired | integer | |
recovery.max_attemptsrequired | integer | |
recovery.retry_at | number | nullable |
result | object | nullable |
result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
result.duration | number | nullable |
result.shot_count | integer | nullable |
result.visual_mix | any | |
result.qa | any | |
result.brief | any | |
result.workflow | string | nullable |
result.routing | any | |
result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
result.native_project | any | |
requested_workflowrequired | string | |
Example
curl -X POST "https://azimo.ai/v1/videos/<job_id>/resume" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"message": "<message>", "questionnaire_id": "<questionnaire_id>"}'
POST/v1/videos/{job_id}/revisions
API key requiredSuccess 202
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
prompt | string | length 10–4000; nullable |
assets | array<string> | up to 30 items; nullable |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
Response 202 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
batch_id | string | nullable |
parent_id | string | nullable |
statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
stagerequired | string | nullable |
progressrequired | integer | nullable |
error | string | nullable |
created_atrequired | number | nullable |
updated_at | number | nullable |
started_at | number | nullable |
finished_at | number | nullable |
deleted_at | number | nullable |
recoveryrequired | object | |
recovery.attemptrequired | integer | |
recovery.max_attemptsrequired | integer | |
recovery.retry_at | number | nullable |
result | object | nullable |
result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
result.duration | number | nullable |
result.shot_count | integer | nullable |
result.visual_mix | any | |
result.qa | any | |
result.brief | any | |
result.workflow | string | nullable |
result.routing | any | |
result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
result.native_project | any | |
requested_workflowrequired | string | |
webhook_signing_secret | string | Only present when the request set webhook_url: the project secret that signs that per-job callback (Vidgen-Signature). Store it; verify deliveries with it; nullable |
Example
curl -X POST "https://azimo.ai/v1/videos/<job_id>/revisions" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"prompt": "<prompt>", "assets": ["<asset id>"]}'
GET/v1/videos/{job_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
batch_id | string | nullable |
parent_id | string | nullable |
statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
stagerequired | string | nullable |
progressrequired | integer | nullable |
error | string | nullable |
created_atrequired | number | nullable |
updated_at | number | nullable |
started_at | number | nullable |
finished_at | number | nullable |
deleted_at | number | nullable |
recoveryrequired | object | |
recovery.attemptrequired | integer | |
recovery.max_attemptsrequired | integer | |
recovery.retry_at | number | nullable |
result | object | nullable |
result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
result.duration | number | nullable |
result.shot_count | integer | nullable |
result.visual_mix | any | |
result.qa | any | |
result.brief | any | |
result.workflow | string | nullable |
result.routing | any | |
result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
result.native_project | any | |
requested_workflowrequired | string | |
Example
curl "https://azimo.ai/v1/videos/<job_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
DELETE/v1/videos/{job_id}
API key requiredSuccess 200
Purge a finished job's films, uploads copies and diagnostics; the job record stays for usage history.
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/videos/<job_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/videos/{job_id}/cancel
API key requiredSuccess 200
queued / needs_input jobs cancel at once; a running job stops before its next paid step (cancelling).
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
statusrequired | string | One of: cancelled cancelling |
Example
curl -X POST "https://azimo.ai/v1/videos/<job_id>/cancel" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
GET/v1/videos/{job_id}/files/{name}
Signed link, no keySuccess 200
Parameters
| Name | Type | Description |
|---|
job_idrequiredpath | string | |
namerequiredpath | string | |
expiresrequiredquery | integer | |
sigrequiredquery | string | |
Response 200 application/octet-stream
Returns the file bytes.
Example
curl "https://azimo.ai/v1/videos/<job_id>/files/<name>?expires=<expires>&sig=<sig>"
Batches#
Submit several videos at once.
GET/v1/batches
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].namerequired | string | |
data[].created_atrequired | number | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/batches" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/batches
API key requiredSuccess 202
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
name | string | Default Batch; length 1–160 |
itemsrequired | array<object> | up to 50 items |
items[].prompt | string | length ≤ 4000 |
items[].assets | array<string> | up to 30 items |
items[].options | object | |
items[].options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
items[].options.goal | string | length ≤ 2000 |
items[].options.audience | string | length ≤ 1000 |
items[].options.duration_max | integer | Default 60; range 5–180 |
items[].options.width | integer | Default 1920; range 640–3840 |
items[].options.height | integer | Default 1080; range 360–2160 |
items[].options.fps | integer | Default 30; range 24–60 |
items[].options.subtitles | boolean | Default false |
items[].options.music | boolean | Default true |
items[].options.skill_id | string | length ≤ 200; nullable |
items[].options.credit_budget | integer | range 1–1000000; nullable |
items[].options.video_type | string | One of: project product personal corporate; nullable |
items[].options.content_data | map<string, string> | |
items[].options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
items[].options.brand | object | |
items[].options.motion_style | string | One of: mono photo; Default mono |
items[].options.photo_subject | string | length ≤ 120 |
items[].options.photo_license | string | One of: strict sharealike; Default strict |
items[].webhook_url | string | length ≤ 2000; nullable |
items[].plan_id | string | nullable |
items[].template_id | string | nullable |
items[].brand_id | string | nullable |
items[].variables | map<string, string> | |
Response 202 application/json
| Name | Type | Description |
|---|
idrequired | string | |
namerequired | string | |
jobsrequired | array<object> | |
jobs[].idrequired | string | |
jobs[].project_idrequired | string | nullable |
jobs[].batch_id | string | nullable |
jobs[].parent_id | string | nullable |
jobs[].statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
jobs[].stagerequired | string | nullable |
jobs[].progressrequired | integer | nullable |
jobs[].error | string | nullable |
jobs[].created_atrequired | number | nullable |
jobs[].updated_at | number | nullable |
jobs[].started_at | number | nullable |
jobs[].finished_at | number | nullable |
jobs[].deleted_at | number | nullable |
jobs[].recoveryrequired | object | |
jobs[].recovery.attemptrequired | integer | |
jobs[].recovery.max_attemptsrequired | integer | |
jobs[].recovery.retry_at | number | nullable |
jobs[].result | object | nullable |
jobs[].result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
jobs[].result.duration | number | nullable |
jobs[].result.shot_count | integer | nullable |
jobs[].result.visual_mix | any | |
jobs[].result.qa | any | |
jobs[].result.brief | any | |
jobs[].result.workflow | string | nullable |
jobs[].result.routing | any | |
jobs[].result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
jobs[].result.native_project | any | |
jobs[].requested_workflowrequired | string | |
datarequired | array<object> | Alias of jobs, kept for v0.3 clients |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].batch_id | string | nullable |
data[].parent_id | string | nullable |
data[].statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
data[].stagerequired | string | nullable |
data[].progressrequired | integer | nullable |
data[].error | string | nullable |
data[].created_atrequired | number | nullable |
data[].updated_at | number | nullable |
data[].started_at | number | nullable |
data[].finished_at | number | nullable |
data[].deleted_at | number | nullable |
data[].recoveryrequired | object | |
data[].recovery.attemptrequired | integer | |
data[].recovery.max_attemptsrequired | integer | |
data[].recovery.retry_at | number | nullable |
data[].result | object | nullable |
data[].result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
data[].result.duration | number | nullable |
data[].result.shot_count | integer | nullable |
data[].result.visual_mix | any | |
data[].result.qa | any | |
data[].result.brief | any | |
data[].result.workflow | string | nullable |
data[].result.routing | any | |
data[].result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
data[].result.native_project | any | |
data[].requested_workflowrequired | string | |
countsrequired | map<string, integer> | |
webhook_signing_secret | string | Set when an item carried webhook_url: the project secret that signs those per-job callbacks (Vidgen-Signature). Store it; verify deliveries with it; nullable |
Example
curl -X POST "https://azimo.ai/v1/batches" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"items": [{}]}'
GET/v1/batches/{batch_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
batch_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
namerequired | string | |
jobsrequired | array<object> | |
jobs[].idrequired | string | |
jobs[].project_idrequired | string | nullable |
jobs[].batch_id | string | nullable |
jobs[].parent_id | string | nullable |
jobs[].statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
jobs[].stagerequired | string | nullable |
jobs[].progressrequired | integer | nullable |
jobs[].error | string | nullable |
jobs[].created_atrequired | number | nullable |
jobs[].updated_at | number | nullable |
jobs[].started_at | number | nullable |
jobs[].finished_at | number | nullable |
jobs[].deleted_at | number | nullable |
jobs[].recoveryrequired | object | |
jobs[].recovery.attemptrequired | integer | |
jobs[].recovery.max_attemptsrequired | integer | |
jobs[].recovery.retry_at | number | nullable |
jobs[].result | object | nullable |
jobs[].result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
jobs[].result.duration | number | nullable |
jobs[].result.shot_count | integer | nullable |
jobs[].result.visual_mix | any | |
jobs[].result.qa | any | |
jobs[].result.brief | any | |
jobs[].result.workflow | string | nullable |
jobs[].result.routing | any | |
jobs[].result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
jobs[].result.native_project | any | |
jobs[].requested_workflowrequired | string | |
datarequired | array<object> | Alias of jobs, kept for v0.3 clients |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].batch_id | string | nullable |
data[].parent_id | string | nullable |
data[].statusrequired | string | One of: queued running needs_input complete rejected failed cancelled |
data[].stagerequired | string | nullable |
data[].progressrequired | integer | nullable |
data[].error | string | nullable |
data[].created_atrequired | number | nullable |
data[].updated_at | number | nullable |
data[].started_at | number | nullable |
data[].finished_at | number | nullable |
data[].deleted_at | number | nullable |
data[].recoveryrequired | object | |
data[].recovery.attemptrequired | integer | |
data[].recovery.max_attemptsrequired | integer | |
data[].recovery.retry_at | number | nullable |
data[].result | object | nullable |
data[].result.files | map<string, string> | Signed download links; present on GET once complete/rejected; nullable |
data[].result.duration | number | nullable |
data[].result.shot_count | integer | nullable |
data[].result.visual_mix | any | |
data[].result.qa | any | |
data[].result.brief | any | |
data[].result.workflow | string | nullable |
data[].result.routing | any | |
data[].result.input_required | object | Why the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and approvable: true and carries no amounts; answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; nullable |
data[].result.native_project | any | |
data[].requested_workflowrequired | string | |
countsrequired | map<string, integer> | |
Example
curl "https://azimo.ai/v1/batches/<batch_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Events and webhooks#
Instead of polling, receive status changes through signed webhooks or the event list.
GET/v1/events
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
afterquery | integer | Default 0; range ≥ 0 |
limitquery | integer | Default 50; range 1–200 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].sequencerequired | integer | |
data[].typerequired | string | |
data[].created_atrequired | number | |
data[].api_versionrequired | string | |
data[].project_idrequired | string | nullable |
data[].datarequired | object | |
next_cursorrequired | integer | Sequence number to pass as after; unchanged when the page is empty |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/events" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/webhooks
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].kindrequired | string | |
data[].namerequired | string | |
data[].versionrequired | integer | |
data[].created_atrequired | number | |
data[].updated_atrequired | number | |
data[].datarequired | object | |
data[].data.namerequired | string | |
data[].data.urlrequired | string | |
data[].data.active | boolean | Default true |
data[].data.has_secretrequired | boolean | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/webhooks" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/webhooks
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
name | string | Default Webhook; length ≤ 160 |
urlrequired | string | length ≤ 2000 |
active | boolean | Default true |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
data.namerequired | string | |
data.urlrequired | string | |
data.active | boolean | Default true |
data.has_secretrequired | boolean | |
signing_secretrequired | string | Shown at creation/rotation and for the same actor's idempotent retry within 24 hours; nullable |
Example
curl -X POST "https://azimo.ai/v1/webhooks" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"url": "<url>"}'
POST/v1/webhooks/{webhook_id}/rotate-secret
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
webhook_idrequiredpath | string | |
expected_versionrequiredquery | integer | range ≥ 1 |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
data.namerequired | string | |
data.urlrequired | string | |
data.active | boolean | Default true |
data.has_secretrequired | boolean | |
signing_secretrequired | string | Shown at creation/rotation and for the same actor's idempotent retry within 24 hours; nullable |
Example
curl -X POST "https://azimo.ai/v1/webhooks/<webhook_id>/rotate-secret?expected_version=<expected_version>" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
PUT/v1/webhooks/{webhook_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
webhook_idrequiredpath | string | |
expected_versionrequiredquery | integer | range ≥ 1 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
name | string | Default Webhook; length ≤ 160 |
urlrequired | string | length ≤ 2000 |
active | boolean | Default true |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
data.namerequired | string | |
data.urlrequired | string | |
data.active | boolean | Default true |
data.has_secretrequired | boolean | |
Example
curl -X PUT "https://azimo.ai/v1/webhooks/<webhook_id>?expected_version=<expected_version>" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "<url>"}'
DELETE/v1/webhooks/{webhook_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
webhook_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/webhooks/<webhook_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/webhook-deliveries
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].event_idrequired | string | |
data[].urlrequired | string | |
data[].statusrequired | string | |
data[].attemptsrequired | integer | |
data[].last_errorrequired | string | nullable |
data[].delivered_atrequired | number | nullable |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/webhook-deliveries" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/webhook-deliveries/{delivery_id}/replay
API key requiredSuccess 202
Parameters
| Name | Type | Description |
|---|
delivery_idrequiredpath | string | |
webhook_idquery | string | length ≤ 32; nullable |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 202 application/json
| Name | Type | Description |
|---|
idrequired | string | |
statusrequired | string | One of: pending |
Example
curl -X POST "https://azimo.ai/v1/webhook-deliveries/<delivery_id>/replay" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
Brands and templates#
Save brand kits and reusable templates, then reference them when producing.
GET/v1/brands
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].kindrequired | string | |
data[].namerequired | string | |
data[].versionrequired | integer | |
data[].created_atrequired | number | |
data[].updated_atrequired | number | |
data[].datarequired | object | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/brands" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/brands
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–120 |
slogan | string | length ≤ 500 |
primary_color | string | Default #0F4C81 |
theme | string | One of: light dark; Default dark |
assets | array<string> | up to 30 items |
notes | string | length ≤ 2000 |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl -X POST "https://azimo.ai/v1/brands" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name": "<name>"}'
GET/v1/brands/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
versionquery | integer | range ≥ 1; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl "https://azimo.ai/v1/brands/<resource_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
PUT/v1/brands/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
expected_versionrequiredquery | integer | range ≥ 1 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–120 |
slogan | string | length ≤ 500 |
primary_color | string | Default #0F4C81 |
theme | string | One of: light dark; Default dark |
assets | array<string> | up to 30 items |
notes | string | length ≤ 2000 |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl -X PUT "https://azimo.ai/v1/brands/<resource_id>?expected_version=<expected_version>" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "<name>"}'
DELETE/v1/brands/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/brands/<resource_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/templates
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].project_idrequired | string | nullable |
data[].kindrequired | string | |
data[].namerequired | string | |
data[].versionrequired | integer | |
data[].created_atrequired | number | |
data[].updated_atrequired | number | |
data[].datarequired | object | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/templates" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/templates
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–160 |
promptrequired | string | Use $variable or ${variable} placeholders; length 10–4000 |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
assets | array<string> | up to 30 items |
brand_id | string | nullable |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl -X POST "https://azimo.ai/v1/templates" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name": "<name>", "prompt": "<prompt>"}'
GET/v1/templates/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
versionquery | integer | range ≥ 1; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl "https://azimo.ai/v1/templates/<resource_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
PUT/v1/templates/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
expected_versionrequiredquery | integer | range ≥ 1 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–160 |
promptrequired | string | Use $variable or ${variable} placeholders; length 10–4000 |
options | object | |
options.workflow | string | One of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer |
options.goal | string | length ≤ 2000 |
options.audience | string | length ≤ 1000 |
options.duration_max | integer | Default 60; range 5–180 |
options.width | integer | Default 1920; range 640–3840 |
options.height | integer | Default 1080; range 360–2160 |
options.fps | integer | Default 30; range 24–60 |
options.subtitles | boolean | Default false |
options.music | boolean | Default true |
options.skill_id | string | length ≤ 200; nullable |
options.credit_budget | integer | range 1–1000000; nullable |
options.video_type | string | One of: project product personal corporate; nullable |
options.content_data | map<string, string> | |
options.style_preset | string | One of: cinematic_realism clean_3d product_studio; Default cinematic_realism |
options.brand | object | |
options.motion_style | string | One of: mono photo; Default mono |
options.photo_subject | string | length ≤ 120 |
options.photo_license | string | One of: strict sharealike; Default strict |
assets | array<string> | up to 30 items |
brand_id | string | nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
project_idrequired | string | nullable |
kindrequired | string | |
namerequired | string | |
versionrequired | integer | |
created_atrequired | number | |
updated_atrequired | number | |
datarequired | object | |
Example
curl -X PUT "https://azimo.ai/v1/templates/<resource_id>?expected_version=<expected_version>" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "<name>", "prompt": "<prompt>"}'
DELETE/v1/templates/{resource_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
resource_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/templates/<resource_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Projects, keys and audit#
Manage projects and API keys, and read the change log.
GET/v1/projects
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].organization_idrequired | string | |
data[].namerequired | string | |
data[].created_atrequired | number | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/projects" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/projects
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–120 |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
organization_idrequired | string | |
namerequired | string | |
created_atrequired | number | |
Example
curl -X POST "https://azimo.ai/v1/projects" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name": "<name>"}'
DELETE/v1/projects/{project_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
project_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
deleted | boolean | Default true |
Example
curl -X DELETE "https://azimo.ai/v1/projects/<project_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/api-keys
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
limitquery | integer | Default 50; range 1–200 |
cursorquery | string | length ≤ 256; nullable |
afterquery | string | length ≤ 256; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].namerequired | string | Label given at creation (also returned as owner) |
data[].ownerrequired | string | |
data[].prefixrequired | string | nullable |
data[].organization_idrequired | string | nullable |
data[].project_id | string | Set when the key is bound to one project; nullable |
data[].rolerequired | string | One of: owner editor viewer |
data[].activerequired | boolean | |
data[].created_atrequired | number | nullable |
data[].last_used_at | number | nullable |
data[].expires_at | number | nullable |
data[].revoked_at | number | nullable |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/api-keys" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/api-keys
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
namerequired | string | length 1–120 |
role | string | One of: owner editor viewer; Default editor |
project_id | string | nullable |
monthly_budget_usd | number | range ≥ 0; nullable |
rate_per_hour | integer | range ≥ 1; nullable |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
namerequired | string | Label given at creation (also returned as owner) |
ownerrequired | string | |
prefixrequired | string | nullable |
organization_idrequired | string | nullable |
project_id | string | Set when the key is bound to one project; nullable |
rolerequired | string | One of: owner editor viewer |
activerequired | boolean | |
created_atrequired | number | nullable |
last_used_at | number | nullable |
expires_at | number | nullable |
revoked_at | number | nullable |
keyrequired | string | The bearer secret; shown once (an idempotent replay returns the same value) |
Example
curl -X POST "https://azimo.ai/v1/api-keys" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name": "<name>"}'
POST/v1/api-keys/{key_id}/rotate
API key requiredSuccess 200
The old secret dies at once, or after grace_seconds so running fleets can switch without downtime.
Parameters
| Name | Type | Description |
|---|
key_idrequiredpath | string | |
grace_secondsquery | integer | Default 0; range 0–604800 |
Idempotency-Keyheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
keyrequired | string | |
previous_idrequired | string | |
previous_expires_inrequired | integer | nullable |
Example
curl -X POST "https://azimo.ai/v1/api-keys/<key_id>/rotate" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"
DELETE/v1/api-keys/{key_id}
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
key_idrequiredpath | string | |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
idrequired | string | |
active | boolean | Default false |
Example
curl -X DELETE "https://azimo.ai/v1/api-keys/<key_id>" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/audit
API key requiredSuccess 200
Identity and configuration changes for this organization (keys, projects, webhooks), oldest first from after.
Parameters
| Name | Type | Description |
|---|
afterquery | integer | Default 0; range ≥ 0 |
limitquery | integer | Default 50; range 1–200 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].sequencerequired | integer | |
data[].typerequired | string | |
data[].created_atrequired | number | |
data[].api_versionrequired | string | |
data[].project_idrequired | string | nullable |
data[].datarequired | object | |
next_cursorrequired | integer | Sequence number to pass as after; unchanged when the page is empty |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/audit" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Wallet and usage#
Balance, statement and usage, and online top-up.
GET/v1/wallet
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
balance_centsrequired | integer | |
held_centsrequired | integer | |
available_centsrequired | integer | |
low_balance_centsrequired | integer | nullable |
currencyrequired | string | |
organization_idrequired | string | |
Example
curl "https://azimo.ai/v1/wallet" \
-H "Authorization: Bearer $AZIMO_API_KEY"
GET/v1/wallet/entries
API key requiredSuccess 200
Parameters
| Name | Type | Description |
|---|
afterquery | string | length ≤ 64; nullable |
limitquery | integer | Default 50; range 1–200 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
datarequired | array<object> | |
data[].idrequired | string | |
data[].organization_idrequired | string | |
data[].kindrequired | string | |
data[].amount_centsrequired | integer | |
data[].hold_centsrequired | integer | |
data[].job_idrequired | string | nullable |
data[].noterequired | string | nullable |
data[].actorrequired | string | nullable |
data[].created_atrequired | number | |
next_cursor | string | Opaque; pass as cursor (or the after alias) for the next page; nullable |
has_more | boolean | Default false |
Example
curl "https://azimo.ai/v1/wallet/entries" \
-H "Authorization: Bearer $AZIMO_API_KEY"
POST/v1/wallet/checkout
API key requiredSuccess 201
Parameters
| Name | Type | Description |
|---|
Idempotency-Keyrequiredheader | string | A unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128 |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Request body application/json
| Name | Type | Description |
|---|
amount_centsrequired | integer | USD cents, $5–$10,000; range 500–1000000 |
Response 201 application/json
| Name | Type | Description |
|---|
idrequired | string | |
urlrequired | string | |
amount_centsrequired | integer | |
currency | string | Default USD |
Example
curl -X POST "https://azimo.ai/v1/wallet/checkout" \
-H "Authorization: Bearer $AZIMO_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"amount_cents": 500}'
GET/v1/usage
API key requiredSuccess 200
The amount billed for this project's paid calls in [from, to) (default: the last 30 days), plus job counts, grouped on request. group_by=job pages by job id with after; group_by=workflow reads at most 5000 jobs' request options.
Parameters
| Name | Type | Description |
|---|
fromquery | number | range ≥ 0; nullable |
toquery | number | range ≥ 0; nullable |
group_byquery | string | Default none |
limitquery | integer | Default 50; range 1–200 |
afterquery | string | length ≤ 32; nullable |
X-Project-IDheader | string | The project to act on; the default project when omitted; nullable |
Response 200 application/json
| Name | Type | Description |
|---|
project_idrequired | string | |
rangerequired | map<string, number> | |
jobsrequired | map<string, integer> | |
list_usdrequired | number | Amount billed for the paid calls in the range |
group_byrequired | string | |
groupsrequired | array<object> | nullable |
next_cursorrequired | string | nullable |
Example
curl "https://azimo.ai/v1/usage" \
-H "Authorization: Bearer $AZIMO_API_KEY"
Service health#
Health checks; no key needed.
GET/healthz
No authSuccess 200
Response 200 application/json
Example
curl "https://azimo.ai/healthz"
GET/readyz
No authSuccess 200
Response 200 application/json
| Name | Type | Description |
|---|
okrequired | boolean | |
dbrequired | boolean | |
versionrequired | string | |
queue_depthrequired | integer | |
runningrequired | integer | |
worker_seen_at | number | Latest job start or running-job heartbeat; nullable |
worker_aliverequired | boolean | A worker sent a durable heartbeat within the last 5 minutes |
Other status codes
Example
curl "https://azimo.ai/readyz"