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. Contracts were checked against source on 8 September 2026; 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. A presumed refund is not verified settlement.

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

Known limitation, 8 September 2026: the HappyHorse 1.1 480P check exposed a completion error, lifecycle_conflict. Submission is accepted, but the result and final settlement are unavailable. Avoid 480P until resolved. Keep an existing task ID and contact support; another POST creates a new task.

HappyHorse 1.1 supports text and first-frame generation. 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. hh10_edit maps to video_edit with model:"happyhorse-1.0-video-edit".

REST does not accept wan3.0-video-prime, even though Make lists it. HappyHorse 1.1 accepts 480P/720P/1080P; HappyHorse 1.0 edit accepts 720P/1080P. 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. 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 only returns a URL, so by itself it does not furnish a complete Alibaba descriptor. Obtain the required owned file IDs and metadata before submitting image or video input.

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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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 rejected by the current DTO.
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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probePOST/franklab/api/make/alibaba/estimateMake connection probe only; no generated output or provider entitlement is verified. Make sends media=image to the read-only estimator and rejects only 401/403; it does not quote a video or prove model availability. {"media": "image"}

REST parameters

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

FieldTypeRequiredValue / constraint
operationstringyestext_to_video/image_to_video/reference_to_video/video_edit/video_extend/file_to_video/link_to_video.
modelstringconditional / noOmit for HappyHorse 1.1; wan3.0-video or happyhorse-1.0-video-edit for other families.
promptstringyesNonempty, at most 5000 code points in service.
resolutionstringyesUppercase 480P/720P/1080P; HappyHorse 1.1 supports all three; HappyHorse 1.0 edit only 720P/1080P.
durationSecondsintegeryesHappyHorse 3–15; WAN 2–30 or -1 automatic (reserve for 30 seconds).
ratiostringconditional / noRequired for HappyHorse text; adaptive only where model/operation permits.
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 edit image descriptors, 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 probe only; no generated output or provider entitlement is verified. {}

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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/videos/text2videoMake connection probe only; no generated output or provider entitlement is verified. {"pageNum": 1, "pageSize": 1}

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. Uploaded owned media URLs are preferable; do not substitute customer assets in tests.

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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/moon/videos/tasks/_connection_test_Make connection probe only; no generated output or provider entitlement is verified. Uses the real status route with sentinel task ID connection_test; Make rejects only 401/403, so a 404 is not generation readiness. {}

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 probe only; no generated output or provider entitlement is verified. {"page_num": 1, "page_size": 1, "model": "MiniMax-H3", "task_type": "generation"}

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 is serviced by a separate operator. The 8 September 2026 check remained in the manual processing queue; automatic completion and an ETA are not established. This limitation concerns subscription mode, not all OMNI models.

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 reference example is {source:"url",image_url:ownedURL,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 provides capability information but does not prove a completed generation.

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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/make/omniMake connection probe only; no generated output or provider entitlement is verified. {}

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:ownedURL}; 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.

AI preset list/generate are visible in Make and implemented as service methods, but the matching controller routes are absent in this source snapshot. They remain documented as BLOCKED. Preserve each variant's status route when polling; an old task ID must not cause another submit. 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
ai_presets:listGET/franklab/api/v1/general/ai-multi-shotBLOCKED: Make communication and service methods exist, but no matching Nest controller route is registered in current source. Do not invoke as a supported REST endpoint.
ai_presets:generatePOST/franklab/api/v1/general/ai-multi-shot/{presetId}BLOCKED: Make communication and service methods exist, but no matching Nest controller route is registered in current source. Do not invoke as a supported REST endpoint.
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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/videos/saturnMake connection probe only; no generated output or provider entitlement is verified. {"pageNum": 1, "pageSize": 1}

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.

ai_presets:list

FieldTypeRequiredValue / constraint
pageNumintegerconditional / noList page.
pageSizeintegerconditional / noList size.

ai_presets:generate

FieldTypeRequiredValue / constraint
presetIdstringyesPath preset ID; route currently unregistered.
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}].

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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/videos/motion-controlMake connection probe only; no generated output or provider entitlement is verified. {"pageNum": 1, "pageSize": 1}

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. The service has both tracked and legacy proxy paths selected by a runtime flag; missing cost fields must not be reported as zero cost or a verified refund. Verify actual billing evidence separately.

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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/videos/avatar/image2videoMake connection probe only; no generated output or provider entitlement is verified. {"pageNum": 1, "pageSize": 1}

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. Do not infer entitlement from source options or switch execution 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}}; retained 7 days. Does not return storedFileId or measured media metadata.
connection_probeGET/franklab/api/v1/images/omni-imageMake connection probe only; no generated output or provider entitlement is verified. GET image-task list is used solely to test the connection; this is not a file-upload helper or an X video submission. {"pageNum": 1, "pageSize": 1}

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 response: {"success":true,"data":{"url":"..."}}. Use the actual returned URL. This response has no storedFileId, dimensions, fps or duration. ID/descriptor inputs require a separately verified owned file record. Retrieve completed results before their retention expires; do not publish signed URLs in logs or reports.

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