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 · Batches

Submit several videos at once.

View Markdown

List Batches

GET/v1/batches

API key requiredSuccess 200

Parameters

NameTypeDescription
limitqueryintegerDefault 50; range 1–200
cursorquerystringlength ≤ 256; nullable
afterquerystringlength ≤ 256; nullable
X-Project-IDheaderstringThe project to act on; the default project when omitted; nullable

Response 200 application/json

NameTypeDescription
datarequiredarray<object>
data[].idrequiredstring
data[].namerequiredstring
data[].created_atrequirednumber
next_cursorstringOpaque; pass as cursor (or the after alias) for the next page; nullable
has_morebooleanDefault false

Example

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

Create Batch

POST/v1/batches

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
namestringDefault Batch; length 1–160
itemsrequiredarray<object>up to 50 items
items[].promptstringlength ≤ 4000
items[].assetsarray<string>up to 30 items
items[].optionsobject
items[].options.workflowstringOne of: auto explainer short_drama creative_video motion_explainer profile_card product_pitch; Default explainer
items[].options.goalstringlength ≤ 2000
items[].options.audiencestringlength ≤ 1000
items[].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
items[].options.widthintegerWith height, the aspect ratio: 1920×1080 (16:9); profile_card 1080×1920 (9:16); Default 1920; range 640–3840
items[].options.heightintegerDefault 1080; range 360–2160
items[].options.fpsintegerDefault 30; range 24–60
items[].options.subtitlesbooleanSubtitle preference, applied by profile_card only; other films usually come with subtitles burned in; Default false
items[].options.musicbooleanBackground music preference, applied by profile_card only; Default true
items[].options.skill_idstringlength ≤ 200; nullable
items[].options.credit_budgetintegerrange 1–1000000; nullable
items[].options.video_typestringOne of: project product personal corporate name_card; nullable
items[].options.content_datamap<string, string>
items[].options.style_presetstringOne of: cinematic_realism clean_3d product_studio; Default cinematic_realism
items[].options.brandobject
items[].options.profileobject
items[].options.motion_stylestringOne of: mono photo; Default mono
items[].options.photo_subjectstringlength ≤ 120
items[].options.photo_licensestringOne of: strict sharealike; Default strict
items[].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
items[].options.languagestringThe film's language when the request has no text of its own; unset: Chinese; One of: zh en; nullable
items[].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
items[].webhook_urlstringlength ≤ 2000; nullable
items[].plan_idstringnullable
items[].template_idstringnullable
items[].brand_idstringnullable
items[].variablesmap<string, string>

Response 202 application/json

NameTypeDescription
idrequiredstring
namerequiredstring
jobsrequiredarray<object>
jobs[].idrequiredstring
jobs[].project_idrequiredstringnullable
jobs[].batch_idstringnullable
jobs[].parent_idstringnullable
jobs[].statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
jobs[].stagerequiredstringnullable
jobs[].progressrequiredintegernullable
jobs[].errorstringnullable
jobs[].created_atrequirednumbernullable
jobs[].updated_atnumbernullable
jobs[].started_atnumbernullable
jobs[].finished_atnumbernullable
jobs[].deleted_atnumbernullable
jobs[].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
jobs[].recoveryrequiredobject
jobs[].recovery.attemptrequiredinteger
jobs[].recovery.max_attemptsrequiredinteger
jobs[].recovery.retry_atnumbernullable
jobs[].resultobjectnullable
jobs[].result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
jobs[].result.durationnumbernullable
jobs[].result.shot_countintegernullable
jobs[].result.visual_mixany
jobs[].result.qaany
jobs[].result.briefany
jobs[].result.workflowstringnullable
jobs[].result.routingany
jobs[].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
jobs[].result.native_projectany
jobs[].requested_workflowrequiredstring
jobs[].video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
jobs[].stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
jobs[].titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
jobs[].profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable
datarequiredarray<object>Alias of jobs, kept for v0.3 clients
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
countsrequiredmap<string, integer>
webhook_signing_secretstringSet 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://axiomlab.online/v1/batches" \
  -H "Authorization: Bearer $AZIMO_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"items": [{}]}'

Get Batch

GET/v1/batches/{batch_id}

API key requiredSuccess 200

Parameters

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

Response 200 application/json

NameTypeDescription
idrequiredstring
namerequiredstring
jobsrequiredarray<object>
jobs[].idrequiredstring
jobs[].project_idrequiredstringnullable
jobs[].batch_idstringnullable
jobs[].parent_idstringnullable
jobs[].statusrequiredstringOne of: queued running needs_input complete rejected failed cancelled
jobs[].stagerequiredstringnullable
jobs[].progressrequiredintegernullable
jobs[].errorstringnullable
jobs[].created_atrequirednumbernullable
jobs[].updated_atnumbernullable
jobs[].started_atnumbernullable
jobs[].finished_atnumbernullable
jobs[].deleted_atnumbernullable
jobs[].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
jobs[].recoveryrequiredobject
jobs[].recovery.attemptrequiredinteger
jobs[].recovery.max_attemptsrequiredinteger
jobs[].recovery.retry_atnumbernullable
jobs[].resultobjectnullable
jobs[].result.filesmap<string, string>Signed download links; present on GET once complete/rejected; nullable
jobs[].result.durationnumbernullable
jobs[].result.shot_countintegernullable
jobs[].result.visual_mixany
jobs[].result.qaany
jobs[].result.briefany
jobs[].result.workflowstringnullable
jobs[].result.routingany
jobs[].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
jobs[].result.native_projectany
jobs[].requested_workflowrequiredstring
jobs[].video_typestringThe video type within the workflow, e.g. project, when the request set one; nullable
jobs[].stylestringThe style the request chose (options.style, see GET /v1/styles); null: the default style; nullable
jobs[].titlestringA short name for lists: the subject named in the brief (e.g. the project name) or the start of the prompt; nullable
jobs[].profile_draftstringprofile_card: the confirmed 行家访谈 draft this film was made from (the web app offers a retry); nullable
datarequiredarray<object>Alias of jobs, kept for v0.3 clients
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
countsrequiredmap<string, integer>

Example

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

← All endpoints