Documentation
FRANKLAB API

Images, text and audio

JUPITER, Alibaba Image, MOON GPT, KUSOK, ORKESTR and VOLNA: operations and requests.

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 six Make modules; access and pricing depend on your account and the selected operation.

Connection and request execution

Paths below include /franklab/api. Authenticate with your account key in X-API-Key; keep it in a server environment variable. Single-request template:

bash
export FRANKLAB_BASE_URL='https://apergrex.ru/franklab/api'
# FRANKLAB_KEY is already set through your secure environment
cat > request.json <<'JSON'
{"model_key":"moon_gpt","prompt":"Return the word OK.","max_output_tokens":16,"async_mode":true}
JSON
curl --fail-with-body --max-time 300 -X POST \
  -H "X-API-Key: ${FRANKLAB_KEY:?Set your account key}" \
  -H 'Content-Type: application/json' \
  --data-binary @request.json \
  "$FRANKLAB_BASE_URL/make/dola/generate"

The example generates content and may reserve funds. For another operation replace the route suffix, method and JSON using its table. REPLACE_WITH_… and example.com are templates to replace with your own IDs/media; do not run all examples in sequence. GET takes the stated query parameters and substituted path IDs, with no body.

Required fields and choices apply to the selected operation; conditions are shown separately. “Make default” is a form value that REST clients must explicitly send to reproduce Make behavior; it is not a promise of a server default.

Billing, errors and retries

Check your balance and tariff first. Alibaba provides /make/alibaba/estimate; generic /v1/billing/pricing/estimate takes a modelId from current /v1/billing/pricing/catalog and supported quote parameters. Catalog pricing IDs are not automatically model_key/model_name. Other operations may lack a standalone public quote; unknown cost is not zero. Reconcile the task reservation, final charge and refund with transactions. Frank (₣) is an internal accounting unit.

Errors: 400 invalid fields/model/media, 401 key failure, 403 access denied, 404 missing or inaccessible owned resource, 429 rate limit. Unavailable models, insufficient balance and execution errors can also appear in code, message/msg, data.error/error_message even with HTTP 200. Check HTTP and body. If POST outcome is unknown, retain identifiers and reconcile history/support before retrying; never blindly repeat paid submission. State, error and result shapes are module-specific.

FrankLab Alibaba Image

If an estimate is unavailable for your account, confirm model access with support before submitting a generation.

Generate a Z-Image image or generate/edit with Qwen Image 3.0 and Qwen Image 3.0 Pro. These are synchronous REST operations: inspect the response before trying to poll. Check that your account has access to the selected model for estimation and generation.

For Qwen editing, set operation:"image_edit" and pass editImageUrls: 1–3 direct public HTTPS image URLs, PNG/JPEG/WebP, at most 10 MiB per image. The server imports the images for your account. Alternatively, upload each image with multipart file to POST /franklab/api/franklab/jobs/upload and collect each response's data.storedFileId into editImageIds. Send exactly one of editImageUrls or editImageIds; IDs must belong to your account. Qwen width/height must be supplied, each at most 2048, with total area between 512² and 2048² pixels; n is 1–6 (default 1). prompt_extend_mode=agent only works for text-to-image. Qwen output is PNG. Z-Image size uses *, such as 1024*1024.

On success inspect data.imageUrl (first image), data.taskId, dimensions and estimated_cost_franks/final_cost_franks/cost_status. HTTP success alone is insufficient: also inspect code and error_message. Estimates are customer quotes and do not create images. Qwen estimates use qwenOperation; generation uses operation. /make/alibaba/status/:taskId polls video and must not be used for these image results.

OperationMethodPath
z-image-turbo:text_to_imagePOST/franklab/api/make/alibaba/images
qwen-image-3.0-pro:text_to_imagePOST/franklab/api/make/alibaba/images
qwen-image-3.0-pro:image_editPOST/franklab/api/make/alibaba/images
qwen-image-3.0:text_to_imagePOST/franklab/api/make/alibaba/images
qwen-image-3.0:image_editPOST/franklab/api/make/alibaba/images
estimatePOST/franklab/api/make/alibaba/estimate

z-image-turbo:text_to_image

POST /franklab/api/make/alibaba/images

REST fieldTypeRequiredValues / conditions
modelstringyes"z-image-turbo"
promptstringyes—
sizestringyes["1024*1024","832*1248","1248*832","864*1152","1152*864","896*1152","1152*896","720*1280","576*1344","1280*720","1344*576","1280*1280","1024*1536","1536*1024","1104*1472","1472*1104","1120*1440","1440*1120","864*1536","720*1680","1536*864","1680*720","1536*1536","1248*1872","1872*1248","1296*1728","1728*1296","1344*1728","1728*1344","1152*2048","864*2016","2048*1152","2016*864"]; Make default: "1024*1024"
seedintegerno—

JSON template:

json
{
  "model": "z-image-turbo",
  "prompt": "A short calm synthetic test.",
  "size": "1024*1024"
}

qwen-image-3.0-pro:text_to_image

POST /franklab/api/make/alibaba/images

REST fieldTypeRequiredValues / conditions
modelstringyes"qwen-image-3.0-pro"
operationstringyes"text_to_image"
promptstringyes—
widthintegeryesMake default: 1024
heightintegeryesMake default: 1024
nintegernoServer default: 1
seedintegerno—
negative_promptstringno—
prompt_extendbooleannoMake default: false
prompt_extend_modestringno["direct","agent"]; Make default: "direct"
enable_thinkingbooleannoMake default: false
watermarkbooleannoMake default: false

JSON template:

json
{
  "model": "qwen-image-3.0-pro",
  "operation": "text_to_image",
  "prompt": "A short calm synthetic test.",
  "width": 1024,
  "height": 1024
}

qwen-image-3.0-pro:image_edit

POST /franklab/api/make/alibaba/images

REST fieldTypeRequiredValues / conditions
modelstringyes"qwen-image-3.0-pro"
operationstringyes"image_edit"
promptstringyes—
widthintegeryesMake default: 1024
heightintegeryesMake default: 1024
nintegernoServer default: 1
editImageUrlsstring[]conditional1–3 direct HTTPS URLs; PNG/JPEG/WebP, ≤10 MiB each; omit editImageIds.
editImageIdsstring[]conditional1–3 owned UUIDs from upload data.storedFileId; omit editImageUrls.
seedintegerno—
negative_promptstringno—
prompt_extendbooleannoMake default: false
enable_thinkingbooleannoMake default: false
watermarkbooleannoMake default: false

JSON template:

json
{
  "model": "qwen-image-3.0-pro",
  "operation": "image_edit",
  "prompt": "Replace the background with a pale blue studio backdrop.",
  "width": 1024,
  "height": 1024,
  "editImageUrls": [
    "https://media.example.com/product-front.png"
  ]
}

qwen-image-3.0:text_to_image

POST /franklab/api/make/alibaba/images

REST fieldTypeRequiredValues / conditions
modelstringyes"qwen-image-3.0"
operationstringyes"text_to_image"
promptstringyes—
widthintegeryesMake default: 1024
heightintegeryesMake default: 1024
nintegernoServer default: 1
seedintegerno—
negative_promptstringno—
prompt_extendbooleannoMake default: false
prompt_extend_modestringno["direct","agent"]; Make default: "direct"
enable_thinkingbooleannoMake default: false
watermarkbooleannoMake default: false

JSON template:

json
{
  "model": "qwen-image-3.0",
  "operation": "text_to_image",
  "prompt": "A short calm synthetic test.",
  "width": 1024,
  "height": 1024
}

qwen-image-3.0:image_edit

POST /franklab/api/make/alibaba/images

REST fieldTypeRequiredValues / conditions
modelstringyes"qwen-image-3.0"
operationstringyes"image_edit"
promptstringyes—
widthintegeryesMake default: 1024
heightintegeryesMake default: 1024
nintegernoServer default: 1
editImageUrlsstring[]conditional1–3 direct HTTPS URLs; PNG/JPEG/WebP, ≤10 MiB each; omit editImageIds.
editImageIdsstring[]conditional1–3 owned UUIDs from upload data.storedFileId; omit editImageUrls.
seedintegerno—
negative_promptstringno—
prompt_extendbooleannoMake default: false
enable_thinkingbooleannoMake default: false
watermarkbooleannoMake default: false

JSON template:

json
{
  "model": "qwen-image-3.0",
  "operation": "image_edit",
  "prompt": "Replace the background with a pale blue studio backdrop.",
  "width": 1024,
  "height": 1024,
  "editImageUrls": [
    "https://media.example.com/product-front.png"
  ]
}

estimate

For an image-edit estimate, send qwenOperation:"image_edit", imageCount, width, height and n with the selected model. Estimates do not download reference URLs.

For image quotes use model=z-image-turbo|qwen-image-3.0-pro|qwen-image-3.0. Omit model for HappyHorse video quotes; use wan3.0-video for WAN. happyhorse-1.1 is a Make selector, not an accepted REST DTO value.

POST /franklab/api/make/alibaba/estimate

REST fieldTypeRequiredValues / conditions
mediastringyes—
modelstringno—
operationstringno—
widthintegerno—
heightintegerno—
nintegerno—
imageCountintegerno—
resolutionstringno—
durationSecondsintegerno—
qwenOperationstringnotext_to_image / image_edit; Qwen quote only

JSON template:

json
{
  "media": "image",
  "model": "z-image-turbo"
}

JUPITER

Choose a route and model before submission. The Make mode selects the route and is not sent in the REST body. MIST uses model_name=mist, Kling uses jupiter-v1-5; Gemini/Seedream use model_id; subscription routes use execution_mode. Each route can have independent availability. A model list does not guarantee generation access.

Reference shapes differ: MIST/Kling/Gemini use image_list:[{"image_url":"https://…"}]; Seedream uses image:["https://…"]; subscription routes use reference_images:["https://…"]; legacy Nano Banana Pro uses image_input:["https://…"]; Grok editing uses image:{"url":"https://…"}. Direct public HTTPS URLs are supported; uploading first is optional. For Kling (model_name:"jupiter-v1-5"), reference each image_list entry in prompt as <<<image_1>>>, <<<image_2>>>, and so on, in array order. MIST does not require these tokens.

Save both the submit route and data.task_id/data.taskId. Most status routes append /:taskId; legacy Nano Banana Pro instead uses /v1/google/:taskId/record-info. Do not send a Gemini or Seedream task to the omni-image poller. Poll about every 5 seconds with a bounded deadline. Inspect data.status, task_status or state; successful aliases include completed, succeed, success, succeeded, done. Failed/refunded/cancelled states stop polling. A wait timeout does not authorize resubmission.

Images may be in data.images, data.task_result.images, data.result.task_result.images, data.output.images or data.output.imageUrls; older responses can contain JSON-encoded data.resultJson.resultUrls. Gemini can also return output_text, grounding, citations, search_suggestions and interaction_id. Read actual REST fields; Make's flattened image_url is a convenience projection. final_cost_franks accompanied by cost_status=reserved is still a reservation.

OperationMethodPath
mistPOST/franklab/api/v1/images/omni-image
mist_2_5POST/franklab/api/v1/images/omni-image
gpt_image_codexPOST/franklab/api/v1/images/gpt-image-codex
google_sub_imagePOST/franklab/api/v1/images/google-sub
jupiterPOST/franklab/api/v1/images/omni-image
xai_imagine_image_2POST/franklab/api/v1/images/xai-imagine
xai_imagine_imagePOST/franklab/api/v1/images/xai-imagine
google_gemini_imagePOST/franklab/api/v1/google/gemini-image
seedream_imagePOST/franklab/api/v1/images/seedream-image
google_nano_banana_proPOST/franklab/api/v1/google/nano-banana-pro
poll:v1/google/:taskId/record-infoGET/franklab/api/v1/google/:taskId/record-info
poll:v1/google/gemini-image/:taskIdGET/franklab/api/v1/google/gemini-image/:taskId
poll:v1/images/google-sub/:taskIdGET/franklab/api/v1/images/google-sub/:taskId
poll:v1/images/gpt-image-codex/:taskIdGET/franklab/api/v1/images/gpt-image-codex/:taskId
poll:v1/images/omni-image/:taskIdGET/franklab/api/v1/images/omni-image/:taskId
poll:v1/images/seedream-image/:taskIdGET/franklab/api/v1/images/seedream-image/:taskId
poll:v1/images/xai-imagine/:taskIdGET/franklab/api/v1/images/xai-imagine/:taskId

mist

POST /franklab/api/v1/images/omni-image

Poll: GET /franklab/api/v1/images/omni-image/:taskId.

REST fieldTypeRequiredValues / conditions
model_namestringyes"mist"
qualitystringno["auto","low","medium","high"]; Make default: "auto"
output_formatstringno["png","jpeg","webp"]; Make default: "png"
backgroundstringno["auto","opaque"]; Make default: "auto"
moderationstringno["auto","low"]; Make default: "auto"
partial_imagesstringno[0,1,2,3]; Make default: 0
input_fidelitystringno["high","auto"]; Make default: "high"
promptstringyes—
image_listarraynoimage_url:string
aspect_ratiostringno["1:1","16:9","9:16","21:9","custom"]; Make default: "1:1"
custom_aspect_ratiostringnoWhen aspect_ratio=custom
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_name": "mist",
  "prompt": "Place this product on a wooden table.",
  "image_list": [{"image_url": "https://media.example.com/product-front.png"}]
}

mist_2_5 (GPT Image 2.5)

POST /franklab/api/v1/images/omni-image — same route and polling as mist; the model is selected by the model_name value.

REST fieldTypeRequiredValues / conditions
model_namestringyes"gpt-image-2.5-sunburst" (highest fidelity) or "gpt-image-2.5-flare" (~2x faster); both variants bill identically
qualitystringno["auto","low","medium","high","xhigh","max"] — xhigh/max are new 2.5 tiers; Make default: "auto"
output_formatstringno["png","jpeg","webp"]; Make default: "png"
backgroundstringno["auto","opaque","transparent"] — transparent is fully supported and requires png/webp; Make default: "auto"
moderationstringno["auto","low"]; Make default: "auto"
partial_imagesstringno[0,1,2,3]; Make default: 0
input_fidelity——NOT supported on 2.5 (OpenAI: omit for gpt-image-2 and later) — returns 400
promptstringyes—
image_listarraynoup to 16 references image_url:string (edit mode)
aspect_ratiostringno["1:1","16:9","9:16","21:9","custom"]; Make default: "1:1"
custom_aspect_ratiostringnoWhen aspect_ratio=custom
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_name": "gpt-image-2.5-sunburst",
  "prompt": "Place this product on a wooden table, photorealistic.",
  "quality": "xhigh",
  "output_format": "webp",
  "background": "transparent"
}

gpt_image_codex

POST /franklab/api/v1/images/gpt-image-codex

Poll: GET /franklab/api/v1/images/gpt-image-codex/:taskId.

REST fieldTypeRequiredValues / conditions
execution_modestringyes"openai_codex"
modelstringno["gpt-image-2","gpt-image-2.5-flare","gpt-image-2.5-sunburst"]; Make default: "gpt-image-2". Alias: model_name (precedence: first non-empty of model/model_name; an empty string counts as absent). Unknown value → 400
qualitystringno["low","medium","high"]; Make default: "medium"
promptstringyes—
reference_imagesarraynoitems: string
aspect_ratiostringno["1:1","16:9","9:16","custom"]; Make default: "1:1"
custom_aspect_ratiostringnoWhen aspect_ratio=custom
callback_urlstringno—
external_task_idstringno—

Notes on model:

  • Pricing does not depend on the model: the tariff is set by the quality tier alone. Choosing 2.5 does not change the amount charged.
  • Only low/medium/high tiers exist on this surface. xhigh/max are not supported; an unknown quality is silently coerced to medium (preserved surface behaviour).
  • A transparent background is unavailable on the codex route for both 2.5 models — a provider limitation, not our validation.
  • size/exact pixel dimensions are ignored by the codex backend: aspect_ratio stays a hint.
  • If the subscription route cannot currently serve 2.5, a typed 503 is returned BEFORE the reserve, so nothing is charged. Requests without model are unaffected.

JSON template:

json
{
  "execution_mode": "openai_codex",
  "prompt": "A short calm synthetic test."
}

google_sub_image

POST /franklab/api/v1/images/google-sub

Poll: GET /franklab/api/v1/images/google-sub/:taskId.

REST fieldTypeRequiredValues / conditions
execution_modestringyes"google_subscription"
promptstringyes—
reference_imagesarraynoitems: string
aspect_ratiostringno["1:1","16:9","9:16","4:3","3:4"]; Make default: "1:1"
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "execution_mode": "google_subscription",
  "prompt": "A short calm synthetic test."
}

jupiter

POST /franklab/api/v1/images/omni-image

Poll: GET /franklab/api/v1/images/omni-image/:taskId.

REST fieldTypeRequiredValues / conditions
model_namestringyes"jupiter-v1-5"
resolutionstringyes["1k","2k","4k"]; Make default: "1k"
result_typestringno["single","series"]; Make default: "single"
series_amountinteger or stringno["auto",2,3,4,5,6,7,8,9]; Make default: "auto"; When result_type=series
promptstringyes—
nnumbernoMake default: 1
image_listarraynoimage_url:string
element_listarraynoelement_id:string
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","21:9","custom"]; Make default: "auto"
custom_aspect_ratiostringnoWhen aspect_ratio=custom
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_name": "jupiter-v1-5",
  "resolution": "1k",
  "prompt": "Place the product from <<<image_1>>> on a wooden table.",
  "image_list": [{"image_url": "https://media.example.com/product-front.png"}]
}

xai_imagine_image_2

POST /franklab/api/v1/images/xai-imagine

Poll: GET /franklab/api/v1/images/xai-imagine/:taskId.

REST fieldTypeRequiredValues / conditions
model_namestringyes"xai-imagine-image-2"
response_formatstringyes"url"
promptstringyes—
qualitystringyes["medium","low"]; Make default: "medium"
aspect_ratiostringyes["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","2:1","1:2","19.5:9","9:19.5","20:9","9:20"]; Make default: "auto"
resolutionstringyes["1k","2k"]; Make default: "1k"
nnumberyesMake default: 1
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_name": "xai-imagine-image-2",
  "response_format": "url",
  "prompt": "A short calm synthetic test.",
  "quality": "medium",
  "aspect_ratio": "auto",
  "resolution": "1k",
  "n": 1
}

xai_imagine_image

POST /franklab/api/v1/images/xai-imagine

Poll: GET /franklab/api/v1/images/xai-imagine/:taskId.

REST fieldTypeRequiredValues / conditions
model_namestringyes"xai-imagine-image-quality"
response_formatstringyes"url"
execution_modestringno["xai_api","supergrok"]; Make default: "xai_api"
promptstringyes—
imageobjectnoWhen image edit requested; url:string
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4"]; Make default: "auto"
resolutionstringno["1k","2k"]; Make default: "1k"
nnumbernoMake default: 1
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_name": "xai-imagine-image-quality",
  "response_format": "url",
  "prompt": "A short calm synthetic test."
}

google_gemini_image

POST /franklab/api/v1/google/gemini-image

Poll: GET /franklab/api/v1/google/gemini-image/:taskId.

REST fieldTypeRequiredValues / conditions
model_idstringyes["gemini-3.1-flash-image","gemini-3.1-flash-lite-image","gemini-3-pro-image","gemini-2.5-flash-image"]; Make default: "gemini-3.1-flash-image"
promptstringconditionalWhen model_id=gemini-3.1-flash-image
image_listarraynoWhen model_id=gemini-3.1-flash-image; image_url:string
video_urlstringnoWhen model_id=gemini-3.1-flash-image
previous_interaction_idstringnoWhen model_id=gemini-3.1-flash-image
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","4:5","5:4","1:4","1:8","4:1","8:1","21:9"]; Make default: "auto"; When model_id=gemini-3.1-flash-image
image_sizestringno["0.5K","1K","2K","4K"]; Make default: "1K"; When model_id=gemini-3.1-flash-image
output_formatstringno["png","jpeg","webp"]; Make default: "png"; When model_id=gemini-3.1-flash-image
use_google_searchbooleannoMake default: false; When model_id=gemini-3.1-flash-image
use_image_searchbooleannoMake default: false; When model_id=gemini-3.1-flash-image
promptstringconditionalWhen model_id=gemini-3.1-flash-lite-image
image_listarraynoWhen model_id=gemini-3.1-flash-lite-image; image_url:string
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","4:5","5:4","21:9"]; Make default: "auto"; When model_id=gemini-3.1-flash-lite-image
output_formatstringno["png","jpeg","webp"]; Make default: "png"; When model_id=gemini-3.1-flash-lite-image
promptstringconditionalWhen model_id=gemini-3-pro-image
image_listarraynoWhen model_id=gemini-3-pro-image; image_url:string
previous_interaction_idstringnoWhen model_id=gemini-3-pro-image
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","4:5","5:4","21:9"]; Make default: "auto"; When model_id=gemini-3-pro-image
image_sizestringno["1K","2K","4K"]; Make default: "1K"; When model_id=gemini-3-pro-image
output_formatstringno["png","jpeg","webp"]; Make default: "png"; When model_id=gemini-3-pro-image
use_google_searchbooleannoMake default: false; When model_id=gemini-3-pro-image
promptstringconditionalWhen model_id=gemini-2.5-flash-image
image_listarraynoWhen model_id=gemini-2.5-flash-image; image_url:string
aspect_ratiostringno["auto","1:1","16:9","9:16","4:3","3:4","3:2","2:3","4:5","5:4","21:9"]; Make default: "auto"; When model_id=gemini-2.5-flash-image
output_formatstringno["png","jpeg","webp"]; Make default: "png"; When model_id=gemini-2.5-flash-image
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_id": "gemini-3.1-flash-image",
  "prompt": "A flat blue circle on white.",
  "image_size": "0.5K"
}

seedream_image

POST /franklab/api/v1/images/seedream-image

Poll: GET /franklab/api/v1/images/seedream-image/:taskId.

REST fieldTypeRequiredValues / conditions
model_idstringyes["seedream-5-0-lite","seedream-5-0-pro"]; Make default: "seedream-5-0-lite"
promptstringconditionalWhen model_id=seedream-5-0-lite
imagearraynoWhen model_id=seedream-5-0-lite; items: string
sequential_image_generationstringno["disabled","auto"]; Make default: "disabled"; When model_id=seedream-5-0-lite
max_imagesstringno[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; Make default: 4; When model_id=seedream-5-0-lite; sequential_image_generation=auto
resolutionstringconditional["2K","3K","4K"]; Make default: "2K"; When model_id=seedream-5-0-lite
aspect_ratiostringno["","1:1","4:3","3:4","16:9","9:16","3:2","2:3","21:9"]; Make default: ""; When model_id=seedream-5-0-lite
output_formatstringno["jpeg","png"]; Make default: "jpeg"; When model_id=seedream-5-0-lite
watermarkbooleannoMake default: false; When model_id=seedream-5-0-lite
promptstringconditionalWhen model_id=seedream-5-0-pro
imagearraynoWhen model_id=seedream-5-0-pro; items: string
resolutionstringconditional["1K","2K"]; Make default: "2K"; When model_id=seedream-5-0-pro
aspect_ratiostringno["","1:1","4:3","3:4","16:9","9:16","3:2","2:3","21:9"]; Make default: ""; When model_id=seedream-5-0-pro
output_formatstringno["jpeg","png"]; Make default: "jpeg"; When model_id=seedream-5-0-pro
watermarkbooleannoMake default: false; When model_id=seedream-5-0-pro
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "model_id": "seedream-5-0-lite",
  "prompt": "A flat blue circle on white.",
  "resolution": "2K"
}

google_nano_banana_pro

POST /franklab/api/v1/google/nano-banana-pro

Poll: GET /franklab/api/v1/google/:taskId/record-info.

REST fieldTypeRequiredValues / conditions
image_inputarraynoitems: string
promptstringno—
aspect_ratiostringno["1:1","9:16","16:9","3:4","4:3"]
resolutionstringyes["1K","2K","4K"]; Make default: "1K"
output_formatstringno["png","jpg"]; Make default: "png"
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "resolution": "1K",
  "prompt": "A blue circle on white."
}

poll:v1/google/:taskId/record-info

GET /franklab/api/v1/google/:taskId/record-info

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/google/gemini-image/:taskId

GET /franklab/api/v1/google/gemini-image/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/images/google-sub/:taskId

GET /franklab/api/v1/images/google-sub/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/images/gpt-image-codex/:taskId

GET /franklab/api/v1/images/gpt-image-codex/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/images/omni-image/:taskId

GET /franklab/api/v1/images/omni-image/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/images/seedream-image/:taskId

GET /franklab/api/v1/images/seedream-image/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

poll:v1/images/xai-imagine/:taskId

GET /franklab/api/v1/images/xai-imagine/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

KUSOK v.2

All 16 actions use POST /make/kusok/operation with explicit backend and action. backend=kusok manages reusable elements and voices; backend=moon manages verification and Moon assets. Legacy service keys are refused for KUSOK operations. IDs are partner-scoped; a task ID, element ID, asset ID and voice ID are different values.

Create requires element_name (1–20 characters), element_description (up to 100) and reference_type. For image_refer, provide your frontal_image and optional refer_images:[{"image_url":"…","type":"side"}]; for video_refer, provide refer_videos:[{"video_url":"…"}]. Voice creation requires your authorized audio/video source. Use synthetic assets for integration tests, never another person's likeness or voice without permission.

Follow data.should_poll and data.taskId/task_id: create/recognize can return an async task, while list/get/delete/voice/verification operations have their own inline results. Poll /make/kusok/async/tasks/:taskId until completed or failed, then inspect data.result and error_message; a completed task still requires a usable element_id or recognition result. poll_task dispatch only requests polling and is not proof that the task is queued.

Moon verify_start returns a human H5 verification flow. Pass its verification token as REST byted_token, not the Make field verification_token. verify_get_result models HTTP 200 resolved, 202 pending, 409 failure and 410 expiry. Keep H5 links and tokens private. Use the returned verified group_id when creating assets; wait for asset status Active before generation references. Deletion changes resources; it is not a connection test.

OperationMethodPath
kusok:createPOST/franklab/api/make/kusok/operation
kusok:getPOST/franklab/api/make/kusok/operation
kusok:listPOST/franklab/api/make/kusok/operation
kusok:deletePOST/franklab/api/make/kusok/operation
kusok:recognizePOST/franklab/api/make/kusok/operation
kusok:poll_taskPOST/franklab/api/make/kusok/operation
kusok:create_voicePOST/franklab/api/make/kusok/operation
kusok:get_voicePOST/franklab/api/make/kusok/operation
kusok:list_voicesPOST/franklab/api/make/kusok/operation
kusok:list_preset_voicesPOST/franklab/api/make/kusok/operation
kusok:delete_voicePOST/franklab/api/make/kusok/operation
moon:verify_startPOST/franklab/api/make/kusok/operation
moon:verify_get_resultPOST/franklab/api/make/kusok/operation
moon:create_assetPOST/franklab/api/make/kusok/operation
moon:get_assetPOST/franklab/api/make/kusok/operation
moon:list_assetsPOST/franklab/api/make/kusok/operation
pollGET/franklab/api/make/kusok/async/tasks/:taskId
getAllKusoks RPCGET/franklab/api/make/kusok/elements

kusok:create

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"create"
element_namestringyes—
element_descriptionstringyes—
reference_typestringyes["image_refer","video_refer"]; Make default: "image_refer"
frontal_imagestringno—
refer_imagesarraynoimage_url:string, type:string
refer_videosarraynovideo_url:string
element_voice_idstringno—
tag_listarraynotag_id:string
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "backend": "kusok",
  "action": "create",
  "element_name": "Synthetic circle",
  "element_description": "A blue synthetic circle.",
  "reference_type": "image_refer",
  "frontal_image": "https://example.com/owned-synthetic-image.png"
}

kusok:get

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"get"
element_idstringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "get",
  "element_id": "REPLACE_WITH_OWNED_ELEMENT_ID"
}

kusok:list

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"list"
pageNumintegernoMake default: 1
pageSizeintegernoMake default: 200

JSON template:

json
{
  "backend": "kusok",
  "action": "list"
}

kusok:delete

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"delete"
element_idstringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "delete",
  "element_id": "REPLACE_WITH_OWNED_ELEMENT_ID"
}

kusok:recognize

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"recognize"
imagestringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "recognize",
  "image": "https://example.com/owned-synthetic-media.png"
}

kusok:poll_task

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"poll_task"
task_idstringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "poll_task",
  "task_id": "REPLACE_WITH_OWNED_TASK_ID"
}

kusok:create_voice

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"create_voice"
voice_namestringyes—
voice_audio_listarraynoaudio_url:string
voice_urlstringno—
video_idstringno—
source_task_idstringno—
callback_urlstringno—
external_task_idstringno—

JSON template:

json
{
  "backend": "kusok",
  "action": "create_voice",
  "voice_name": "Synthetic Voice",
  "voice_url": "https://example.com/owned-synthetic-audio.mp3"
}

kusok:get_voice

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"get_voice"
voice_idstringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "get_voice",
  "voice_id": "REPLACE_WITH_OWNED_VOICE_ID"
}

kusok:list_voices

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"list_voices"
pageNumintegernoMake default: 1
pageSizeintegernoMake default: 200

JSON template:

json
{
  "backend": "kusok",
  "action": "list_voices"
}

kusok:list_preset_voices

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"list_preset_voices"
pageNumintegernoMake default: 1
pageSizeintegernoMake default: 200

JSON template:

json
{
  "backend": "kusok",
  "action": "list_preset_voices"
}

kusok:delete_voice

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"kusok"
actionstringyes"delete_voice"
voice_idstringyes—

JSON template:

json
{
  "backend": "kusok",
  "action": "delete_voice",
  "voice_id": "REPLACE_WITH_OWNED_VOICE_ID"
}

moon:verify_start

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"moon"
actionstringyes"verify_start"
callback_urlstringno—
project_namestringno—
external_task_idstringno—

JSON template:

json
{
  "backend": "moon",
  "action": "verify_start"
}

moon:verify_get_result

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"moon"
actionstringyes"verify_get_result"
byted_tokenstringyes—
project_namestringno—

JSON template:

json
{
  "backend": "moon",
  "action": "verify_get_result",
  "byted_token": "REPLACE_WITH_OWNED_BYTED_TOKEN"
}

moon:create_asset

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"moon"
actionstringyes"create_asset"
group_idstringyes—
urlstringyes—
asset_typestringyes["Image","Video","Audio"]; Make default: "Image"
namestringno—
project_namestringno—

JSON template:

json
{
  "backend": "moon",
  "action": "create_asset",
  "group_id": "REPLACE_WITH_OWNED_GROUP_ID",
  "url": "https://example.com/owned-synthetic-media.png",
  "asset_type": "Image"
}

moon:get_asset

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"moon"
actionstringyes"get_asset"
asset_idstringyes—
project_namestringno—

JSON template:

json
{
  "backend": "moon",
  "action": "get_asset",
  "asset_id": "REPLACE_WITH_OWNED_ASSET_ID"
}

moon:list_assets

POST /franklab/api/make/kusok/operation

REST fieldTypeRequiredValues / conditions
backendstringyes"moon"
actionstringyes"list_assets"
group_idstringno—
statusesstringno["Active","Processing","Failed"]
namestringno—
pageNumberintegernoMake default: 1
pageSizeintegernoMake default: 20

JSON template:

json
{
  "backend": "moon",
  "action": "list_assets"
}

poll

GET /franklab/api/make/kusok/async/tasks/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

getAllKusoks RPC

GET /franklab/api/make/kusok/elements

REST fieldTypeRequiredValues / conditions
pageNumintegernoServer default: 1; query
pageSizeintegernoServer default: 200; query

MOON GPT

Generate text, structured JSON and multimodal answers through /make/dola. Use a partner API key; legacy service keys return 403. Discover usable model_key values and capabilities with GET /make/dola/models. Omission selects moon_gpt; the choices below describe request values; use the model catalog for account access.

prompt is required. REST async_mode defaults to synchronous when omitted; send true to receive a durable billing_task_id and poll /make/dola/tasks/:billing_task_id. Poll while data.cost_status=pending. Read output_text/content, parsed_json, json_parse_ok/json_parse_error, usage, conversation_id and billing fields. A terminal billing record alone does not validate the returned JSON against your schema.

For response_format=json_schema, supply json_schema_name and an actual JSON object in json_schema. max_output_tokens is the REST name emitted by Make's max_tokens field; the API also accepts max_tokens. Limits are model-specific, at most 65536. Avoid sending both aliases. thinking_level and thinking_budget are mutually exclusive. Newer Gemini keys reject temperature and the old budget input. Conversation continuation must keep the same model and an owned conversation_id or supported previous_response_id.

Upload URL input with /files/from-url or upload multipart file plus filename with /files/upload (100 MiB ceiling), then retrieve /files/:file_id. JSON upload instead uses file_data (base64), filename, optional mime_type/purpose; never combine multipart file and base64. Supported native MIME: PDF, JPEG, PNG, GIF, WebP, MP4, QuickTime, AVI, octet-stream. Inline Make reference objects have a 48 KiB limit. image_refs, document_refs, video_refs can use HTTPS/data URIs; file-* references work only with the MOON GPT transport. Claude Fable 5.1 and GPT-6 Astra accept images and PDFs but are default-off behind independent rollout flags; this is a source contract, not a claim of current readiness. Check each model's modality capabilities and file readiness. The JSON-schema RPC only shapes Make's output editor; it is not a REST endpoint.

OperationMethodPath
generatePOST/franklab/api/make/dola/generate
upload_file_from_urlPOST/franklab/api/make/dola/files/from-url
upload_filePOST/franklab/api/make/dola/files/upload
get_fileGET/franklab/api/make/dola/files/:file_id
delete_fileDELETE/franklab/api/make/dola/files/:file_id
task_statusGET/franklab/api/make/dola/tasks/:billing_task_id
modelsGET/franklab/api/make/dola/models
list_filesGET/franklab/api/make/dola/files

generate

POST /franklab/api/make/dola/generate

REST fieldTypeRequiredValues / conditions
promptstringyes—
async_modebooleannoMake default: true
system_promptstringno—
model_keystringno["moon_gpt","gemini_4_argon", "gemini_3_8_flash","gemini_3_7_flash","gemini_3_5_flash","gemini_3_6_flash","gemini_3_5_flash_lite","opus","sonnet","fable_5_1","gpt","gpt5_5","gpt56_sol","gpt56_terra","gpt56_luna","gpt6_astra","deepseek_pro","deepseek_flash","kimi","grok","alibaba_qwen3_7_max_2026_06_08","alibaba_qwen3_7_plus_2026_05_26"]
previous_response_idstringnoWhen model_key=moon_gpt
image_refsarraynoWhen model_key=moon_gpt; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=moon_gpt; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=moon_gpt; items: text
conversation_modebooleannoMake default: false; When model_key=moon_gpt
conversation_idstringnoWhen model_key=moon_gpt
deepwiki_enabledbooleannoMake default: false; When model_key=moon_gpt
image_refsarraynoWhen model_key=gemini_3_7_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gemini_3_7_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=gemini_3_7_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
thinking_levelstringno["minimal","low","medium","high"]; When model_key=gemini_3_7_flash
image_refsarraynoWhen model_key=gemini_3_5_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gemini_3_5_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=gemini_3_5_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
thinking_levelstringno["minimal","low","medium","high"]; When model_key=gemini_3_5_flash
thinking_budgetintegernoWhen model_key=gemini_3_5_flash
image_refsarraynoWhen model_key=gemini_3_6_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gemini_3_6_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=gemini_3_6_flash; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
thinking_levelstringno["minimal","low","medium","high"]; When model_key=gemini_3_6_flash
image_refsarraynoWhen model_key=gemini_3_5_flash_lite; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gemini_3_5_flash_lite; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=gemini_3_5_flash_lite; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
thinking_levelstringno["minimal","low","medium","high"]; When model_key=gemini_3_5_flash_lite
image_refsarraynoWhen model_key=opus; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=opus; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=sonnet; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=sonnet; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt5_5; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt5_5; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt56_sol; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt56_sol; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt56_terra; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt56_terra; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt56_luna; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt56_luna; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=kimi; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
video_refsarraynoWhen model_key=kimi; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=grok; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=fable_5_1; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=fable_5_1; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
image_refsarraynoWhen model_key=gpt6_astra; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
document_refsarraynoWhen model_key=gpt6_astra; source_type:string, value:string, file_name:string, file_data:string (base64), data_url:string; items: collection
response_formatstringno["text","json_object","json_schema"]; Make default: "text"
json_schema_namestringconditionalWhen response_format=json_schema
json_schemaobjectconditionalWhen response_format=json_schema
max_output_tokensintegernoMake default: 8192
temperaturenumbernoMake default: 0.7; When model_key=moon_gpt
temperaturenumbernoMake default: 0.7; When model_key=gemini_3_5_flash

JSON template:

json
{
  "model_key": "moon_gpt",
  "prompt": "Return the word OK.",
  "max_output_tokens": 16,
  "async_mode": true
}

upload_file_from_url

POST /franklab/api/make/dola/files/from-url

REST fieldTypeRequiredValues / conditions
urlstringyes—
filenamestringno—
purposestringnoMake default: "user_data"

JSON template:

json
{
  "url": "https://example.com/owned-synthetic-media.png"
}

upload_file

POST /franklab/api/make/dola/files/upload

REST fieldTypeRequiredValues / conditions
filenamestringyes—
file_datastringno—
filebinaryno—
mime_typestringno—
purposestringno—

JSON template:

json
{
  "filename": "synthetic.png",
  "mime_type": "image/png",
  "file_data": "REPLACE_WITH_BASE64"
}
bash
curl --fail-with-body --max-time 120 -X POST \
  -H "X-API-Key: ${FRANKLAB_KEY:?Set your account key}" \
  -F 'file=@./synthetic.png' -F 'filename=synthetic.png' \
  "$FRANKLAB_BASE_URL/make/dola/files/upload"

get_file

GET /franklab/api/make/dola/files/:file_id

REST fieldTypeRequiredValues / conditions
file_idstringyespath

delete_file

DELETE /franklab/api/make/dola/files/:file_id

REST fieldTypeRequiredValues / conditions
file_idstringyespath

task_status

GET /franklab/api/make/dola/tasks/:billing_task_id

REST fieldTypeRequiredValues / conditions
billing_task_idstringyespath

models

GET /franklab/api/make/dola/models

No body or parameters required.

list_files

GET /franklab/api/make/dola/files

No body or parameters required.

ORKESTR

lyrics is temporarily unavailable. If you already have a task ID and polling remains processing, contact support with that ID before submitting again.

18 music/text/processing operations plus polling. Select the path; do not send the Make operation in JSON. Use a partner API key; legacy service keys are refused. Most Suno operations accept model: V5, V4_5PLUS, V4_5ALL, V4_5, V4. Generate defaults to V5, customMode=false, instrumental=false; the same defaults are not automatically added to other operations.

The REST field taskId corresponds to Make sourceTaskId; name/description correspond to personaName/personaDescription. Supply the owned source task/audio identifiers returned by earlier results, not a prompt or arbitrary UUID. Upload cover/extend/mashup require reachable owned uploadUrl/uploadUrl1/uploadUrl2. customMode=true needs the chosen model's custom lyrics/style/title fields. continueAt, infillStartS, infillEndS, vocalStart, vocalEnd are seconds; keep intervals ordered and inside the source audio. Callback routing is managed by the service.

Save the returned FrankLab data.taskId; poll /make/orkestr/v2/tasks/:taskId every 5 seconds with a bounded deadline. queued/processing continue; completed/failed stop. Inspect data.result and data.error. Media results normally live in data.result.task_result.audios, .videos or .images; lyrics and style are text/JSON, not guaranteed audio URLs. timestamped_lyrics, boost_style, generate_persona return inline results without requiring a poll. track1_*/track2_* names are Make projections; do not assume they exist in REST.

Lyria uses model=clip or pro: clip is fixed at 30 seconds, pro is a full track and treats duration_seconds as guidance rather than an exact clip length. Optional output_format=mp3|wav is supported; default/model limits must be checked before quoting. Inspect data.audio_url, lyrics_text, duration_seconds, interaction_id for its result. Billing is account-specific; the absence of a quote route or final-cost field is not a free-operation promise.

OperationMethodPath
pollGET/franklab/api/make/orkestr/v2/tasks/:taskId
generatePOST/franklab/api/make/orkestr/v2/generate
extendPOST/franklab/api/make/orkestr/v2/extend
upload_coverPOST/franklab/api/make/orkestr/v2/upload-cover
upload_extendPOST/franklab/api/make/orkestr/v2/upload-extend
add_instrumentalPOST/franklab/api/make/orkestr/v2/add-instrumental
add_vocalsPOST/franklab/api/make/orkestr/v2/add-vocals
replace_sectionPOST/franklab/api/make/orkestr/v2/replace-section
mashupPOST/franklab/api/make/orkestr/v2/mashup
lyricsPOST/franklab/api/make/orkestr/v2/lyrics
timestamped_lyricsPOST/franklab/api/make/orkestr/v2/timestamped-lyrics
separate_vocalsPOST/franklab/api/make/orkestr/v2/separate-vocals
generate_midiPOST/franklab/api/make/orkestr/v2/generate-midi
convert_wavPOST/franklab/api/make/orkestr/v2/convert-wav
music_videoPOST/franklab/api/make/orkestr/v2/music-video
cover_imagePOST/franklab/api/make/orkestr/v2/cover-image
boost_stylePOST/franklab/api/make/orkestr/v2/boost-style
generate_personaPOST/franklab/api/make/orkestr/v2/generate-persona
lyria_musicPOST/franklab/api/make/orkestr/v2/lyria-music

poll

GET /franklab/api/make/orkestr/v2/tasks/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

generate

POST /franklab/api/make/orkestr/v2/generate

REST fieldTypeRequiredValues / conditions
modelstringyes["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
customModebooleanno—
instrumentalbooleanno—
promptstringyes—
stylestringno—
titlestringno—
negativeTagsstringno—
vocalGenderstringno["f","m"]
styleWeightnumberno—
weirdnessConstraintnumberno—
audioWeightnumberno—
personaIdstringno—

JSON template:

json
{
  "model": "V5",
  "prompt": "A short calm synthetic test."
}

extend

POST /franklab/api/make/orkestr/v2/extend

REST fieldTypeRequiredValues / conditions
audioIdstringyes—
defaultParamFlagbooleanno—
modelstringyes["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
continueAtnumberno—
promptstringno—
stylestringno—
titlestringno—
negativeTagsstringno—
vocalGenderstringno["f","m"]
personaIdstringno—

JSON template:

json
{
  "audioId": "REPLACE_WITH_OWNED_AUDIOID",
  "model": "V5"
}

upload_cover

POST /franklab/api/make/orkestr/v2/upload-cover

REST fieldTypeRequiredValues / conditions
uploadUrlstringyes—
modelstringyes["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
customModebooleanno—
instrumentalbooleanno—
promptstringno—
stylestringno—
titlestringno—
negativeTagsstringno—
vocalGenderstringno["f","m"]
personaIdstringno—

JSON template:

json
{
  "uploadUrl": "https://example.com/owned-synthetic-audio.mp3",
  "model": "V5"
}

upload_extend

POST /franklab/api/make/orkestr/v2/upload-extend

REST fieldTypeRequiredValues / conditions
uploadUrlstringyes—
modelstringyes["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
defaultParamFlagbooleanno—
instrumentalbooleanno—
continueAtnumberyes—
promptstringno—
stylestringno—
titlestringno—
negativeTagsstringno—
vocalGenderstringno["f","m"]
personaIdstringno—

JSON template:

json
{
  "uploadUrl": "https://example.com/owned-synthetic-audio.mp3",
  "model": "V5",
  "continueAt": 1
}

add_instrumental

POST /franklab/api/make/orkestr/v2/add-instrumental

REST fieldTypeRequiredValues / conditions
uploadUrlstringyes—
titlestringyes—
tagsstringyes—
negativeTagsstringno—
modelstringno["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
vocalGenderstringno["f","m"]

JSON template:

json
{
  "uploadUrl": "https://example.com/owned-synthetic-audio.mp3",
  "title": "Synthetic test",
  "tags": "REPLACE_WITH_OWNED_TAGS"
}

add_vocals

POST /franklab/api/make/orkestr/v2/add-vocals

REST fieldTypeRequiredValues / conditions
uploadUrlstringyes—
promptstringyes—
titlestringyes—
stylestringyes—
negativeTagsstringno—
modelstringno["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
vocalGenderstringno["f","m"]

JSON template:

json
{
  "uploadUrl": "https://example.com/owned-synthetic-audio.mp3",
  "prompt": "A short calm synthetic test.",
  "title": "Synthetic test",
  "style": "REPLACE_WITH_OWNED_STYLE"
}

replace_section

POST /franklab/api/make/orkestr/v2/replace-section

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—
promptstringyes—
tagsstringyes—
titlestringyes—
infillStartSnumberyes—
infillEndSnumberyes—
negativeTagsstringno—
fullLyricsstringno—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID",
  "prompt": "A short calm synthetic test.",
  "tags": "REPLACE_WITH_OWNED_TAGS",
  "title": "Synthetic test",
  "infillStartS": 1,
  "infillEndS": 2
}

mashup

POST /franklab/api/make/orkestr/v2/mashup

REST fieldTypeRequiredValues / conditions
uploadUrl1stringyes—
uploadUrl2stringyes—
modelstringyes["V5","V4_5PLUS","V4_5ALL","V4_5","V4"]
customModebooleanno—
instrumentalbooleanno—
promptstringno—
stylestringno—
titlestringno—
negativeTagsstringno—
vocalGenderstringno["f","m"]

JSON template:

json
{
  "uploadUrl1": "https://example.com/owned-synthetic-audio.mp3",
  "uploadUrl2": "https://example.com/owned-synthetic-audio-2.mp3",
  "model": "V5"
}

lyrics

POST /franklab/api/make/orkestr/v2/lyrics

Temporarily unavailable. Keep existing task IDs for support; use generate above to create a song.

timestamped_lyrics

POST /franklab/api/make/orkestr/v2/timestamped-lyrics

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID"
}

separate_vocals

POST /franklab/api/make/orkestr/v2/separate-vocals

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—
typestringyes["separate_vocal","split_stem"]

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID",
  "type": "separate_vocal"
}

generate_midi

POST /franklab/api/make/orkestr/v2/generate-midi

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringno—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID"
}

convert_wav

POST /franklab/api/make/orkestr/v2/convert-wav

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID"
}

music_video

POST /franklab/api/make/orkestr/v2/music-video

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—
authorstringno—
domainNamestringno—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID"
}

cover_image

POST /franklab/api/make/orkestr/v2/cover-image

REST fieldTypeRequiredValues / conditions
taskIdstringyes—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID"
}

boost_style

POST /franklab/api/make/orkestr/v2/boost-style

REST fieldTypeRequiredValues / conditions
contentstringyes—

JSON template:

json
{
  "content": "A short calm synthetic test."
}

generate_persona

POST /franklab/api/make/orkestr/v2/generate-persona

REST fieldTypeRequiredValues / conditions
taskIdstringyes—
audioIdstringyes—
namestringyes—
descriptionstringyes—
vocalStartnumberno—
vocalEndnumberno—
stylestringno—

JSON template:

json
{
  "taskId": "REPLACE_WITH_OWNED_TASKID",
  "audioId": "REPLACE_WITH_OWNED_AUDIOID",
  "name": "Synthetic test",
  "description": "REPLACE_WITH_OWNED_DESCRIPTION"
}

lyria_music

POST /franklab/api/make/orkestr/v2/lyria-music

REST fieldTypeRequiredValues / conditions
modelstringyes["clip","pro"]
promptstringyes—
instrumentalbooleanno—
lyricsstringno—
languagestringno—
genrestringno—
erastringno—
instrumentsstringno—
song_structurestringno—
timed_eventsstringno—
vocal_profilestringno—
key_scalestringno—
moodstringno—
duration_secondsnumberno—
reference_imagesarraynoimage_url:string; items: collection

JSON template:

json
{
  "model": "clip",
  "prompt": "Calm original instrumental piano.",
  "instrumental": true
}

VOLNA

All 19 Make operations dispatch through POST /make/volna/tts; operation is required for non-TTS actions and should always be explicit. Choose ElevenLabs dialogue/TTS/Turbo, Google Gemini TTS, Seed Audio, Grok TTS, transcription, effects, isolation, voice tools or dubbing. List voices/models to choose the identifiers for your request. Voice creation/design/save and usage stats reject legacy service keys.

For ElevenLabs, discover voice_id via /v1/elevenlabs/voices-rpc; for Grok use /v1/xai/voices-rpc. RPC output is data:[{id,name,…}]; never invent a voice ID. Google google_tts_mode=single uses google_voice_name; multi uses speaker_1_name, speaker_1_voice, speaker_2_name, speaker_2_voice, matching labels in text. Grok defaults to voice eve; xai_tts_settings and transcription settings selectors belong only to Make UI.

STT and isolation take an owned audio_url; dubbing takes source_url and target_lang. Pass real JSON booleans and numbers, and keyterm:["term"] strings. Voice cloning REST uses name/description (Make clone_name/clone_description aliases are normalized) and authorized file_url. Designed voices are saved separately with voice_name/generated_voice_id.

Seed Audio uses text_prompt (up to 3000 characters), optional at most 3 references: each item selects reference_type=audio|image, with speaker, audio_url, audio_data or audio_file_data/audio_file_name, or the corresponding image fields. Supply one reference source, not all alternatives. Audio format mp3/wav/pcm/ogg_opus; sample rate 8000/16000/24000/32000/44100/48000. Speech/loudness rate -50..100, pitch -12..12. REST watermark metadata switch is boolean audio_aigc_metadata_enable, not Make audio_aigc_metadata_mode.

If the response contains data.taskId, poll /make/volna/tasks/:taskId about every 5 seconds until completed/failed; a synchronous result or metadata response may have no task ID. Inspect data.result, audio_url/audioUrl, resultUrl, text, words, segments, duration_seconds and billing fields where supplied. Make audio/status outputs are normalized from different source shapes. Check final cost_status, reserve/refund/final amounts and transactions. Do not resubmit a timed-out paid request.

OperationMethodPath
text-to-dialoguePOST/franklab/api/make/volna/tts
text-to-speechPOST/franklab/api/make/volna/tts
text-to-speech-turboPOST/franklab/api/make/volna/tts
google-3-1-ttsPOST/franklab/api/make/volna/tts
seed-audio-1-0POST/franklab/api/make/volna/tts
xai-text-to-speechPOST/franklab/api/make/volna/tts
speech-to-textPOST/franklab/api/make/volna/tts
xai-speech-to-textPOST/franklab/api/make/volna/tts
google-speech-to-textPOST/franklab/api/make/volna/tts
sound-effectPOST/franklab/api/make/volna/tts
audio-isolationPOST/franklab/api/make/volna/tts
voice-listPOST/franklab/api/make/volna/tts
xai-voice-listPOST/franklab/api/make/volna/tts
voice-clonePOST/franklab/api/make/volna/tts
voice-designPOST/franklab/api/make/volna/tts
voice-design-savePOST/franklab/api/make/volna/tts
dubbingPOST/franklab/api/make/volna/tts
usage-statsPOST/franklab/api/make/volna/tts
models-listPOST/franklab/api/make/volna/tts
pollGET/franklab/api/make/volna/tasks/:taskId
getVoices RPCGET/franklab/api/v1/elevenlabs/voices-rpc
getGrokVoices RPCGET/franklab/api/v1/xai/voices-rpc

text-to-dialogue

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"text-to-dialogue"
textstringyes—
voice_idstringyes—
voice_id_2stringno—
seednumberno—

JSON template:

json
{
  "operation": "text-to-dialogue",
  "text": "A short calm synthetic test.",
  "voice_id": "REPLACE_WITH_OWNED_VOICE_ID"
}

text-to-speech

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"text-to-speech"
textstringyes—
voice_idstringyes—
model_idstringno["eleven_multilingual_v2","eleven_flash_v2_5","eleven_v3"]
language_codestringno—
stabilitynumberno—
similarity_boostnumberno—
stylenumberno—
speednumberno—
output_formatstringno["mp3_44100_128","mp3_44100_192","pcm_16000","pcm_22050","pcm_44100"]

JSON template:

json
{
  "operation": "text-to-speech",
  "text": "A short calm synthetic test.",
  "voice_id": "REPLACE_WITH_OWNED_VOICE_ID"
}

text-to-speech-turbo

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"text-to-speech-turbo"
textstringyes—
voice_idstringyes—
language_codestringno—
stabilitynumberno—
similarity_boostnumberno—
stylenumberno—
speednumberno—

JSON template:

json
{
  "operation": "text-to-speech-turbo",
  "text": "A short calm synthetic test.",
  "voice_id": "REPLACE_WITH_OWNED_VOICE_ID"
}

google-3-1-tts

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"google-3-1-tts"
google_tts_modestringyes["single","multi"]
textstringconditionalWhen google_tts_mode=single
google_voice_namestringconditional["Achernar","Achird","Algenib","Algieba","Alnilam","Aoede","Autonoe","Callirrhoe","Charon","Despina","Enceladus","Erinome","Fenrir","Gacrux","Iapetus","Kore","Laomedeia","Leda","Orus","Puck","Pulcherrima","Rasalgethi","Sadachbia","Sadaltager","Schedar","Sulafat","Umbriel","Vindemiatrix","Zephyr","Zubenelgenubi"]; When google_tts_mode=single
style_promptstringnoWhen google_tts_mode=single
output_formatstringno["wav_24000_16","mp3_44100_128","mp3_44100_192","opus_48000_64"]; When google_tts_mode=single
request_idstringnoWhen google_tts_mode=single
textstringconditionalWhen google_tts_mode=multi
speaker_1_namestringconditionalWhen google_tts_mode=multi
speaker_1_voicestringconditional["Achernar","Achird","Algenib","Algieba","Alnilam","Aoede","Autonoe","Callirrhoe","Charon","Despina","Enceladus","Erinome","Fenrir","Gacrux","Iapetus","Kore","Laomedeia","Leda","Orus","Puck","Pulcherrima","Rasalgethi","Sadachbia","Sadaltager","Schedar","Sulafat","Umbriel","Vindemiatrix","Zephyr","Zubenelgenubi"]; When google_tts_mode=multi
speaker_2_namestringconditionalWhen google_tts_mode=multi
speaker_2_voicestringconditional["Achernar","Achird","Algenib","Algieba","Alnilam","Aoede","Autonoe","Callirrhoe","Charon","Despina","Enceladus","Erinome","Fenrir","Gacrux","Iapetus","Kore","Laomedeia","Leda","Orus","Puck","Pulcherrima","Rasalgethi","Sadachbia","Sadaltager","Schedar","Sulafat","Umbriel","Vindemiatrix","Zephyr","Zubenelgenubi"]; When google_tts_mode=multi
style_promptstringnoWhen google_tts_mode=multi
output_formatstringno["wav_24000_16","mp3_44100_128","mp3_44100_192","opus_48000_64"]; When google_tts_mode=multi
request_idstringnoWhen google_tts_mode=multi

JSON template:

json
{
  "operation": "google-3-1-tts",
  "text": "Hello.",
  "google_tts_mode": "single",
  "google_voice_name": "Kore"
}

seed-audio-1-0

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"seed-audio-1-0"
text_promptstringyes—
referencesarraynoreference_type, speaker, audio_url/audio_data/audio_file_data, audio_file_name, image_url/image_data/image_file_data, image_file_name; items: collection
audio_formatstringno["mp3","wav","pcm","ogg_opus"]; Make default: "mp3"
audio_sample_ratestringno["8000","16000","24000","32000","44100","48000"]; Make default: "44100"
audio_speech_ratenumberno—
audio_loudness_ratenumberno—
audio_pitch_ratenumberno—
audio_enable_subtitlebooleanno—
audio_aigc_watermarkbooleanno—
audio_aigc_metadata_enablebooleanno[false,true]; Make default: false
audio_content_producerstringnoWhen audio_aigc_metadata_enable=true
audio_produce_idstringnoWhen audio_aigc_metadata_enable=true
audio_content_propagatorstringnoWhen audio_aigc_metadata_enable=true
audio_propagate_idstringnoWhen audio_aigc_metadata_enable=true

JSON template:

json
{
  "operation": "seed-audio-1-0",
  "text_prompt": "A short calm synthetic test."
}

xai-text-to-speech

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"xai-text-to-speech"
textstringyes—
voice_idstringnoMake default: "eve"
languagestringno["auto","ru","en","es","de","fr","it","ja","pt-BR"]; Make default: "auto"
output_formatstringno["mp3_44100_128","mp3_44100_192","wav_24000","pcm_24000"]; Make default: "mp3_44100_128"
with_timestampsbooleanno—
speedstringno["0.8","0.9","1","1.1","1.2"]; Make default: "1"

JSON template:

json
{
  "operation": "xai-text-to-speech",
  "text": "Hello.",
  "voice_id": "eve",
  "output_format": "mp3_44100_128"
}

speech-to-text

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"speech-to-text"
audio_urlstringyes—
language_codestringno—
diarizebooleanno—
num_speakersnumberno—

JSON template:

json
{
  "operation": "speech-to-text",
  "audio_url": "https://example.com/owned-synthetic-audio.mp3"
}

xai-speech-to-text

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"xai-speech-to-text"
audio_urlstringyes—
languagestringno["auto","ru","en","es","de","fr","it","ja","pt-BR"]; Make default: "auto"
formatbooleanno—
diarizebooleanno—
filler_wordsbooleanno—
chunked_recoverybooleanno—
keytermarraynoitems: string

JSON template:

json
{
  "operation": "xai-speech-to-text",
  "audio_url": "https://example.com/owned-synthetic-audio.mp3"
}

google-speech-to-text

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"google-speech-to-text"
audio_urlstringyes—
language_codestringno["auto","ru-RU","en-US","en-GB","de-DE","fr-FR","es-ES","it-IT","pt-BR","ja-JP","ko-KR","uk-UA"]; Make default: "auto"
diarizebooleanno—
formatbooleanno—
keytermarraynoitems: string

JSON template:

json
{
  "operation": "google-speech-to-text",
  "audio_url": "https://example.com/owned-synthetic-audio.mp3"
}

sound-effect

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"sound-effect"
textstringyes—
duration_secondsnumberno—
prompt_influencenumberno—

JSON template:

json
{
  "operation": "sound-effect",
  "text": "A short calm synthetic test."
}

audio-isolation

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"audio-isolation"
audio_urlstringyes—

JSON template:

json
{
  "operation": "audio-isolation",
  "audio_url": "https://example.com/owned-synthetic-audio.mp3"
}

voice-list

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"voice-list"

JSON template:

json
{
  "operation": "voice-list"
}

xai-voice-list

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"xai-voice-list"

JSON template:

json
{
  "operation": "xai-voice-list"
}

voice-clone

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"voice-clone"
namestringyes—
descriptionstringno—
file_urlstringyes—

JSON template:

json
{
  "operation": "voice-clone",
  "name": "Synthetic test",
  "file_url": "https://example.com/owned-synthetic-audio.mp3"
}

voice-design

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"voice-design"
voice_descriptionstringyes—
design_textstringno—
guidance_scalenumberno—
should_enhancebooleanno—

JSON template:

json
{
  "operation": "voice-design",
  "voice_description": "REPLACE_WITH_OWNED_VOICE_DESCRIPTION"
}

voice-design-save

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"voice-design-save"
voice_namestringyes—
generated_voice_idstringyes—
voice_descriptionstringno—

JSON template:

json
{
  "operation": "voice-design-save",
  "voice_name": "REPLACE_WITH_OWNED_VOICE_NAME",
  "generated_voice_id": "REPLACE_WITH_OWNED_GENERATED_VOICE_ID"
}

dubbing

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"dubbing"
source_urlstringyes—
target_langstringyes—
source_langstringno—
dubbing_namestringno—
num_speakersnumberno—

JSON template:

json
{
  "operation": "dubbing",
  "source_url": "https://example.com/owned-synthetic-audio.mp3",
  "target_lang": "en"
}

usage-stats

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"usage-stats"

JSON template:

json
{
  "operation": "usage-stats"
}

models-list

POST /franklab/api/make/volna/tts

REST fieldTypeRequiredValues / conditions
operationstringyes"models-list"

JSON template:

json
{
  "operation": "models-list"
}

poll

GET /franklab/api/make/volna/tasks/:taskId

REST fieldTypeRequiredValues / conditions
taskIdstringyespath

getVoices RPC

GET /franklab/api/v1/elevenlabs/voices-rpc

No body or parameters required.

getGrokVoices RPC

GET /franklab/api/v1/xai/voices-rpc

No body or parameters required.

Supporting connection and result routes

ModuleMethod and pathParameters
JUPITERGET /franklab/api/v1/images/omni-image—
KUSOK v.2GET /franklab/api/v1/general/advanced-custom-elements—
ORKESTRGET /franklab/api/v1/suno/generate/record-infotaskId (query)
VOLNAGET /franklab/api/make/volna/dubbing/:dubbingIddubbingId (path)
VOLNAGET /franklab/api/make/volna/dubbing/:dubbingId/audio/:languageCodedubbingId (path), languageCode (path)

A request with a nonexistent task ID returns 404. Use the matching operation status route for newly submitted tasks.

Next step

Choose one operation, check your key/balance/available quote, run a minimal request with your synthetic inputs and save the ID. Then verify the final result and charge. Integration sequence · Errors · Support.

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