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, checked against source on 8 September 2026; 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

Availability on September 8, 2026: the Z-Image Turbo check returned code:503 during estimation, before any task was created. If estimation is unavailable for your account, do not proceed to generation; contact support to confirm access. This check does not establish availability of other Alibaba models.

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, editImageIds is an array of 1–3 partner-owned StoredFile UUIDs, not external URLs, Make {value} objects or MOON GPT file IDs. A public upload URL alone does not provide this contract's StoredFile ID; obtain the owned ID from a supported asset workflow before editing. Do not invent a UUID. 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
editImageIdsarrayyesitems: string
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": "A short calm synthetic test.",
  "width": 1024,
  "height": 1024,
  "editImageIds": [
    "REPLACE_WITH_OWNED_STORED_FILE_UUID_V4"
  ]
}

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
editImageIdsarrayyesitems: string
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": "A short calm synthetic test.",
  "width": 1024,
  "height": 1024,
  "editImageIds": [
    "REPLACE_WITH_OWNED_STORED_FILE_UUID_V4"
  ]
}

estimate

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://…"}. Use owned media URLs from the upload guide.

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
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": "A short calm synthetic test."
}

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"
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

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": "A short calm synthetic test."
}

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; static choices below are the source contract, not an entitlement list.

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. 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_3_7_flash","gemini_3_5_flash","gemini_3_6_flash","gemini_3_5_flash_lite","opus","sonnet","gpt","gpt5_5","gpt56_sol","gpt56_terra","gpt56_luna","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
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

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

The lyrics check on 8 September 2026 failed because the upstream service required a callback. The reservation was refunded, but public polling continued to show processing. This operation needs a fix. Do not resubmit because polling appears stuck.

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

REST fieldTypeRequiredValues / conditions
promptstringyes

JSON template:

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

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. Listing voices/models is metadata, not an audio-generation check. 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 connection request with a nonexistent task ID can return 404; this is not a generation test. 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