Apps Endpoint
The Apps API lets you execute reusable workflow apps built in Armox Canvas.
Base paths:
GET https://armox.ai/api/v1/appsPOST https://armox.ai/api/v1/apps/run
GET /api/v1/apps
Lists active template apps and private apps your user can access.
Request
curl -X GET "https://armox.ai/api/v1/apps" \
-H "Authorization: Bearer sk_live_your_key_here"
Response (Important)
The inputs array is the contract for POST /api/v1/apps/run:
inputs[].idis the key you must send ininputsobjectinputs[].requiredmeans the value must be presentinputs[].allowMultiple: truemeans send an array (for example, image URL list)inputs[].targetHandletells which model setting/input this maps to
Prompt Template
{ "object": "list", "data": [ { "id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "name": "Sketch to Render", "description": "Convert sketches into photorealistic renders", "icon": null, "thumbnail_url": "https://...", "is_template": true, "brain_id": "f53d5c9f-b91d-469c-9390-dd1552878255", "tags": ["Photorealistic Render"], "inputs": [ { "id": "93197f6b-0180-4da1-ad4a-87890d2c7d4a", "type": "image", "label": "Input Images", "required": true, "targetHandle": "image_input", "allowMultiple": true }, { "id": "ced4aa7b-a2a8-4b53-b9ea-1b3e7d9194b5", "type": "text", "label": "Aspect Ratio", "required": true, "targetHandle": "aspect_ratio" } ] } ] }
POST /api/v1/apps/run
Executes one app workflow and returns an async job.
Request Body
Prompt Template
{ "app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "inputs": { "93197f6b-0180-4da1-ad4a-87890d2c7d4a": [ "https://example.com/reference-image.jpg" ], "ced4aa7b-a2a8-4b53-b9ea-1b3e7d9194b5": "auto" }, "webhook_url": "https://your-app.com/webhooks/armox" }
Fields:
app_id(required): app identifier fromGET /api/v1/appsinputs(object): key-value map where each key must be aninputs[].idreturned byGET /api/v1/appswebhook_url(optional): callback URL
Validation Rules
- app must exist and be active
- user must have access to non-template app resources
- all required app inputs must be provided
- input value type must match the app input contract (
stringvsarray, etc.)
If required inputs are missing, response is 400 with:
{ "error": "Missing required inputs: Prompt" }
Response (202)
POST /api/v1/apps/run is asynchronous.
{
"id": "0fefb57b-a89a-46f3-b7f6-da24841722f4",
"object": "job",
"status": "processing",
"run_type": "app",
"app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb",
"app_name": "Sketch to Render",
"credits_charged": 200,
"created_at": "2026-04-06T11:15:14.964978+00:00"
}
End-to-End Example (Real Flow)
- List apps with
GET /api/v1/apps - Find your app and map
inputs[].id-> values - Run it using
POST /api/v1/apps/run - Poll
GET /api/v1/jobs/:iduntil terminal state - Read outputs from
output_data.node_outputs
cURL
Prompt Template
curl -X POST "https://armox.ai/api/v1/apps/run" \ -H "Authorization: Bearer sk_live_your_key_here" \ -H "Content-Type: application/json" \ -d '{ "app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "inputs": { "93197f6b-0180-4da1-ad4a-87890d2c7d4a": [ "https://example.com/reference-image.jpg" ], "ced4aa7b-a2a8-4b53-b9ea-1b3e7d9194b5": "auto" } }'
JavaScript
Prompt Template
const appId = "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb"; const runResponse = await fetch("https://armox.ai/api/v1/apps/run", { method: "POST", headers: { Authorization: "Bearer sk_live_your_key_here", "Content-Type": "application/json", }, body: JSON.stringify({ app_id: appId, inputs: { "93197f6b-0180-4da1-ad4a-87890d2c7d4a": [ "https://example.com/reference-image.jpg", ], "ced4aa7b-a2a8-4b53-b9ea-1b3e7d9194b5": "auto", }, }), }); const runJob = await runResponse.json(); console.log("Initial job:", runJob);
Typical Completed Job
Prompt Template
{ "object": "job", "id": "0fefb57b-a89a-46f3-b7f6-da24841722f4", "run_type": "app", "model_id": null, "app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "status": "completed", "input_data": { "app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "inputs": { "93197f6b-0180-4da1-ad4a-87890d2c7d4a": [ "https://example.com/reference-image.jpg" ], "ced4aa7b-a2a8-4b53-b9ea-1b3e7d9194b5": "auto" } }, "output_data": { "app_id": "cb2bbd2d-b538-4d34-a54e-a9158c2e0dbb", "app_name": "Sketch to Render", "node_outputs": { "6fa95504-bf6c-44e6-bdda-c418903abc8c": { "outputImage": "https://armox-storage.s3.us-west-2.amazonaws.com/public/canvas-images/transform-this-architectural-h-2aebaf05-2c74-4b02-be78-979885f22aef.jpeg" } } }, "error_message": null, "credits_charged": 200, "created_at": "2026-04-06T11:15:14.964978+00:00", "completed_at": "2026-04-06T11:17:14.985+00:00", "webhook_delivered": false }
Reading output_data.node_outputs
node_outputskeys are internal node IDs (dynamic per app)- output payload varies by node/model (
outputImage,outputVideo,outputAudio, etc.) - for app runs,
model_idat job root is typicallynull
Polling Tip (Avoid 429)
- Poll every
10-15seconds instead of every 2-4 seconds - If you receive
429, readRetry-After, wait, then retry - Best practice: combine polling with
webhook_url
Cost and Credits
Apps may run multiple nodes internally. Credits are deducted when the app run is accepted.
If the final job fails, credits are refunded according to job handling logic.