Documentation
FRANKLAB API

Video generation

Video REST API: MARS, MOON, SATURN, OMNI, Alibaba, MiniMax, VECTOR, VENUS, X and HeyGen.

Open .md
Open in AI

Work with an AI assistant

Shares the current documentation without your keys. Long sections are copied in full for you to paste into chat.

Cursor and Claude Code accept short prompts in links. For long sections, ChatGPT and Antigravity, paste the copied documentation manually.

Ask support

REST contracts for Alibaba Video, HEYGEN AGENT, MARS, MOON, MiniMax, OMNI, SATURN, VECTOR, VENUS and X. Access and pricing depend on your account and the selected operation.

Connection and lifecycle

Base URL: https://apergrex.ru/franklab/api. Tables show full paths. Send your FrankLab key in X-API-Key, or Authorization: Bearer for HEYGEN. Never put keys in URLs. Make labels and selectors select a request branch; they are not necessarily REST fields.

bash
export FRANKLAB_BASE_URL="https://apergrex.ru/franklab/api"
# FRANKLAB_KEY is supplied securely by your environment.

Check availability and a model-specific estimate before creation. Generation POST may reserve Franks; F is an internal accounting unit. Save the returned ID and poll the specified route. HTTP 200, queued/processing and an ID do not establish completion. Success requires a terminal state and output URL. For 400 inspect fields, 401/403 access, 404 route/ID, 409 conflicts and 429 rate limits; also check application code/success and the error body. After a timeout, reconcile existing work before another paid POST. Check cost_status to see whether funds were reserved, charged or refunded.

Required marks fields mandatory for the selected REST branch; conditional requirements are stated alongside them. Path and query inputs are identified explicitly. Do not send every field from a union schema in one request.

Modules

FrankLab Alibaba Video

HappyHorse 1.1 accepts 480P, 720P and 1080P. If an existing task returns lifecycle_conflict, keep its ID and contact support; do not create another task to retrieve the result.

HappyHorse 1.1 supports text-to-video, first-frame image-to-video and reference-to-video. REST normally omits model; Make's happyhorse-1.1 label is not a REST model value. WAN uses model:"wan3.0-video". Make wan_t2v, wan_i2v, wan_r2v, wan_edit, wan_extend, wan_file, wan_link map respectively to the seven REST operation values in the table. hh11_r2v maps to reference_to_video with model:"happyhorse-1.1-r2v", hh10_edit maps to video_edit with model:"happyhorse-1.0-video-edit", and kf2v maps to keyframe_to_video with model:"wan2.2-kf2v-flash" or model:"wan2.1-kf2v-plus". HappyHorse reference_to_video is the one HappyHorse operation that requires an explicit model: an omitted model is never routed to r2v.

REST accepts wan3.0-video-prime via model:"wan3.0-video-prime" for text_to_video/image_to_video/reference_to_video; it is rejected for video_edit/video_extend/file_to_video/link_to_video, which only base wan3.0-video implements. HappyHorse 1.1 accepts 480P/720P/1080P on text_to_video, image_to_video and reference_to_video; HappyHorse 1.0 edit accepts 720P/1080P. keyframe_to_video requires durationSeconds but ignores its value: the provider always returns exactly 5 seconds. Before submission, check access to the selected operation, especially WAN edit/extend/file/link and HappyHorse edit.

Image descriptor: {storedFileId,url,mimeType,width,height,sizeBytes} from owned stored media. HappyHorse reference_to_video takes 1 to 9 such images in referenceImages, each with a shortest side of at least 400 px, and the prompt refers to them as [Image 1], [Image 2] and so on in list order. WAN video descriptor: {storedFileId,url,mimeType:"video/mp4",sizeBytes}. HappyHorse edit video additionally requires measured width,height,durationSeconds,fps and permits MP4/MOV. Document descriptor requires owned ID/URL, supported document MIME and size, optionally pageCount (at most 50). Do not invent IDs or measured metadata. /franklab/jobs/upload returns data.url, data.storedFileId, data.mimeType and data.sizeBytes. For descriptors that also require measured geometry or duration, follow the media input guide.

WAN reference requests use media:[{type:"reference_image",url:ownedURL}] (up to 10); the current REST DTO additionally supports referenceVideos and referenceAudios with measured metadata, while this Make communication does not send those arrays. These are distinct from referenceVideo, the clip to edit. Automatic WAN duration -1 reserves against a 30-second bound.

Routes and operations

OperationHTTPPathCondition / purpose
happyhorse_text_to_videoPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
happyhorse_image_to_videoPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_t2vPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_i2vPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_r2vPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_editPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_extendPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_filePOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
wan_linkPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
hh10_editPOST/franklab/api/make/alibaba/videosModel/operation-specific assets are required as described below. Feature and operation gates must allow the request. Make wan3.0-video-prime is accepted for text_to_video/image_to_video/reference_to_video and rejected by the current DTO for video_edit/video_extend/file_to_video/link_to_video.
hh11_r2vPOST/franklab/api/make/alibaba/videosHappyHorse reference-to-video. Requires model:"happyhorse-1.1-r2v", 1-9 owned reference images (shortest side at least 400 px) and an explicit ratio; adaptive is rejected.
kf2vPOST/franklab/api/make/alibaba/videosWAN keyframe-to-video. Requires model:"wan2.2-kf2v-flash" or model:"wan2.1-kf2v-plus" and firstFrame; lastFrame is optional.
poll_statusGET/franklab/api/make/alibaba/status/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
estimatePOST/franklab/api/make/alibaba/estimatePricing-only, no reserve or provider egress. HTTP 200 can contain a non-200 application code.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probePOST/franklab/api/make/alibaba/estimateMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

happyhorse_text_to_video, happyhorse_image_to_video, hh11_r2v, wan_t2v, wan_i2v, wan_r2v, wan_edit, wan_extend, wan_file, wan_link, hh10_edit, kf2v

FieldTypeRequiredValue / constraint
operationstringyestext_to_video/image_to_video/reference_to_video/video_edit/video_extend/file_to_video/link_to_video/keyframe_to_video.
modelstringconditional / noOmit for HappyHorse 1.1 text_to_video and image_to_video. reference_to_video REQUIRES happyhorse-1.1-r2v. Other families: wan3.0-video, wan3.0-video-prime, happyhorse-1.0-video-edit, wan2.2-kf2v-flash, wan2.1-kf2v-plus.
promptstringyesNonempty, at most 5000 code points in service.
negativePromptstringconditional / nokeyframe_to_video only (wan2.2-kf2v-flash / wan2.1-kf2v-plus). Optional, at most 500 code points in service.
resolutionstringyesUppercase 480P/720P/1080P; HappyHorse 1.1 accepts all three on text_to_video, image_to_video and reference_to_video; HappyHorse 1.0 edit only 720P/1080P.
durationSecondsintegeryesHappyHorse 3–15; WAN 2–30 or -1 automatic (reserve for 30 seconds). keyframe_to_video requires the field but ignores its value — output is always 5 seconds.
ratiostringconditional / noRequired for HappyHorse text_to_video and reference_to_video; adaptive only where model/operation permits, and HappyHorse rejects adaptive.
seedintegerconditional / noNonnegative seed.
audiobooleanconditional / noWAN audio.
prompt_extendbooleanconditional / noWAN prompt extension.
watermarkbooleanconditional / noWatermark.
firstFrameobjectconditional / noOwned image descriptor for image_to_video.
lastFrameobjectconditional / noOptional WAN image_to_video final frame.
mediaarrayconditional / noWAN reference images: [{type:reference_image,url:ownedURL}].
referenceVideoobjectconditional / noOwned video descriptor for WAN edit/extend.
fileobjectconditional / noOwned document descriptor for file_to_video.
linkstringconditional / noHTTPS public web page for link_to_video; mutually exclusive with file.
videoobjectconditional / noHappyHorse edit video descriptor.
referenceImagesarrayconditional / noHappyHorse image descriptors. reference_to_video: 1–9 owned images, shortest side at least 400 px, referenced from the prompt as [Image 1], [Image 2] … in list order. HappyHorse 1.0 edit: at most 5.
audioSettingstringconditional / noHappyHorse edit: auto/origin.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

estimate

FieldTypeRequiredValue / constraint
mediastringyesvideo.
operationstringyesSame operation as submit.
modelstringconditional / noSame model as submit.
resolutionstringyesSame resolution.
durationSecondsintegeryesSame duration.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Envelope code/msg/data. Submit data.taskId and status=queued; poll queued/processing/completed/failed/error. Completed video is data.videoUrl; final_cost_franks, refunded_cost_franks and cost_status describe settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/alibaba/videos" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"operation":"text_to_video","prompt":"A blue paper cube rotates on a white background.","resolution":"720P","durationSeconds":3,"ratio":"16:9"}'

Estimate: POST /franklab/api/make/alibaba/estimate. For Alibaba add media=video and send only estimate-schema fields.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/alibaba/status/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab HEYGEN AGENT

Authentication uses the partner credential/session guard; REST examples use your FrankLab bearer API key. partner_heygen requires a previously saved credential belonging to the same partner. Keep account mode and credential ID consistent across submit, session polling, resources, videos and RPCs. The normal example uses the FrankLab account and never sends a provider secret.

Make avatarId, voiceId, styleId, brandKitId, callbackUrl, callbackId, incognitoMode map to REST snake-case fields shown below. filesJson becomes an actual JSON array in files. List pagination is limit plus token; responses may include hasMore and nextToken. Save an avatar look ID, not its group ID.

For generate_from_prompt, POST mode:"generate", GET the session until a video ID exists, then GET /v1/heygen/videos/{videoId} until a successful video URL exists. Failure/stopped/cancelled states are terminal; an empty URL is not success. A submit timeout or submission_unknown must be reconciled using existing session/task records before resubmitting. A session message can request further generation and is not a free metadata call. Stop is not a billing rollback. Provider-account and FrankLab-account billing paths differ; inspect the returned task/settlement evidence rather than assuming every session endpoint shares one tariff.

Routes and operations

OperationHTTPPathCondition / purpose
generate_from_promptPOST/franklab/api/v1/heygen/video-agentsMake generate_from_prompt is a create → session poll → video poll composite, not /generate.
create_sessionPOST/franklab/api/v1/heygen/video-agentsMake generate_from_prompt is a create → session poll → video poll composite, not /generate.
list_sessionsGET/franklab/api/v1/heygen/video-agents
list_stylesGET/franklab/api/v1/heygen/video-agents/styles
get_sessionGET/franklab/api/v1/heygen/video-agents/{sessionId}
get_resourceGET/franklab/api/v1/heygen/video-agents/{sessionId}/resources/{resourceId}
list_videosGET/franklab/api/v1/heygen/video-agents/{sessionId}/videos
get_videoGET/franklab/api/v1/heygen/videos/{videoId}
send_messagePOST/franklab/api/v1/heygen/video-agents/{sessionId}/messages
stop_sessionPOST/franklab/api/v1/heygen/video-agents/{sessionId}/stopStopping is a mutation; it does not itself prove a refund.
save_heygen_credentialPOST/franklab/api/v1/heygen/credentialsCredential setup is a separate sensitive operation; never include provider keys in generation requests or public examples.
getHeygenCredentialsGET/franklab/api/v1/heygen/credentialsSupporting Make RPC. The RPC function name is not part of the REST URL.
getHeygenVideoAgentStylesGET/franklab/api/v1/heygen/video-agents/stylesSupporting Make RPC. The RPC function name is not part of the REST URL.
getHeygenAgentAvatarLooksGET/franklab/api/v1/heygen/avatars/looksSupporting Make RPC. The RPC function name is not part of the REST URL.
getHeygenVoicesGET/franklab/api/v1/heygen/voicesSupporting Make RPC. The RPC function name is not part of the REST URL.
getHeygenBrandKitsGET/franklab/api/v1/heygen/brand/kitsSupporting Make RPC. The RPC function name is not part of the REST URL.
getHeygenVideoAgentSessionsGET/franklab/api/v1/heygen/video-agentsSupporting Make RPC. The RPC function name is not part of the REST URL.
connection_probeGET/franklab/api/v1/heygen/credentialsMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

generate_from_prompt, create_session

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
promptstringyes1–10000 characters.
modestringconditional / nogenerate or chat.
avatar_idstringconditional / noAvatar look ID.
voice_idstringconditional / noVoice ID.
style_idstringconditional / noStyle ID.
brand_kit_idstringconditional / noBrand kit ID.
orientationstringconditional / nolandscape/portrait.
filesarrayconditional / noAt most 20 file entries; not a JSON-encoded string.
callback_urlstringconditional / noCallback URL.
callback_idstringconditional / noCaller callback correlation.
incognito_modebooleanconditional / noPrivate session flag.

list_sessions

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
limitintegerconditional / no1–100.
tokenstringconditional / noPagination token.

list_styles, getHeygenVideoAgentStyles, getHeygenBrandKits

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.

get_session, list_videos, stop_session

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
sessionIdstringyesPath session ID.

get_resource

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
sessionIdstringyesPath session ID.
resourceIdstringyesPath resource ID.

get_video

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
videoIdstringyesPath video ID.

send_message

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
sessionIdstringyesPath session ID.
messagestringyes1–10000 characters.

save_heygen_credential

FieldTypeRequiredValue / constraint
labelstringyesDisplay label.
apiKeysecretyesPartner-owned HeyGen key; send only to credential storage.

getHeygenAgentAvatarLooks

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
ownershipstringconditional / noprivate for partner-owned credentials.
limitintegerconditional / no50 in Make.

getHeygenVoices

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
typestringconditional / noprivate for partner-owned credentials.
limitintegerconditional / no100 in Make.

getHeygenVideoAgentSessions

FieldTypeRequiredValue / constraint
providerAccountModestringconditional / nofranklab (default) or partner_heygen.
providerCredentialIdstringconditional / noRequired for partner_heygen; saved credential ID only.
limitintegerconditional / no50 in Make.

Response and completion

Envelope success=true,data,meta. Session and video IDs are separate. Session may return data.sessionId/videoId/status/providerStatus; poll video endpoint for data.video and videoUrl/downloadUrl. Read failureCode/failureMessage; session existence is not finished output.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/heygen/video-agents" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"providerAccountMode":"franklab","prompt":"Create a short video of a blue paper cube rotating on a white background.","mode":"generate"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/heygen/video-agents/$SESSION_ID" \
  -H "Authorization: Bearer $FRANKLAB_KEY"

FrankLab MARS

Text and image generation use model_name:"mars-v1-5", duration 3–15 seconds, mode:"std"|"pro"|"4k". The route chooses text/image intent; do not send Make mode:"text2video" as REST quality. Image generation requires image or image_list. Text generation rejects elements. Image generation allows at most three elements and rejects combining elements with voices. Multi-shot uses multi_shot, shot_type and multi_prompt:[{index,prompt,duration}].

Effects require the exact effect code and scene. For example effect_scene:"single_character",effect:"zoom_out",image:ownedURL; dual-character inputs also need image_tail. The machine contract retains every effect selector value. Trajectory transfer is the same motion-control API documented under VECTOR, with Make's legacy aliases translated as noted. Poll the matching route family, retain all task_result.videos, and inspect task_status_msg if the task fails.

Routes and operations

OperationHTTPPathCondition / purpose
text2videoPOST/franklab/api/v1/videos/text2videoMake quality_mode becomes REST mode; Make fixes model_name=mars-v1-5.
poll_statusGET/franklab/api/v1/videos/text2video/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
image2videoPOST/franklab/api/v1/videos/image2videoMake quality_mode becomes REST mode; Make fixes model_name=mars-v1-5.
poll_statusGET/franklab/api/v1/videos/image2video/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
effectsPOST/franklab/api/v1/videos/effectsMake effect_name becomes REST effect. Large scene-dependent effect catalogue is preserved in selectorValues in the contract map.
poll_statusGET/franklab/api/v1/videos/effects/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
trajectory_transferPOST/franklab/api/v1/videos/motion-controlCompatibility alias motion_control uses the same route. Make video maps to video_url; image is sent as image and image_url; anchor_source maps to character_orientation.
poll_statusGET/franklab/api/v1/videos/motion-control/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
getAllKusoksGET/franklab/api/make/kusok/elementsSupporting RPC; response data.result for elements, data for voices.
getElementVoicesGET/franklab/api/v1/elements/voicesSupporting RPC; response data.result for elements, data for voices.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/videos/text2videoMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

text2video, image2video

FieldTypeRequiredValue / constraint
promptstringconditional / noScene description.
durationintegeryesClip seconds 3–15.
model_namestringconditional / noPublic model alias.
modestringconditional / noQuality mode.
aspect_ratiostringconditional / noOutput ratio.
callback_urlstringconditional / noOptional HTTPS callback.
external_task_idstringconditional / noCaller correlation ID, not a provider ID.
negative_promptstringconditional / noAt most 2500 characters.
cfg_scalenumberconditional / noGuidance.
soundbooleanconditional / noNative audio (Make on/off is transformed).
multi_shotbooleanconditional / noEnable multiple shots.
shot_typestringconditional / nocustomize/intelligence.
multi_promptarrayconditional / no[{index,prompt,duration}] with positive integer shot duration.
voice_listarrayconditional / no[{voice_id}].
imagestringconditional / noStart image URL for image2video.
image_tailstringconditional / noEnd image URL.
image_listarrayconditional / no[{image_url,type?}].
element_listarrayconditional / no[{element_id}], at most 3 on mars-v1-5 image2video; excludes voice_list.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

effects

FieldTypeRequiredValue / constraint
effect_scenestringyessingle_character/dual_character.
effectstringyesExact effect value from source selector.
imagestringyesHTTPS input image.
image_tailstringconditional / noSecond image required for dual-character Make scene.
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noCorrelation.

trajectory_transfer

FieldTypeRequiredValue / constraint
imagestringyesAnchor image URL or supported base64.
image_file_datastringconditional / noAlternative base64/native file data.
image_file_namestringconditional / noFilename for native data.
videostringyesPublic reference video URL.
character_orientationstringyesimage/video.
modestringconditional / nostd/pro.
generation_profilestringconditional / noauto/studio/cinema.
keep_original_soundstringconditional / noyes/no.
promptstringconditional / noAt most 2500 characters.
durationstringyesRequired string seconds 3–30; image orientation at most 10. Must match reference clip.
element_listarrayconditional / no[{element_id}].
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noAt most 100 characters.

getAllKusoks, getElementVoices

FieldTypeRequiredValue / constraint
pageNumintegerconditional / no1-based.
pageSizeintegerconditional / noMake asks for 500.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Proxy envelope: code=0 (some routes accept 200), data.task_id. Poll data.task_status; successful task_result.videos[] contains url/id/duration. Read task_status_msg on failure. final_cost_franks is meaningful together with cost_status/cost_unit; reserved is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/text2video" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"model_name":"mars-v1-5","prompt":"A blue paper cube rotates on a white background.","duration":3,"mode":"std","aspect_ratio":"16:9"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/text2video/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab MOON

moon_fast Make resolution choices are 480p/720p; moon_base adds 1080p/4k; moon_pro offers 480p/720p/1080p and mp4/mov. moon_mini is exposed for reference generation. Model-specific validators remain authoritative: a union enum does not make every combination valid.

Image input uses first_frame_image_url and optionally last_frame_image_url. References are arrays of URL strings, not objects and not Make field labels. Standard limits are 9 images, 3 videos, 3 audios; moon_pro extends reference arrays to 30 images, 10 videos and 10 audios with additional aggregate budgets. The legacy image_list first-frame slots remain capped at 9. Edit/extend need the source video URL; give a prompt for a deliberate edit. Use direct public HTTPS URLs or URLs returned by upload.

Estimate with the identical payload, then submit with a stable idempotency_key. Keep the returned ID and poll /make/moon/status/{taskId}. Check application code, phase, status, output URL and settlement together. An estimated or reserved final_cost_franks is a reserve amount; cost_status distinguishes it from confirmed cost.

Duration is an integer 4–15 for non-pro models. moon_pro allows -1 (automatic) or 4–30; for moon_pro video_edit omit duration or use -1. For moon_pro edit/extend and first/last-frame inputs, omit ratio or use adaptive.

Routes and operations

OperationHTTPPathCondition / purpose
text_to_videoPOST/franklab/api/make/moon/videosSend operation=text_to_video. Make moon_model becomes moonModel; reference_image_url becomes first_frame_image_url.
image_to_videoPOST/franklab/api/make/moon/videosSend operation=image_to_video. Make moon_model becomes moonModel; reference_image_url becomes first_frame_image_url.
reference_to_videoPOST/franklab/api/make/moon/videosSend operation=reference_to_video. Make moon_model becomes moonModel; reference_image_url becomes first_frame_image_url.
video_editPOST/franklab/api/make/moon/videosSend operation=video_edit. Make moon_model becomes moonModel; reference_image_url becomes first_frame_image_url.
video_extendPOST/franklab/api/make/moon/videosSend operation=video_extend. Make moon_model becomes moonModel; reference_image_url becomes first_frame_image_url.
poll_statusGET/franklab/api/make/moon/status/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
estimatePOST/franklab/api/make/moon/estimateSame payload as submission; pricing only, no provider dispatch.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/moon/videos/tasks/_connection_test_Make connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

text_to_video, image_to_video, reference_to_video, video_edit, video_extend, estimate

FieldTypeRequiredValue / constraint
operationstringyestext_to_video/image_to_video/reference_to_video/video_edit/video_extend.
moonModelstringconditional / nomoon_fast/moon_base/moon_pro/moon_mini.
promptstringconditional / noRequired meaningful text or media per operation.
durationintegerconditional / no4–15 seconds; moon_pro permits -1 automatic or 4–30. moon_pro video_edit requires -1 or omitted.
ratiostringconditional / no21:9/16:9/4:3/1:1/3:4/9:16/adaptive. moon_pro edit/extend and frame modes require adaptive or omitted.
resolutionstringconditional / noModel-dependent 480p/720p/1080p/4k.
output_formatstringconditional / nomoon_pro only mp4/mov.
first_frame_image_urlstringconditional / noFirst frame URL.
last_frame_image_urlstringconditional / noOptional last frame.
reference_imagesarrayconditional / noURL strings.
reference_videosarrayconditional / noURL strings.
reference_video_urlstringconditional / noSingle video URL alternative.
reference_audiosarrayconditional / noURL strings.
reference_audio_urlstringconditional / noSingle audio URL alternative.
return_last_framebooleanconditional / noReturn terminal frame.
generate_audiobooleanconditional / noAudio generation.
watermarkbooleanconditional / noWatermark.
priorityintegerconditional / no0–9.
safety_identifierstringconditional / noPrintable ASCII, at most 64 characters.
execution_expires_afterintegerconditional / no3600–259200 seconds.
callback_urlstringconditional / noCallback URL.
idempotency_keystringconditional / noAt most 200 characters.
external_task_idstringconditional / noCorrelation, at most 200 characters.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Envelope code/msg/data. Submit data.taskId/task_id, status=queued, phase and idempotency metadata; status queued/processing/completed/failed. Result data.videoUrl (or normalized video URL in result), last_frame_url if requested. A failed task can have HTTP 200 with code=500. Reserved final_cost_franks is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/moon/videos" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"operation":"text_to_video","moonModel":"moon_fast","prompt":"A blue paper cube rotates on a white background.","duration":4,"resolution":"480p","ratio":"16:9","generate_audio":false}'

Estimate: POST /franklab/api/make/moon/estimate. Use the same body.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/moon/status/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab MiniMax

All five scenarios are supported by the stored-file REST schema. Text requires a concrete ratio (21:9,16:9,4:3,1:1,3:4,9:16) and no reference fields. Frame scenarios require the corresponding owned ID(s), ratio:"adaptive", and no reference arrays. Reference mode requires at least an image or video; audio alone is insufficient. Duplicate IDs across media arrays are rejected.

Upload URL JSON is {source_type:"url",kind:"image",url:"https://your-public-host.example/synthetic.png"}. For bytes use multipart source_type=make_file, kind=image, media_file=@synthetic.png; for a data URI use data_url_file=@source.dataurl with source_type=data_url. Upload transport caps one file at 64 MiB; per-media limits are smaller (image 30 MiB, video 50 MiB, audio 15 MiB). Reuse the returned stored_file_id.

The direct endpoint accepts one JSON file, not a JSON request body. Example file content for first frame: {version:"minimax_h3_direct_v1",idempotency_key:"video-docs-frame-001",scenario:"first_frame_to_video",prompt:"A paper cube rotates.",resolution:"768P",duration:4,first_frame:{source_type:"stored_file",stored_file_id:"OWNED_FILE_ID"}}. Make converts native file buffers to data URLs before building this file. Direct source kinds are stored_file/url/data_url; make_file is not a direct JSON source type.

Reuse the idempotency key for reconciliation of the same payload. A changed payload with the same key conflicts; repeat_token deliberately requests another generation and must not be added to evade a timeout. Respect 429 and retry timing; a failed polling request does not cancel provider work. No dedicated MiniMax estimate route was found in this controller.

Routes and operations

OperationHTTPPathCondition / purpose
upload_mediaPOST/franklab/api/make/minimax/mediaDo not place a large data URI in a normal form field. Returns stored_file_id, media_kind, mime_type, size_bytes.
issue_idempotency_keyPOST/franklab/api/make/minimax/idempotency-keyReturns data.idempotency_key; a new key is not a retry policy.
create_video:text_to_videoPOST/franklab/api/make/minimax/videosREST supports stored-file form. Make uses this JSON route for text; reference scenarios use videos/direct.
create_video:first_frame_to_videoPOST/franklab/api/make/minimax/videosREST supports stored-file form. Make uses this JSON route for text; reference scenarios use videos/direct.
create_video:last_frame_to_videoPOST/franklab/api/make/minimax/videosREST supports stored-file form. Make uses this JSON route for text; reference scenarios use videos/direct.
create_video:first_last_frame_to_videoPOST/franklab/api/make/minimax/videosREST supports stored-file form. Make uses this JSON route for text; reference scenarios use videos/direct.
create_video:reference_to_videoPOST/franklab/api/make/minimax/videosREST supports stored-file form. Make uses this JSON route for text; reference scenarios use videos/direct.
create_video:directPOST/franklab/api/make/minimax/videos/directInside JSON: version=minimax_h3_direct_v1, idempotency_key, scenario (non-text), prompt, resolution, duration, optional repeat_token. first_frame/last_frame or reference_images/reference_videos/reference_audios carry source_type=stored_file / url / data_url and matching stored_file_id / url / data_url. Frame modes omit ratio; reference mode may supply ratio.
get_video_taskGET/franklab/api/make/minimax/videos/{taskId}
list_video_tasksGET/franklab/api/make/minimax/videosAlso backs getMiniMaxVideoTasks RPC (page 1,size 100).
cancel_or_delete_video_task:cancelPOST/franklab/api/make/minimax/videos/{taskId}/actionMutation; confirm durable terminal state and settlement separately.
cancel_or_delete_video_task:deletePOST/franklab/api/make/minimax/videos/{taskId}/actionMutation; confirm durable terminal state and settlement separately.
connection_probeGET/franklab/api/make/minimax/videosMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

upload_media

FieldTypeRequiredValue / constraint
source_typestringyesurl/make_file/data_url.
kindstringyesimage/video/audio.
urlstringconditional / noHTTPS URL for URL upload.
media_filebinaryconditional / noMultipart for make_file.
data_url_filebinaryconditional / noPlain-text multipart file containing the data URI.

create_video:text_to_video, create_video:first_frame_to_video, create_video:last_frame_to_video, create_video:first_last_frame_to_video, create_video:reference_to_video

FieldTypeRequiredValue / constraint
idempotency_keystringyesStable nonblank key, at most 200 characters.
scenariostringyestext_to_video/first_frame_to_video/last_frame_to_video/first_last_frame_to_video/reference_to_video.
promptstringyesNonblank, at most 7000 characters.
resolutionstringyes768P/2K.
durationintegeryes4–15 seconds.
ratiostringconditional / noText requires concrete ratio; frame modes require adaptive.
first_frame_stored_file_idstringconditional / noFirst owned image.
last_frame_stored_file_idstringconditional / noLast owned image.
reference_image_stored_file_idsarrayconditional / noUp to 9 unique owned IDs.
reference_video_stored_file_idsarrayconditional / noUp to 3 unique owned IDs.
reference_audio_stored_file_idsarrayconditional / noUp to 3 unique owned IDs.
repeat_tokenstringconditional / noDeliberate repeat only, at most 64 characters.

create_video:direct

FieldTypeRequiredValue / constraint
request_filebinaryyesOne UTF-8 JSON multipart file, MIME application/json, at most 96 MiB.

get_video_task

FieldTypeRequiredValue / constraint
taskIdstringyesPath local task ID.
wait_secondsintegerconditional / noQuery integer 0–30; default 0.

list_video_tasks

FieldTypeRequiredValue / constraint
page_numintegerconditional / no1-based.
page_sizeintegerconditional / noQuery integer 1–100; default 20.
statusstringconditional / noqueued/running/succeeded/failed/cancelled.
task_idsarrayconditional / noOptional IDs.
modelstringconditional / noMiniMax-H3.
task_typestringconditional / nogeneration.

cancel_or_delete_video_task:cancel

FieldTypeRequiredValue / constraint
taskIdstringyesPath local task ID.
actionstringyescancel.

cancel_or_delete_video_task:delete

FieldTypeRequiredValue / constraint
taskIdstringyesPath local task ID.
actionstringyesdelete.

Response and completion

Envelope code=200,msg=OK,data. task_id; queued/running/succeeded/failed/cancelled; succeeded video/video_url and owned stored_file_id; reserved_cost_franks, final_cost_franks, cost_status, usage, error. Lists data.items/page_num/page_size/total.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/minimax/videos" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"idempotency_key":"video-docs-synthetic-001","scenario":"text_to_video","prompt":"A blue paper cube rotates on a white background.","resolution":"768P","duration":4,"ratio":"16:9"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/minimax/videos/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab OMNI

Google subscription mode uses an operator-managed queue. Confirm access and expected processing time before using it in a time-sensitive workflow.

The public OMNI module is separate from SATURN's legacy /v1/videos/omni-video alias. Use /make/omni/videos. Make model=omni selects omni_version; model=veo selects veo_version; the REST model is the resulting concrete value. poll_status is a GET operation, not a submit value.

For image-to-video supply one image source; for reference-to-video supply structured image references. A direct URL example is {source:"url",image_url:"https://media.example.com/product-front.png",label:"cube"}. Use the same partner's returned interaction_id for edit/extend; never a provider-secret identifier. Extend is limited to omni_1_1; omni 1.0 rejects it. Veo uses 4/6/8 seconds, its own resolution and negative prompt; those options do not confer support on the Omni engine. GET /make/omni lists capabilities and supported inputs.

google_flow_sub calls the separate Google subscription route with execution_mode:"google_subscription" and reference URL strings. Its polling envelope differs. Upload returns URL only; file-ID inputs require a real stored-file record. No dedicated estimate route exists in the Make OMNI controller.

Routes and operations

OperationHTTPPathCondition / purpose
text_to_videoPOST/franklab/api/make/omni/videosextend requires omni_1_1; Make omni_version/veo_version become model.
image_to_videoPOST/franklab/api/make/omni/videosextend requires omni_1_1; Make omni_version/veo_version become model.
reference_to_videoPOST/franklab/api/make/omni/videosextend requires omni_1_1; Make omni_version/veo_version become model.
editPOST/franklab/api/make/omni/videosextend requires omni_1_1; Make omni_version/veo_version become model.
extendPOST/franklab/api/make/omni/videosextend requires omni_1_1; Make omni_version/veo_version become model.
veo3POST/franklab/api/make/omni/videosVeo model route; live feature gate required. Make sends operation=text_to_video when omitted; image_file_id may supply the first frame.
veo3_fastPOST/franklab/api/make/omni/videosVeo model route; live feature gate required. Make sends operation=text_to_video when omitted; image_file_id may supply the first frame.
poll_statusGET/franklab/api/make/omni/status/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
capabilitiesGET/franklab/api/make/omniSource capability response including supported operations/models and current Veo gate projection.
google_flow_subPOST/franklab/api/v1/videos/google-subDistinct subscription route; not model=google_flow_sub on make/omni/videos.
poll_statusGET/franklab/api/v1/videos/google-sub/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/make/omniMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

text_to_video, image_to_video, reference_to_video, edit, extend, veo3, veo3_fast

FieldTypeRequiredValue / constraint
operationstringyestext_to_video/image_to_video/reference_to_video/edit/extend.
modelstringconditional / noomni/omni_1_1/veo3/veo3_fast.
promptstringyesNonempty, at most 2500 characters.
aspect_ratiostringconditional / no16:9/9:16.
image_urlstringconditional / noImage URL source.
image_file_idstringconditional / noOwned image ID.
image_file_datastringconditional / noBase64/native file source.
image_file_namestringconditional / noFilename for file data.
image_base64stringconditional / noBase64 source.
reference_imagesarrayconditional / no[{source,image_url / image_file_id / image_base64 / image_file_data,image_file_name?,label?}].
previous_interaction_idstringconditional / noRequired existing partner-owned interaction for edit/extend.
duration_secondsintegerconditional / noVeo only 4/6/8.
resolutionstringconditional / noVeo only 720p/1080p/4k.
negative_promptstringconditional / noVeo only, at most 1000 characters.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

google_flow_sub

FieldTypeRequiredValue / constraint
execution_modestringyesgoogle_subscription.
promptstringyesScene description.
duration_secondsnumberconditional / noMake choices 4/6/8/10.
aspect_ratiostringconditional / no16:9/9:16/1:1/4:3/3:4.
reference_imagesarrayconditional / noURL strings.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Make OMNI code/msg/data: taskId/task_id, status, videoUrl, interaction_id and billing fields. Poll completed/failed/processing; retain the interaction handle for edit/extend. google-sub uses proxy task_status/task_result.videos instead.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/omni/videos" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"model":"omni_1_1","operation":"text_to_video","prompt":"A blue paper cube rotates on a white background.","aspect_ratio":"16:9"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/omni/status/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab SATURN

Select model_name:"saturn-v1" or "saturn-v1-5"; do not send Make's version selector in REST. Standard SATURN supports text, images, reference video, elements, voices and multi-shot controls with model-specific constraints. A reference item is {image_url:"https://media.example.com/product-front.png"}; each item must carry exactly one source. Native/base64 image inputs are limited to 10 MiB each. Video reference entries use video_url, optionally refer_type and keep_original_sound. Voice list supports up to two IDs.

Turbo has two explicit routes and model saturn-v1-5-turbo; standard reference/multi-shot/audio/quality controls are not interchangeable. Image Turbo derives framing from the image; text Turbo can set aspect_ratio. Extension reuses an existing video_id or owner-scoped source_task_id; no new source ID can be invented. Multi-image generation has its own route and status route.

Save the status route for the selected variant together with its task ID. Legacy /videos/omni-video aliases belong to SATURN, not Gemini OMNI.

Routes and operations

OperationHTTPPathCondition / purpose
v1POST/franklab/api/v1/videos/saturnMake version selects model_name=saturn-v1.
v1-5POST/franklab/api/v1/videos/saturnMake version selects model_name=saturn-v1-5.
v1-5-turbo:textPOST/franklab/api/v1/videos/saturn-turbo/text-to-videoDo not send standard SATURN multi-shot/reference/sound/mode controls to Turbo.
v1-5-turbo:imagePOST/franklab/api/v1/videos/saturn-turbo/image-to-videoDo not send standard SATURN multi-shot/reference/sound/mode controls to Turbo.
video_extendPOST/franklab/api/v1/videos/video-extendResolve a real source video; Make does not forward requested duration in extension.
multi_image2videoPOST/franklab/api/v1/videos/multi-image2video
poll_statusGET/franklab/api/v1/videos/saturn/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
poll_statusGET/franklab/api/v1/videos/saturn-turbo/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
poll_statusGET/franklab/api/v1/videos/video-extend/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
poll_statusGET/franklab/api/v1/videos/multi-image2video/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
getAllKusoksGET/franklab/api/make/kusok/elementsSupporting RPC; preserve returned IDs.
getElementVoicesGET/franklab/api/v1/elements/voicesSupporting RPC; preserve returned IDs.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/videos/saturnMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

v1, v1-5

FieldTypeRequiredValue / constraint
promptstringconditional / noScene description.
durationintegeryesClip seconds 3–15.
model_namestringconditional / noPublic model alias.
modestringconditional / noQuality mode.
aspect_ratiostringconditional / noOutput ratio.
callback_urlstringconditional / noOptional HTTPS callback.
external_task_idstringconditional / noCaller correlation ID, not a provider ID.
soundstringconditional / noon/off.
image_listarrayconditional / noExactly one image_url/image_base64/image_file_data source per item; optional image_file_name/type.
video_listarrayconditional / no[{video_url,refer_type?,keep_original_sound?}].
element_listarrayconditional / no[{element_id}].
voice_listarrayconditional / no[{voice_id}], at most 2.
multi_shotbooleanconditional / noMultiple shots.
shot_typestringconditional / nocustomize/intelligence.
multi_promptarrayconditional / no[{index,prompt,duration}].

v1-5-turbo:text, v1-5-turbo:image

FieldTypeRequiredValue / constraint
model_namestringconditional / nosaturn-v1-5-turbo.
promptstringconditional / noRequired for text.
imagestringconditional / noRequired for image.
durationintegerconditional / no3–15; default 5.
resolutionstringconditional / no720p/1080p.
aspect_ratiostringconditional / noText only 16:9/9:16/1:1.
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noCorrelation.

video_extend

FieldTypeRequiredValue / constraint
video_idstringconditional / noExisting output video ID.
source_task_idstringconditional / noOwner-scoped source task for resolving the video.
promptstringconditional / noAt most 2500 characters.
negative_promptstringconditional / noAt most 500.
cfg_scalenumberconditional / no0–1.
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noCorrelation.

multi_image2video

FieldTypeRequiredValue / constraint
image_listarrayyes[{image_url,type?}].
model_namestringconditional / noPublic model.
promptstringconditional / noUp to 2500 characters.
durationintegerconditional / no3–15.
modestringconditional / noQuality.
aspect_ratiostringconditional / noRatio.
soundbooleanconditional / noNative audio.
element_listarrayconditional / no[{element_id}].
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noCorrelation.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

getAllKusoks, getElementVoices

FieldTypeRequiredValue / constraint
pageNumintegerconditional / no1-based.
pageSizeintegerconditional / noMake requests 500.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Proxy envelope: code=0 (some routes accept 200), data.task_id. Poll data.task_status; successful task_result.videos[] contains url/id/duration. Read task_status_msg on failure. final_cost_franks is meaningful together with cost_status/cost_unit; reserved is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/saturn" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"model_name":"saturn-v1","prompt":"A blue paper cube rotates on a white background.","duration":3,"mode":"std","aspect_ratio":"16:9"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/saturn/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab VECTOR

VECTOR transfers motion from a reference video to an anchor image. Provide an image and public video URL; Make describes a 3–30-second reference clip. character_orientation:"image"|"video" selects the orientation source, keep_original_sound:"yes"|"no" controls reference audio. Profiles are auto, studio, cinema (REST also accepts compatibility aliases vector-v1/vector-v1-5). Quality is std/pro.

For an image use URL, base64/data URI, or image_file_data plus image_file_name for native bytes. JPG/PNG/WebP, up to 10 MiB in the Make input contract. Optional elements are {element_id} objects. list_tasks is GET with query parameters and no creation body. The Make action/task selectors are not REST request fields. Generation requires a reference video and an anchor image; listing tasks only reads their metadata.

Routes and operations

OperationHTTPPathCondition / purpose
createPOST/franklab/api/v1/videos/motion-controlMake anchor_image→image, anchor_video→video, anchor_source→character_orientation, quality_mode→mode, preserve_reference_audio→keep_original_sound, reference_anchor_list→element_list.
list_tasksGET/franklab/api/v1/videos/motion-controlPartner-scoped list; data and pagination contain tasks.
poll_statusGET/franklab/api/v1/videos/motion-control/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/videos/motion-controlMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

create

FieldTypeRequiredValue / constraint
imagestringyesAnchor image URL or supported base64.
image_file_datastringconditional / noAlternative base64/native file data.
image_file_namestringconditional / noFilename for native data.
videostringyesPublic reference video URL.
character_orientationstringyesimage/video.
modestringconditional / nostd/pro.
generation_profilestringconditional / noauto/studio/cinema.
keep_original_soundstringconditional / noyes/no.
promptstringconditional / noAt most 2500 characters.
durationstringyesRequired string seconds 3–30; image orientation at most 10. Must match reference clip.
element_listarrayconditional / no[{element_id}].
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noAt most 100 characters.

list_tasks

FieldTypeRequiredValue / constraint
pageNumintegerconditional / noDefault 1.
pageSizeintegerconditional / noDefault 30.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Proxy envelope: code=0 (some routes accept 200), data.task_id. Poll data.task_status; successful task_result.videos[] contains url/id/duration. Read task_status_msg on failure. final_cost_franks is meaningful together with cost_status/cost_unit; reserved is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/motion-control" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"generation_profile":"studio","mode":"std","image":"OWNED_SYNTHETIC_IMAGE_URL","video":"OWNED_SYNTHETIC_MOTION_VIDEO_URL","character_orientation":"image","keep_original_sound":"no","duration":"3"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/motion-control/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab VENUS

Provide an anchor image and either sound_file (URL/base64/native file) or an existing audio_id. Make documents MP3/WAV/M4A/AAC audio files up to 5 MiB and 2–60 seconds; audio IDs may represent 2–300 seconds and must be recent (30 days). Native fields are image_file_data/image_file_name and sound_file_data/sound_file_name. Do not send both audio alternatives.

Make creates /v1/videos/avatar/image2video then polls /v1/tasks/{taskId}. Success requires a video in task_result.videos. Read the returned billing fields and your transaction history; a missing amount does not mean the request was free.

Routes and operations

OperationHTTPPathCondition / purpose
create_avatar_videoPOST/franklab/api/v1/videos/avatar/image2videoSupply one image source and one audio source; Make selectors image_source/audio_source/sound_input_source are not REST fields.
poll_statusGET/franklab/api/v1/tasks/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
avatar_statusGET/franklab/api/v1/videos/avatar/image2video/{taskId}Dedicated status alias; Make uses v1/tasks.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/videos/avatar/image2videoMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

create_avatar_video

FieldTypeRequiredValue / constraint
imagestringyesImage URL or base64.
image_file_datastringconditional / noAlternative native/base64 image bytes.
image_file_namestringconditional / noFilename.
sound_filestringconditional / noAudio URL/base64; alternative to audio_id.
sound_file_datastringconditional / noAlternative native/base64 audio.
sound_file_namestringconditional / noFilename.
audio_idstringconditional / noExisting compatible TTS audio ID; alternative to sound_file.
promptstringconditional / noOptional performance prompt.
modestringyesstd/pro.
callback_urlstringconditional / noCallback.
external_task_idstringconditional / noCorrelation.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

avatar_status

FieldTypeRequiredValue / constraint
taskIdstringyesReturned task ID.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Proxy envelope: code=0 (some routes accept 200), data.task_id. Poll data.task_status; successful task_result.videos[] contains url/id/duration. Read task_status_msg on failure. final_cost_franks is meaningful together with cost_status/cost_unit; reserved is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/avatar/image2video" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"image":"OWNED_SYNTHETIC_AVATAR_URL","sound_file":"OWNED_SYNTHETIC_AUDIO_URL","mode":"std"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/tasks/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

FrankLab X

Use operation:"generation" with text only, image_url, or reference_images:[{url:ownedURL}]. Image and reference arrays are mutually exclusive. Make's source_mode is a UI selector and is not sent to REST. For edit or extension, provide video_url, omit image/reference inputs; extension may omit prompt. Duration is 1–15 seconds for generation/edit and 2–10 for extension; Make exposes a smaller set of convenient choices.

Without an explicit recognized model, single-image generation selects the latest image-to-video model; text and references use the compatible model. 1080p is restricted to latest single-image generation. execution_mode:"supergrok" supports generation from text/images/references only, requires publicly accessible HTTPS image URLs and separate partner admission; no edit/extend/video input. Its supported output limits can differ from the direct xai_api route. Confirm access to the chosen execution mode before submission; do not switch modes automatically after a failure.

POST returns a FrankLab task ID; GET the same X route until terminal status and a usable URL. Keep cost_status with final_cost_franks. There is no dedicated estimate route in this controller; check your account’s pricing before creating a task.

Routes and operations

OperationHTTPPathCondition / purpose
generation:text_to_videoPOST/franklab/api/v1/videos/xaiMake source_mode only chooses which REST inputs are sent. No silent execution-mode fallback.
generation:image_to_videoPOST/franklab/api/v1/videos/xaiMake source_mode only chooses which REST inputs are sent. No silent execution-mode fallback.
generation:reference_to_videoPOST/franklab/api/v1/videos/xaiMake source_mode only chooses which REST inputs are sent. No silent execution-mode fallback.
editPOST/franklab/api/v1/videos/xaiMake source_mode only chooses which REST inputs are sent. No silent execution-mode fallback.
extensionPOST/franklab/api/v1/videos/xaiMake source_mode only chooses which REST inputs are sent. No silent execution-mode fallback.
poll_statusGET/franklab/api/v1/videos/xai/{taskId}Keep the returned ID; polling is a read of the existing task, never a new submission.
upload_sourcePOST/franklab/api/franklab/jobs/uploadPartner API key authentication. Response {success:true,data:{url,storedFileId,mimeType,sizeBytes}}; retained 7 days. See the media input guide for measured metadata.
connection_probeGET/franklab/api/v1/images/omni-imageMake connection check. For new tasks, use the operation-specific submit and status routes above.

REST parameters

generation:text_to_video, generation:image_to_video, generation:reference_to_video, edit, extension

FieldTypeRequiredValue / constraint
operationstringyesgeneration/edit/extension.
execution_modestringconditional / noxai_api/supergrok.
promptstringconditional / noRequired except extension.
image_urlstringconditional / noSingle image input.
reference_imagesarrayconditional / no[{url}] alternative to image_url.
video_urlstringconditional / noRequired for edit/extension.
aspect_ratiostringconditional / noRatio for generation.
resolutionstringconditional / no480p/720p; 1080p only latest single-image generation.
durationnumberconditional / noGeneration/edit 1–15; extension 2–10; default 5.

poll_status

FieldTypeRequiredValue / constraint
taskIdstringyesPath: returned FrankLab task ID.

upload_source

FieldTypeRequiredValue / constraint
filebinaryyesMultipart file; 150 MiB maximum; supported image/video/audio MIME.

Response and completion

Proxy envelope: code=0 (some routes accept 200), data.task_id. Poll data.task_status; successful task_result.videos[] contains url/id/duration. Read task_status_msg on failure. final_cost_franks is meaningful together with cost_status/cost_unit; reserved is not final settlement.

Minimal example

Replace OWNED_* placeholders with URLs of your own files. Check model access, the estimated cost and your available balance before submitting.

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/xai" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"operation":"generation","execution_mode":"xai_api","prompt":"A blue paper cube rotates on a white background.","duration":1,"resolution":"480p","aspect_ratio":"16:9"}'
bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/v1/videos/xai/$TASK_ID" \
  -H "X-API-Key: $FRANKLAB_KEY"

Uploads and result retention

bash
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/franklab/jobs/upload" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -F "file=@synthetic.png;type=image/png"

Upload returns data.url, data.storedFileId, data.mimeType and data.sizeBytes. Use data.url for URL fields. To obtain measured dimensions, duration or other descriptor metadata, send the returned storedFileId to the import route below. Save completed results before their retention expires.

Import a reference and build its descriptor

For fields such as Alibaba firstFrame, import the image to obtain an owned file ID and measured metadata. Send exactly one source: a direct public HTTPS url, or the storedFileId from a previous upload under the same account. kind selects image, video, audio or document. Image import accepts PNG/JPEG/WebP up to 30 MiB; video MP4/MOV/WebM up to 100 MiB; audio up to 50 MiB; documents PDF/TXT/MD up to 20 MiB. Export office documents as PDF first. The target generation operation may impose smaller limits or fewer formats.

This example imports an image, selects its descriptor fields with jq, and submits a first-frame video request. Replace the example URL with your direct image link. The generation step uses your balance; import does not create a generation task.

bash
set -e
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/franklab/jobs/import" \
  -H "Authorization: Bearer $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data '{"url":"https://media.example.com/product-front.png","kind":"image"}' \
  -o imported-image.json

jq -e '.data | {storedFileId,url,mimeType,width,height,sizeBytes} | select(.storedFileId and .url and .width and .height)' imported-image.json > first-frame.json
jq -n --slurpfile firstFrame first-frame.json \
  '{operation:"image_to_video",prompt:"The product slowly rotates on a table.",resolution:"720P",durationSeconds:3,firstFrame:$firstFrame[0]}' > video-request.json
curl --fail-with-body -sS "$FRANKLAB_BASE_URL/make/alibaba/videos" \
  -H "X-API-Key: $FRANKLAB_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @video-request.json

For a previously uploaded image, replace the import body with {"storedFileId":"ID_FROM_UPLOAD_RESPONSE","kind":"image"}. Use the real data.storedFileId; do not send url in the same request.

/en/docs/video-api.md
Need help?Contact support