Skip to content
Limited-time offerevery video just HK$1only 1,000, first come first servedGet it now
Axiom Lab
Developer docs

Reference

API reference · Videos

Produce a video from a confirmed plan, follow its progress, download it, resume, revise or cancel it.

View Markdown

List Videos

GET/v1/videos

API key requiredSuccess 200

Parameters

NameTypeDescription
limitqueryintegerDefault 50; range 1–200
cursorquerystringlength ≤ 256; nullable
afterquerystringlength ≤ 256; nullable
statusquerystringOne of: queued running needs_input complete rejected failed cancelled; nullable
batch_idquerystringlength ≤ 32; nullable
created_afterquerynumberrange ≥ 0; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Response 200 application/json

NameTypeDescription
datarequiredarray<object>
data[].idrequiredstring
data[].project_idrequiredstringnullable
data[].batch_idstringnullable
data[].parent_idstringnullable
data[].statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
data[].stagerequiredstringnullable
data[].progressrequiredintegernullable
data[].errorstringnullable
data[].created_atrequirednumbernullable
data[].updated_atnumbernullable
data[].started_atnumbernullable
data[].finished_atnumbernullable
data[].deleted_atnumbernullable
data[].waited_snumberGET /v1/videos/{id} only: seconds the video waited for its length to be confirmed, null until it is confirmed; its working time is (finished_at or now) - created_at - waited_s; nullable
data[].recoveryrequiredobject
data[].recovery.attemptrequiredinteger
data[].recovery.max_attemptsrequiredinteger
data[].recovery.retry_atnumbernullable
data[].resultobjectnullable
data[].result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
data[].result.durationnumbernullable
data[].result.shot_countintegernullable
data[].result.visual_mixany
data[].result.qaany
data[].result.briefany
data[].result.workflowstringnullable
data[].result.routingany
data[].result.input_requiredobjectWhy the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and carries no amounts. With approvable: true answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; with approvable: false (actor: operator, prepaid flat-priced jobs) it is an internal review: nothing to approve, the price does not change; nullable
data[].result.native_projectany
data[].requested_workflowrequiredstring
data[].video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
data[].stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
data[].titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
data[].profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable
next_cursorstringOpaque; pass as cursor (or the after alias) for the next page; nullable
has_morebooleanDefault false

Example

curl "https://axiomlab.online/v1/videos" \
  -H "Authorization: Bearer $AZIMO_API_KEY"

Create Video

POST/v1/videos

API key requiredSuccess 202

Parameters

NameTypeDescription
Idempotency-KeyheaderstringA unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Request body application/json

NameTypeDescription
promptstringlength ≤ 4000
assetsarray<string>up to 30 items
optionsobject
options.workflowstringOne of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer
options.goalstringlength ≤ 2000
options.audiencestringlength ≤ 1000
options.duration_maxintegerPlanned length in seconds, checked against the workflow's range, whose lower bound depends on the workflow (GET /v1/workflows: 30–180 for most, profile_card 30–90). It does not cap the film: its length is confirmed after the materials are analysed (needs_input with confirm_duration); Default 60; range 5–180
options.widthintegerWith height, the aspect ratio: 1920×1080 (16:9); profile_card 1080×1920 (9:16); Default 1920; range 640–3840
options.heightintegerDefault 1080; range 360–2160
options.fpsintegerDefault 30; range 24–60
options.subtitlesbooleanSubtitle preference, applied by profile_card only; other films usually come with subtitles burned in; Default false
options.musicbooleanBackground music preference, applied by profile_card only; Default true
options.skill_idstringlength ≤ 200; nullable
options.credit_budgetintegerrange 1–1000000; nullable
options.video_typestringOne of: project product personal corporate name_card; nullable
options.content_datamap<string, string>
options.style_presetstringOne of: cinematic_realism clean_3d product_studio; Default cinematic_realism
options.brandobject
options.profileobject
options.motion_stylestringOne of: mono photo; Default mono
options.photo_subjectstringlength ≤ 120
options.photo_licensestringOne of: strict sharealike; Default strict
options.stylestringA style id from GET /v1/styles; for video_type product one of the 15-second TVC looks cinematic, tech, lifestyle; unset uses the default style; nullable
options.languagestringThe film's language when the request has no text of its own; unset: Chinese; One of: zh en; nullable
options.founderobject企业家名片: name, company, titles, facts (0–12; a card counts as two), photos[{asset, role, caption}], template (ink | grid | renwu), consent, optional industry and name_pinyin; required with video_type name_card. Length is 30–90 seconds, set from the material; nullable
options.founder.namerequiredstringlength 2–12
options.founder.companyrequiredstringlength 2–40
options.founder.titlesrequiredarray<string>up to 3 items
options.founder.factsarray<object>up to 12 items
options.founder.photosrequiredarray<object>up to 12 items
options.founder.templatestringOne of: ink grid renwu; Default ink
options.founder.educationarray<string>up to 3 items
options.founder.honorsarray<string>up to 6 items
options.founder.mottostringthe closing line; the customer's own words; length ≤ 40
options.founder.contactstringshown on the end card only when given; length ≤ 60
options.founder.industrystring行业 / 主营,如智慧农业;framing lines and illustrative scenes may rest on it; length ≤ 20
options.founder.name_pinyinstringoptional pronunciation, e.g. shěn jì bái; written into the narration prompt; length ≤ 48
options.founder.brand_colorstring#RRGGBB accent for the grid template
options.founder.consentbooleanthe customer holds the rights to these photos and the facts are true; Default false
webhook_urlstringlength ≤ 2000; nullable
plan_idstringnullable
template_idstringnullable
brand_idstringnullable
variablesmap<string, string>

Response 202 application/json

NameTypeDescription
idrequiredstring
project_idrequiredstringnullable
batch_idstringnullable
parent_idstringnullable
statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
stagerequiredstringnullable
progressrequiredintegernullable
errorstringnullable
created_atrequirednumbernullable
updated_atnumbernullable
started_atnumbernullable
finished_atnumbernullable
deleted_atnumbernullable
waited_snumberGET /v1/videos/{id} only: seconds the video waited for its length to be confirmed, null until it is confirmed; its working time is (finished_at or now) - created_at - waited_s; nullable
recoveryrequiredobject
recovery.attemptrequiredinteger
recovery.max_attemptsrequiredinteger
recovery.retry_atnumbernullable
resultobjectnullable
result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
result.durationnumbernullable
result.shot_countintegernullable
result.visual_mixany
result.qaany
result.briefany
result.workflowstringnullable
result.routingany
result.input_requiredobjectWhy the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and carries no amounts. With approvable: true answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; with approvable: false (actor: operator, prepaid flat-priced jobs) it is an internal review: nothing to approve, the price does not change; nullable
result.native_projectany
requested_workflowrequiredstring
video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable
webhook_signing_secretstringOnly 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://axiomlab.online/v1/videos" \
  -H "Authorization: Bearer $AZIMO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "<prompt>", "assets": ["<asset id>"]}'

Resume

POST/v1/videos/{job_id}/resume

API key requiredSuccess 202

Parameters

NameTypeDescription
job_idrequiredpathstring
Idempotency-KeyheaderstringA unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Request body application/json

NameTypeDescription
messagestringNot accepted (422): use POST /v1/videos/{id}/revisions or a new plan for changed requirements or materials; length ≤ 4000
questionnaire_idstringNot accepted (422): use POST /v1/videos/{id}/revisions or a new plan for changed requirements or materials; length ≤ 200; nullable
answersarray<object>Not accepted (422): use POST /v1/videos/{id}/revisions or a new plan for changed requirements or materials; up to 30 items
assetsarray<string>Not accepted (422): use POST /v1/videos/{id}/revisions or a new plan for changed requirements or materials; up to 9 items
approve_budgetbooleanApprove a pending budget stop that has approvable: true; the server computes the new limit; Default false
credit_budgetintegerLegacy, no longer used: no job stops for a credit budget (sending it answers 422); range 1–1000000; nullable
budget_usdnumberLegacy: explicit new total USD limit for a budget stop; range 0–100000; nullable
duration_secintegerAnswer to a confirm_duration stop: the film length in seconds, within the stop's min_duration_sec–max_duration_sec (its suggested_duration_sec unless the customer changes it); nullable

Response 202 application/json

NameTypeDescription
idrequiredstring
project_idrequiredstringnullable
batch_idstringnullable
parent_idstringnullable
statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
stagerequiredstringnullable
progressrequiredintegernullable
errorstringnullable
created_atrequirednumbernullable
updated_atnumbernullable
started_atnumbernullable
finished_atnumbernullable
deleted_atnumbernullable
waited_snumberGET /v1/videos/{id} only: seconds the video waited for its length to be confirmed, null until it is confirmed; its working time is (finished_at or now) - created_at - waited_s; nullable
recoveryrequiredobject
recovery.attemptrequiredinteger
recovery.max_attemptsrequiredinteger
recovery.retry_atnumbernullable
resultobjectnullable
result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
result.durationnumbernullable
result.shot_countintegernullable
result.visual_mixany
result.qaany
result.briefany
result.workflowstringnullable
result.routingany
result.input_requiredobjectWhy the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and carries no amounts. With approvable: true answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; with approvable: false (actor: operator, prepaid flat-priced jobs) it is an internal review: nothing to approve, the price does not change; nullable
result.native_projectany
requested_workflowrequiredstring
video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable

Example

curl -X POST "https://axiomlab.online/v1/videos/<job_id>/resume" \
  -H "Authorization: Bearer $AZIMO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"duration_sec": 60}'

Revise Video

POST/v1/videos/{job_id}/revisions

API key requiredSuccess 202

Parameters

NameTypeDescription
job_idrequiredpathstring
Idempotency-KeyheaderstringA unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Request body application/json

NameTypeDescription
promptstringlength 10–4000; nullable
assetsarray<string>up to 30 items; nullable
optionsobject
options.workflowstringOne of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer
options.goalstringlength ≤ 2000
options.audiencestringlength ≤ 1000
options.duration_maxintegerPlanned length in seconds, checked against the workflow's range, whose lower bound depends on the workflow (GET /v1/workflows: 30–180 for most, profile_card 30–90). It does not cap the film: its length is confirmed after the materials are analysed (needs_input with confirm_duration); Default 60; range 5–180
options.widthintegerWith height, the aspect ratio: 1920×1080 (16:9); profile_card 1080×1920 (9:16); Default 1920; range 640–3840
options.heightintegerDefault 1080; range 360–2160
options.fpsintegerDefault 30; range 24–60
options.subtitlesbooleanSubtitle preference, applied by profile_card only; other films usually come with subtitles burned in; Default false
options.musicbooleanBackground music preference, applied by profile_card only; Default true
options.skill_idstringlength ≤ 200; nullable
options.credit_budgetintegerrange 1–1000000; nullable
options.video_typestringOne of: project product personal corporate name_card; nullable
options.content_datamap<string, string>
options.style_presetstringOne of: cinematic_realism clean_3d product_studio; Default cinematic_realism
options.brandobject
options.profileobject
options.motion_stylestringOne of: mono photo; Default mono
options.photo_subjectstringlength ≤ 120
options.photo_licensestringOne of: strict sharealike; Default strict
options.stylestringA style id from GET /v1/styles; for video_type product one of the 15-second TVC looks cinematic, tech, lifestyle; unset uses the default style; nullable
options.languagestringThe film's language when the request has no text of its own; unset: Chinese; One of: zh en; nullable
options.founderobject企业家名片: name, company, titles, facts (0–12; a card counts as two), photos[{asset, role, caption}], template (ink | grid | renwu), consent, optional industry and name_pinyin; required with video_type name_card. Length is 30–90 seconds, set from the material; nullable
options.founder.namerequiredstringlength 2–12
options.founder.companyrequiredstringlength 2–40
options.founder.titlesrequiredarray<string>up to 3 items
options.founder.factsarray<object>up to 12 items
options.founder.photosrequiredarray<object>up to 12 items
options.founder.templatestringOne of: ink grid renwu; Default ink
options.founder.educationarray<string>up to 3 items
options.founder.honorsarray<string>up to 6 items
options.founder.mottostringthe closing line; the customer's own words; length ≤ 40
options.founder.contactstringshown on the end card only when given; length ≤ 60
options.founder.industrystring行业 / 主营,如智慧农业;framing lines and illustrative scenes may rest on it; length ≤ 20
options.founder.name_pinyinstringoptional pronunciation, e.g. shěn jì bái; written into the narration prompt; length ≤ 48
options.founder.brand_colorstring#RRGGBB accent for the grid template
options.founder.consentbooleanthe customer holds the rights to these photos and the facts are true; Default false

Response 202 application/json

NameTypeDescription
idrequiredstring
project_idrequiredstringnullable
batch_idstringnullable
parent_idstringnullable
statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
stagerequiredstringnullable
progressrequiredintegernullable
errorstringnullable
created_atrequirednumbernullable
updated_atnumbernullable
started_atnumbernullable
finished_atnumbernullable
deleted_atnumbernullable
waited_snumberGET /v1/videos/{id} only: seconds the video waited for its length to be confirmed, null until it is confirmed; its working time is (finished_at or now) - created_at - waited_s; nullable
recoveryrequiredobject
recovery.attemptrequiredinteger
recovery.max_attemptsrequiredinteger
recovery.retry_atnumbernullable
resultobjectnullable
result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
result.durationnumbernullable
result.shot_countintegernullable
result.visual_mixany
result.qaany
result.briefany
result.workflowstringnullable
result.routingany
result.input_requiredobjectWhy the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and carries no amounts. With approvable: true answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; with approvable: false (actor: operator, prepaid flat-priced jobs) it is an internal review: nothing to approve, the price does not change; nullable
result.native_projectany
requested_workflowrequiredstring
video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable
webhook_signing_secretstringOnly 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://axiomlab.online/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 Video

GET/v1/videos/{job_id}

API key requiredSuccess 200

Parameters

NameTypeDescription
job_idrequiredpathstring
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Response 200 application/json

NameTypeDescription
idrequiredstring
project_idrequiredstringnullable
batch_idstringnullable
parent_idstringnullable
statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
stagerequiredstringnullable
progressrequiredintegernullable
errorstringnullable
created_atrequirednumbernullable
updated_atnumbernullable
started_atnumbernullable
finished_atnumbernullable
deleted_atnumbernullable
waited_snumberGET /v1/videos/{id} only: seconds the video waited for its length to be confirmed, null until it is confirmed; its working time is (finished_at or now) - created_at - waited_s; nullable
recoveryrequiredobject
recovery.attemptrequiredinteger
recovery.max_attemptsrequiredinteger
recovery.retry_atnumbernullable
resultobjectnullable
result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
result.durationnumbernullable
result.shot_countintegernullable
result.visual_mixany
result.qaany
result.briefany
result.workflowstringnullable
result.routingany
result.input_requiredobjectWhy the job is needs_input: code, actor, message and what to send to /resume. A spending stop has code: budget_approval and carries no amounts. With approvable: true answer it with POST /v1/videos/{id}/resume {"approve_budget": true}; with approvable: false (actor: operator, prepaid flat-priced jobs) it is an internal review: nothing to approve, the price does not change; nullable
result.native_projectany
requested_workflowrequiredstring
video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable

Example

curl "https://axiomlab.online/v1/videos/<job_id>" \
  -H "Authorization: Bearer $AZIMO_API_KEY"

Delete Video

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

NameTypeDescription
job_idrequiredpathstring
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Response 200 application/json

NameTypeDescription
idrequiredstring
deletedbooleanDefault true

Example

curl -X DELETE "https://axiomlab.online/v1/videos/<job_id>" \
  -H "Authorization: Bearer $AZIMO_API_KEY"

Cancel Video

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

NameTypeDescription
job_idrequiredpathstring
Idempotency-KeyheaderstringA unique value you generate and keep; reuse it when retrying so the request never runs twice; length 1–128; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Response 200 application/json

NameTypeDescription
idrequiredstring
statusrequiredstringOne of: cancelled cancelling

Example

curl -X POST "https://axiomlab.online/v1/videos/<job_id>/cancel" \
  -H "Authorization: Bearer $AZIMO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"

Get File

GET/v1/videos/{job_id}/files/{name}

Signed link, no keySuccess 200

Parameters

NameTypeDescription
job_idrequiredpathstring
namerequiredpathstring
expiresrequiredqueryinteger
sigrequiredquerystring

Response 200 application/octet-stream

Returns the file bytes.

Example

curl "https://axiomlab.online/v1/videos/<job_id>/files/<name>?expires=<expires>&sig=<sig>"

← All endpoints