Execute inference
curl --request POST \ --url https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "model_id": "<uuid>", "weight": 1, "prompt": "<string>", "width": 0, "height": 0, "batch_size": 4, "num_inference_steps": 0, "guidance_scale": 0, "prompt_strength": 0, "quality": "low", "sharpness": 0, "duration_seconds": 0, "generate_audio": true, "keep_audio": true, "fps": 0, "video_effects": [], "use_ta_pose": true, "pose_mode": "A_POSE", "include_textures": true, "quad_mesh": true, "pbr_materials": true, "low_poly": true, "generate_parts": true, "face_limit": 0, "stability": 0, "use_speaker_boost": true, "similarity_boost": 0, "style_exaggeration": 0, "speed": 0, "upscale_ratio": 0, "creativity": 0, "resemblance": 0, "vectorize": true, "remove_background": true, "reframe": true, "refill": true, "seed": -1, "guidance_files": [], "mask": { "file_id": "<uuid>", "for_transparency": true, "for_nontransparency": true, "edge_radius": 0 }, "session_name": "<string>"}'import requests
url = "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences"
payload = { "model_id": "<uuid>", "weight": 1, "prompt": "<string>", "width": 0, "height": 0, "batch_size": 4, "num_inference_steps": 0, "guidance_scale": 0, "prompt_strength": 0, "quality": "low", "sharpness": 0, "duration_seconds": 0, "generate_audio": True, "keep_audio": True, "fps": 0, "video_effects": [], "use_ta_pose": True, "pose_mode": "A_POSE", "include_textures": True, "quad_mesh": True, "pbr_materials": True, "low_poly": True, "generate_parts": True, "face_limit": 0, "stability": 0, "use_speaker_boost": True, "similarity_boost": 0, "style_exaggeration": 0, "speed": 0, "upscale_ratio": 0, "creativity": 0, "resemblance": 0, "vectorize": True, "remove_background": True, "reframe": True, "refill": True, "seed": -1, "guidance_files": [], "mask": { "file_id": "<uuid>", "for_transparency": True, "for_nontransparency": True, "edge_radius": 0 }, "session_name": "<string>"}headers = { "Authorization": "Bearer <token>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const url = 'https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"model_id":"<uuid>","weight":1,"prompt":"<string>","width":0,"height":0,"batch_size":4,"num_inference_steps":0,"guidance_scale":0,"prompt_strength":0,"quality":"low","sharpness":0,"duration_seconds":0,"generate_audio":true,"keep_audio":true,"fps":0,"video_effects":[],"use_ta_pose":true,"pose_mode":"A_POSE","include_textures":true,"quad_mesh":true,"pbr_materials":true,"low_poly":true,"generate_parts":true,"face_limit":0,"stability":0,"use_speaker_boost":true,"similarity_boost":0,"style_exaggeration":0,"speed":0,"upscale_ratio":0,"creativity":0,"resemblance":0,"vectorize":true,"remove_background":true,"reframe":true,"refill":true,"seed":-1,"guidance_files":[],"mask":{"file_id":"<uuid>","for_transparency":true,"for_nontransparency":true,"edge_radius":0},"session_name":"<string>"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences"
payload := strings.NewReader("{\n \"model_id\": \"<uuid>\",\n \"weight\": 1,\n \"prompt\": \"<string>\",\n \"width\": 0,\n \"height\": 0,\n \"batch_size\": 4,\n \"num_inference_steps\": 0,\n \"guidance_scale\": 0,\n \"prompt_strength\": 0,\n \"quality\": \"low\",\n \"sharpness\": 0,\n \"duration_seconds\": 0,\n \"generate_audio\": true,\n \"keep_audio\": true,\n \"fps\": 0,\n \"video_effects\": [],\n \"use_ta_pose\": true,\n \"pose_mode\": \"A_POSE\",\n \"include_textures\": true,\n \"quad_mesh\": true,\n \"pbr_materials\": true,\n \"low_poly\": true,\n \"generate_parts\": true,\n \"face_limit\": 0,\n \"stability\": 0,\n \"use_speaker_boost\": true,\n \"similarity_boost\": 0,\n \"style_exaggeration\": 0,\n \"speed\": 0,\n \"upscale_ratio\": 0,\n \"creativity\": 0,\n \"resemblance\": 0,\n \"vectorize\": true,\n \"remove_background\": true,\n \"reframe\": true,\n \"refill\": true,\n \"seed\": -1,\n \"guidance_files\": [],\n \"mask\": {\n \"file_id\": \"<uuid>\",\n \"for_transparency\": true,\n \"for_nontransparency\": true,\n \"edge_radius\": 0\n },\n \"session_name\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences", CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => json_encode([ 'model_id' => '<uuid>', 'weight' => 1, 'prompt' => '<string>', 'width' => 0, 'height' => 0, 'batch_size' => 4, 'num_inference_steps' => 0, 'guidance_scale' => 0, 'prompt_strength' => 0, 'quality' => 'low', 'sharpness' => 0, 'duration_seconds' => 0, 'generate_audio' => null, 'keep_audio' => null, 'fps' => 0, 'video_effects' => [
], 'use_ta_pose' => null, 'pose_mode' => 'A_POSE', 'include_textures' => null, 'quad_mesh' => null, 'pbr_materials' => null, 'low_poly' => null, 'generate_parts' => null, 'face_limit' => 0, 'stability' => 0, 'use_speaker_boost' => null, 'similarity_boost' => 0, 'style_exaggeration' => 0, 'speed' => 0, 'upscale_ratio' => 0, 'creativity' => 0, 'resemblance' => 0, 'vectorize' => null, 'remove_background' => null, 'reframe' => null, 'refill' => null, 'seed' => -1, 'guidance_files' => [
], 'mask' => [ 'file_id' => '<uuid>', 'for_transparency' => null, 'for_nontransparency' => null, 'edge_radius' => 0 ], 'session_name' => '<string>' ]), CURLOPT_HTTPHEADER => [ "Authorization: Bearer <token>", "Content-Type: application/json" ],]);
$response = curl_exec($curl);$err = curl_error($curl);
curl_close($curl);
if ($err) { echo "cURL Error #:" . $err;} else { echo $response;}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "{\n \"model_id\": \"<uuid>\",\n \"weight\": 1,\n \"prompt\": \"<string>\",\n \"width\": 0,\n \"height\": 0,\n \"batch_size\": 4,\n \"num_inference_steps\": 0,\n \"guidance_scale\": 0,\n \"prompt_strength\": 0,\n \"quality\": \"low\",\n \"sharpness\": 0,\n \"duration_seconds\": 0,\n \"generate_audio\": true,\n \"keep_audio\": true,\n \"fps\": 0,\n \"video_effects\": [],\n \"use_ta_pose\": true,\n \"pose_mode\": \"A_POSE\",\n \"include_textures\": true,\n \"quad_mesh\": true,\n \"pbr_materials\": true,\n \"low_poly\": true,\n \"generate_parts\": true,\n \"face_limit\": 0,\n \"stability\": 0,\n \"use_speaker_boost\": true,\n \"similarity_boost\": 0,\n \"style_exaggeration\": 0,\n \"speed\": 0,\n \"upscale_ratio\": 0,\n \"creativity\": 0,\n \"resemblance\": 0,\n \"vectorize\": true,\n \"remove_background\": true,\n \"reframe\": true,\n \"refill\": true,\n \"seed\": -1,\n \"guidance_files\": [],\n \"mask\": {\n \"file_id\": \"<uuid>\",\n \"for_transparency\": true,\n \"for_nontransparency\": true,\n \"edge_radius\": 0\n },\n \"session_name\": \"<string>\"\n}");Request request = new Request.Builder() .url("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences") .post(body) .addHeader("Authorization", "Bearer <token>") .addHeader("Content-Type", "application/json") .build();
Response response = client.newCall(request).execute();require 'uri'require 'net/http'
url = URI("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences")
http = Net::HTTP.new(url.host, url.port)http.use_ssl = true
request = Net::HTTP::Post.new(url)request["Authorization"] = 'Bearer <token>'request["Content-Type"] = 'application/json'request.body = "{\n \"model_id\": \"<uuid>\",\n \"weight\": 1,\n \"prompt\": \"<string>\",\n \"width\": 0,\n \"height\": 0,\n \"batch_size\": 4,\n \"num_inference_steps\": 0,\n \"guidance_scale\": 0,\n \"prompt_strength\": 0,\n \"quality\": \"low\",\n \"sharpness\": 0,\n \"duration_seconds\": 0,\n \"generate_audio\": true,\n \"keep_audio\": true,\n \"fps\": 0,\n \"video_effects\": [],\n \"use_ta_pose\": true,\n \"pose_mode\": \"A_POSE\",\n \"include_textures\": true,\n \"quad_mesh\": true,\n \"pbr_materials\": true,\n \"low_poly\": true,\n \"generate_parts\": true,\n \"face_limit\": 0,\n \"stability\": 0,\n \"use_speaker_boost\": true,\n \"similarity_boost\": 0,\n \"style_exaggeration\": 0,\n \"speed\": 0,\n \"upscale_ratio\": 0,\n \"creativity\": 0,\n \"resemblance\": 0,\n \"vectorize\": true,\n \"remove_background\": true,\n \"reframe\": true,\n \"refill\": true,\n \"seed\": -1,\n \"guidance_files\": [],\n \"mask\": {\n \"file_id\": \"<uuid>\",\n \"for_transparency\": true,\n \"for_nontransparency\": true,\n \"edge_radius\": 0\n },\n \"session_name\": \"<string>\"\n}"
response = http.request(request)puts response.read_bodyvar client = new RestClient("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/inferences");var request = new RestRequest("", Method.Post);request.AddHeader("Authorization", "Bearer <token>");request.AddHeader("Content-Type", "application/json");request.AddParameter("application/json", "{\n \"model_id\": \"<uuid>\",\n \"weight\": 1,\n \"prompt\": \"<string>\",\n \"width\": 0,\n \"height\": 0,\n \"batch_size\": 4,\n \"num_inference_steps\": 0,\n \"guidance_scale\": 0,\n \"prompt_strength\": 0,\n \"quality\": \"low\",\n \"sharpness\": 0,\n \"duration_seconds\": 0,\n \"generate_audio\": true,\n \"keep_audio\": true,\n \"fps\": 0,\n \"video_effects\": [],\n \"use_ta_pose\": true,\n \"pose_mode\": \"A_POSE\",\n \"include_textures\": true,\n \"quad_mesh\": true,\n \"pbr_materials\": true,\n \"low_poly\": true,\n \"generate_parts\": true,\n \"face_limit\": 0,\n \"stability\": 0,\n \"use_speaker_boost\": true,\n \"similarity_boost\": 0,\n \"style_exaggeration\": 0,\n \"speed\": 0,\n \"upscale_ratio\": 0,\n \"creativity\": 0,\n \"resemblance\": 0,\n \"vectorize\": true,\n \"remove_background\": true,\n \"reframe\": true,\n \"refill\": true,\n \"seed\": -1,\n \"guidance_files\": [],\n \"mask\": {\n \"file_id\": \"<uuid>\",\n \"for_transparency\": true,\n \"for_nontransparency\": true,\n \"edge_radius\": 0\n },\n \"session_name\": \"<string>\"\n}", ParameterType.RequestBody);var response = client.Execute(request);Start an AI inference (image, video, 3D, or audio). Returns immediately with an ID. Poll with GET /workspaces/{workspace_id}/inferences/{inference_id} for results. Creative Units are not checked here: an underfunded workspace is still accepted and the run then reports FAILED with error_code INSUFFICIENT_BALANCE. Use the estimate endpoint’s has_sufficient_creative_units to check before submitting.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”REST request body for executing an inference. workspace_id comes from path.
object
Model/style ID to use for generation.
Style/LoRA strength applied to the model. 1.0 = as trained; lower weakens, higher over-applies the style. Only affects LoRA/adapter-backed styles; ignored for models without a trainable adapter.
Number of outputs (1-16).
Canonical rest pose a character-mesh model is asked to generate in.
A_POSE places the arms angled down at roughly 45°; T_POSE holds them
straight out to the sides. Only meaningful for models that advertise the
pose_modes capability (e.g. Meshy V7).
Deliberately a light top-level module (like base_model_id), NOT under
pkg.models.inference: the Blueprint definition layer registers this as a
BlueprintType and migrates legacy node ports, and must do so without pulling
in the heavy pkg.models.inference package, which would perturb the Temporal
workflow-sandbox import graph and split pydantic class identity.
Random seed. -1 for random.
Reference images/files to guide generation.
Responses
Section titled “Responses”Successful Response
object
Unique identifier for this forge run.
Current status: IN_PROGRESS.
Suggested polling interval in seconds.
Timestamp of when the run was created.
Inference parameters after model-specific normalization.
These reflect the actual values used for generation, including model defaults applied for any parameters not explicitly set.
Example
{ "status": "in_progress"}Unauthenticated — missing or invalid Bearer token.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Forbidden — insufficient permissions.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Resource not found.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Invalid input parameters.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Rate limited — too many concurrent requests.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Internal server error.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}