Quickstart
Three steps of setup, then one request. Nothing here needs a sales call or a subscription.
Set up
- Create an account and add credit on the credit page. Credit is spent per request.
- Create an API key under API keys. The secret is shown once and never again.
- Pick a model id from the live catalog, which shows prices and how many providers are online right now.
Make a request
POST /v1/workflowsWORKFLOWS · mayhem_comfy_workflows +
Working request
curl https://api.openmayhem.ai/v1/workflows \
-H "Authorization: Bearer $OPENMAYHEM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"model": "image.edit.le2mp",
"workflow": {},
"input_files": [
{
"filename": "refs/input.png",
"kind": "image",
"content_type": "image/png",
"encoding": "base64",
"data": "<BASE64_IMAGE>"
}
],
"response_format": "artifact",
"timeout_ms": 120000
}'Parameters
| Parameter | Required | Type | Default | Allowed values | Limits and shape |
|---|---|---|---|---|---|
input_files | Required | array | — | — | min items 1; max items 2 [{"filename":"refs/input.png","kind":"image","content_type":"image/png","encoding":"base64","data":"<BASE64_IMAGE>"}] |
model | Required | string | — | — | — |
workflow | Required | object | — | — | {"node-id":{"class_type":"AllowedNode","inputs":{}}} |
outcome_class | Optional | string | — | — | min length 1; max length 128 |
response_format | Optional | string | artifact | artifact, json | {"type":"json_object"} |
runtime_id | Optional | string | — | — | min length 1; max length 128 |
timeout_ms | Optional | integer | 120000 | — | min 1000; max 3600000 |
user | Optional | string | — | — | min length 1; max length 512 |
Input shapes
input_files
{
"model": "image.edit.le2mp",
"input_files": [
{
"filename": "refs/input.png",
"kind": "image",
"content_type": "image/png",
"encoding": "base64",
"data": "<BASE64_IMAGE>"
}
]
}Jobs are asynchronous. The submit call returns a job. Poll GET /v1/jobs/{job_id}; when it succeeds, download each artifact from its artifact URL.
Workflow surface
Use the complete starter. Node roles, classes, inputs, presets and add-ons below are the values admitted for this workflow.
Workflow nodes
| Node ID / role | Class | Inputs |
|---|---|---|
clip | CLIPLoader | clip_name: part; required; part qwen3vl_4b_fp8_scaled.safetensors device: string; required; fixed default type: string; required; fixed krea2 |
decode | VAEDecode | samples: link; required; from sampler[0] vae: link; required; from vae[0] |
denoiser | UNETLoader | unet_name: part; required; part krea2_turbo_fp8_scaled.safetensors weight_dtype: string; required; fixed default |
edit_patch | Krea2EditModelPatch | fit_mode: string; required; values fit model: link; required; from system_lora[0] ref_boost: number; required; min 1; max 4 ref_boost_a: number; required; min 1; max 4 source_image: link; required; from reference_a[0] or scene_scale[0] source_image_b: link; optional; from reference_b[0] source_latent: link; required; from encode_a[0] source_latent_b: link; optional; from encode_b[0] target_latent: link; required; from latent[0] vae: link; required; from vae[0] |
encode_a | VAEEncode | pixels: link; required; from reference_a[0] or scene_scale[0] vae: link; required; from vae[0] |
encode_b | VAEEncode | pixels: link; required; from reference_b[0] vae: link; required; from vae[0] |
latent | EmptySD3LatentImage | batch_size: integer; required; min 1; max 1 height: integer; required; min 256; max 1920; multiple of 64 width: integer; required; min 256; max 1920; multiple of 64 |
negative | Krea2EditGroundedEncode | clip: link; required; from clip[0] grounding_px: integer; required; values 768 image: link; required; from reference_a[0] or scene_scale[0] image_b: link; optional; from reference_b[0] prompt: string; required system_prompt: string; required; fixed |
output | SaveImage | filename_prefix: string; required images: link; required; from decode[0] |
positive | Krea2EditGroundedEncode | clip: link; required; from clip[0] grounding_px: integer; required; values 768 image: link; required; from reference_a[0] or scene_scale[0] image_b: link; optional; from reference_b[0] prompt: string; required system_prompt: string; required; fixed |
reference_a | LoadImage | image: string; required |
reference_b | LoadImage | image: string; required |
sampler | KSampler | cfg: number; required; min 1; max 4 denoise: number; required; fixed 1 latent_image: link; required; from latent[0] model: link; required; from edit_patch[0] negative: link; required; from negative[0] positive: link; required; from positive[0] sampler_name: string; required; values euler scheduler: string; required; values simple seed: integer; required; min 0; max 9007199254740991 steps: integer; required; min 1; max 10 |
scene_scale | ImageScale | crop: string; required; fixed disabled height: integer; required; fixed 1024 image: link; required; from reference_a[0] upscale_method: string; required; fixed lanczos width: integer; required; fixed 1024 |
system_lora | LoraLoaderModelOnly | lora_name: part; required; part Krea2/krea2_identity_edit_v1_2.safetensors model: link; required; from denoiser[0] strength_model: number; required; fixed 1 |
vae | VAELoader | vae_name: part; required; part qwen_image_vae.safetensors |
Presets
| Preset | Applied values |
|---|---|
turboTurbo | sampler.steps=10; sampler.cfg=1; sampler.sampler_name=euler; sampler.scheduler=simple; edit_patch.ref_boost=4; edit_patch.ref_boost_a=1; positive.grounding_px=768 |
Agent drop-ins
This is a media endpoint, so it cannot replace the text model that drives a coding agent. Call the request above from the agent’s HTTP or tool layer.
Routing and trust: Catalog filters, provider constraints, attestation and retail cost limits.