Integration
The image API, on one page
Nine image models behind one asynchronous API: open an upload ticket, put the bytes, submit the task, poll it, fetch the signed result. This page is what an integrator reads; the gateway is what it calls. Both — and the JSON below — are rendered from one catalog file, so they cannot disagree. Every number here is a measurement with its date.
Two entry points
- Read — this page, /api-catalog.json for every model, and
/api-catalog/<model>.jsonfor one. No key required. - Call — https://dashboard.alphanetplus.com: sign in, copy the project API key, then
GET /v1/modelswith it to list the model ids that key may use.
| Fact | Value |
|---|---|
| Calls go to | https://dashboard.alphanetplus.com |
| Authentication | Authorization: Bearer <project API key> |
| Price | $0.01 per call |
| Upload ceiling | 10 MiB per reference image |
| Result URLs | signed, and they expire 900 s after the task finishes |
| Catalog version | 2026-09-26.1 (updated 2026-09-26) |
The four steps
- 1. Open an upload ticket —
POST /v1/flux/uploads
One ticket per reference image. The response carries the URL to PUT the bytes to, the file id you submit, and the byte ceiling. - 2. Upload the bytes —
PUT {upload_url}
Send the file itself to the signed URL, with the headers from the ticket. Nothing else goes through our API: the bytes go straight to storage. - 3. Submit the task —
POST /v1/tasks/alphanet-flux
The model id and the file ids in order. Always send an Idempotency-Key: the same key and body return the same task, a different body under the same key is refused with 409. - 4. Poll, then fetch the result —
GET /v1/tasks/{task_id}
Poll until the status is terminal, then read /v1/tasks/{task_id}/result for the signed URLs and the sha256 of each artifact.
The nine models
| Model | What you get | References | Measured |
|---|---|---|---|
flux-klein | Generative edit, upscale and restore | 1–4 | ~16 s end to end for a 1152 × 1536 render, 6.4 s of it inference (measured 2026-09-26); the rest is queueing and the result upload |
pixrestore-s | Detail restore | 1 | ~3.5 s for a 3131 × 1549 frame (measured 2026-09-17, end to end) |
cutout-fast | Background removal | 1 | ~5 s end to end, 0.8 s of it inference (measured 2026-09-26) |
erase-quality | Generative erase | 1 | ~54 s end to end, 50 s of it inference (measured 2026-09-22) |
vectorize-fast | Image to SVG | 1 | ~7 s end to end, 0.4 s of it tracing (measured 2026-09-22) |
tryon-quality | Virtual try-on | 2 | ~69 s end to end, 59 s of it inference (measured 2026-09-26) |
interior-quality | Interior render | 1–2 | ~59 s of inference (measured 2026-09-25) |
retouch-quality | Portrait retouch | 1 | ~79 s end to end, 61 s of it inference (measured 2026-09-25) |
makeup-quality | Virtual makeup | 1–2 | ~62 s of inference (measured 2026-09-25) |
Model by model
flux-klein — Generative edit, upscale and restore
The general-purpose editor: your prompt decides what happens, and the output is the size you ask for.
Capability generative_repaint · verified 2026-09-26 (public gateway) · JSON for this model
References
image_ids[0]— the image to edit
Returns: PNG or WebP at the width and height you sent; 1–4 references may be combined.
Measured: ~16 s end to end for a 1152 × 1536 render, 6.4 s of it inference (measured 2026-09-26); the rest is queueing and the result upload
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| prompt (required) | string | — | — | What should change. The only model here that reads your own words. |
| width | integer | — | 1024 | Output width: a multiple of 16, at most 1536 px. |
| height | integer | — | 1024 | Output height, under the same rules. |
| num_inference_steps | integer | — | 4 | Four steps unless you ask for more; more steps refine detail and take longer. |
| seed | integer | — | — | Same seed and body reproduces the same render. |
| max_sequence_length | integer | — | — | |
| output_format | string | png | webp | — | |
| output_quality | integer | — | — |
Where it stops
- It is a generative re-render: faces and small text can shift. Review the result at 100% before publishing.
- It cannot add detail that was never captured with certainty — an upscale reconstructs plausible texture, not the original pixels.
{
"model": "flux-klein",
"image_ids": [
"<file_id>"
],
"prompt": "Restore realistic detail, texture and sharpness at 2x the size while keeping the composition identical. Do not add objects and do not change the framing.",
"width": 1152,
"height": 1536,
"num_inference_steps": 8,
"seed": 42,
"output_format": "png"
}pixrestore-s — Detail restore
Renders a sharper, cleaner version of an image at its own size. No prompt, no knobs beyond steps.
Capability detail_restore · verified 2026-09-17 (public gateway, 8/8 with the idempotency pair) · JSON for this model
References
image_ids[0]— the image
Returns: PNG at the input size.
Measured: ~3.5 s for a 3131 × 1549 frame (measured 2026-09-17, end to end)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| num_inference_steps | integer | 1–4 | 1 | One pass is the service default, and on this model one pass measured better than four on 2026-09-17 — more steps is not more detail here. |
| seed | integer | — | — |
Refused, not ignored: width, height, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- The result is "clearer", not "faithful": detail is generated, so fine text and small patterns can change. It is not a lossless enlarger.
- It does not resize: send the size you want to keep, or upscale separately.
{
"model": "pixrestore-s",
"image_ids": [
"<file_id>"
],
"num_inference_steps": 1,
"seed": 42
}cutout-fast — Background removal
Cuts the subject out and answers a PNG with an alpha channel at the input size.
Capability tool_cutout · verified 2026-09-26 (public gateway) · JSON for this model
References
image_ids[0]— the photo
Returns: PNG with transparency, at the input size — 768 × 1024 in, 768 × 1024 out.
Measured: ~5 s end to end, 0.8 s of it inference (measured 2026-09-26)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| bg_color | string | — | — | Fill the removed background with a colour instead of leaving it transparent. |
| bg_model | string | — | — | Which matting model the service picks (isnet, birefnet or u2net family). |
| alpha_matting | string | — | — | Softer edges on hair and fur, at a little more time. |
Refused, not ignored: width, height, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- Fine hair, glass and motion blur keep some background; a see-through subject cannot be cut cleanly.
- The cut is the whole frame. There is no per-object selection: one subject per call.
{
"model": "cutout-fast",
"image_ids": [
"<file_id>"
]
}erase-quality — Generative erase
Names what should go; the model removes it and rebuilds the surface underneath.
Capability tool_erase · verified 2026-09-22 (public gateway, 8/8) · JSON for this model
References
image_ids[0]— the photo
Returns: PNG at a fixed 1024 × 1024, whatever the input size was.
Measured: ~54 s end to end, 50 s of it inference (measured 2026-09-22)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| prompt (required) | string | — | — | The object or mark to remove. |
| num_inference_steps | integer | 4–20 | 8 | |
| seed | integer | — | — |
Refused, not ignored: width, height, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- The whole frame is re-rendered at 1024², so a larger original comes back at that size and fine text elsewhere can drift.
- It removes what you name; it does not understand "remove the person but keep the shadow".
{
"model": "erase-quality",
"image_ids": [
"<file_id>"
],
"prompt": "Remove the spoon from the table and rebuild the wooden surface behind it; keep the mug, the napkin and the lighting exactly as they are.",
"num_inference_steps": 8,
"seed": 42
}vectorize-fast — Image to SVG
Traces a bitmap into real vector paths and answers an SVG — so it scales to any size without blurring.
Capability tool_vectorize · verified 2026-09-22 (public gateway, 8/8) · JSON for this model
References
image_ids[0]— the bitmap
Returns: image/svg+xml. The SVG declares its own width and height, so the JSON result reports width/height as null.
Measured: ~7 s end to end, 0.4 s of it tracing (measured 2026-09-22)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| preset | string | logo | illustration | photo | logo | A fixed parameter set on the service, not free text. |
| max_edge | integer | 256–2048 | 1024 | Long edge the trace runs at; larger input is downscaled to it. |
| colors | integer | 2–64 | — | |
| filter_speckle | integer | 0–32 | — | Drops specks smaller than this many pixels. |
Refused, not ignored: width, height, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- A photograph comes back posterised: the photo preset limits the palette to 16 colours before tracing.
- The output is paths, not an embedded bitmap — expect a small file for a logo and a large one for a picture.
{
"model": "vectorize-fast",
"image_ids": [
"<file_id>"
],
"preset": "logo"
}tryon-quality — Virtual try-on
Puts the garment from one photo onto the person in another. Two references, in order, and no prompt.
Capability tool_tryon · verified 2026-09-26 (public gateway, re-measured); the 10/10 pass including the idempotency pair was 2026-09-25 · JSON for this model
References
image_ids[0]— personimage_ids[1]— garment
Returns: PNG shaped like the person photo (3:4 → 768 × 1024). Face, hair, pose, other clothing and background are asked to stay identical.
Measured: ~69 s end to end, 59 s of it inference (measured 2026-09-26)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| garment_type | string | top | bottom | dress | outfit | top | Which part of the outfit the reference replaces. Omitted, the reference is read as a top. |
| aspect | string | 1:1 | 3:4 | 4:3 | 2:3 | 3:2 | 16:9 | 9:16 | — | Optional. Omitted, the output follows the person photo’s shape — a 3:4 portrait comes back 768 × 1024. |
| seed | integer | — | — |
Refused, not ignored: prompt, width, height, num_inference_steps, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- One garment per call: the reference is read as a single piece, so a top and a bottom need two calls.
- The order of image_ids is the meaning — person first, garment second. Swapping them changes the result, not the error.
- Layered outfits, heavy shadows across the garment and unusual poses are the hard cases.
{
"model": "tryon-quality",
"image_ids": [
"<person_file_id>",
"<garment_file_id>"
],
"garment_type": "top"
}interior-quality — Interior render
Turns an empty or unfinished room into a furnished render in a named style, keeping the architecture where it is.
Capability tool_interior · verified 2026-09-25 (public gateway, 8/8) · JSON for this model
References
image_ids[0]— roomimage_ids[1]— style reference (optional)
Returns: PNG shaped like the room photo (3:2 → 1152 × 768), with walls, windows, doors, ceiling line and camera angle held.
Measured: ~59 s of inference (measured 2026-09-25)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| style | string | nordic | cream | japandi | chinese | industrial | french | nordic | Each style is a fixed recipe of materials, furniture and lighting. |
| room_type | string | living_room | bedroom | dining_room | study | kitchen | bathroom | kids_room | balcony | living_room | |
| extra | string | — | — | Up to 120 characters of extra brief, folded into the fixed instruction. Longer is refused: it would start to override the parts that hold the room in place. |
| aspect | string | 1:1 | 3:4 | 4:3 | 2:3 | 3:2 | 16:9 | 9:16 | — | Optional. Omitted, the output follows the room photo’s shape — 3:2 comes back 1152 × 768. |
| seed | integer | — | — |
Refused, not ignored: prompt, width, height, num_inference_steps, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- Start from the emptiest frame you have: a room that is already furnished comes back redesigned rather than built on.
- The second reference steers palette and materials only — it cannot add a wall or move a window.
- It is a visualisation, not a measured plan: sockets, floor coverings and furniture proportions can differ from the building.
{
"model": "interior-quality",
"image_ids": [
"<room_file_id>"
],
"style": "nordic",
"room_type": "living_room",
"extra": "light oak flooring, a linen sofa, a round wooden coffee table, a woven rug, a floor lamp and green plants"
}retouch-quality — Portrait retouch
Cleans up a portrait — skin, under-eyes, eyes, stray hairs — without changing the face.
Capability tool_retouch · verified 2026-09-25 (public gateway, 8/8) · JSON for this model
References
image_ids[0]— portrait
Returns: PNG shaped like the portrait, with skin grain kept.
Measured: ~79 s end to end, 61 s of it inference (measured 2026-09-25)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| level | string | light | natural | strong | natural | |
| aspect | string | 1:1 | 3:4 | 4:3 | 2:3 | 3:2 | 16:9 | 9:16 | — | Optional. Omitted, the output follows the portrait’s shape (fallback 1:1). |
| seed | integer | — | — |
Refused, not ignored: prompt, width, height, num_inference_steps, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- It will not slim a face, widen the eyes or change a hairstyle: that is the instruction, not a setting.
- It does not add makeup — that is the separate virtual-makeup model.
- A heavy filter look is refused on purpose; the result keeps visible texture.
{
"model": "retouch-quality",
"image_ids": [
"<portrait_file_id>"
],
"level": "natural"
}makeup-quality — Virtual makeup
Applies a named makeup look to a face, optionally matched from a reference photo.
Capability tool_makeup · verified 2026-09-25 (public gateway, 8/8) · JSON for this model
References
image_ids[0]— portraitimage_ids[1]— makeup reference (optional)
Returns: PNG shaped like the portrait. Identity, expression, hair, clothing, framing and lighting are asked to stay as they are.
Measured: ~62 s of inference (measured 2026-09-25)
Parameters
| Field | Type | Values | Default | Notes |
|---|---|---|---|---|
| look | string | daily | korean | glam | bridal | latte | retro | daily | A fixed recipe of base, contour, brows, eyeshadow, liner, lashes and lip. |
| intensity | string | light | medium | strong | medium | |
| aspect | string | 1:1 | 3:4 | 4:3 | 2:3 | 3:2 | 16:9 | 9:16 | — | Optional. Omitted, the output follows the portrait’s shape (fallback 1:1). |
| seed | integer | — | — |
Refused, not ignored: prompt, width, height, num_inference_steps, max_sequence_length, output_format, output_quality — sending one fails the call instead of being dropped.
Where it stops
- A look is a recipe, not a brand shade: use it to compare directions, not to promise an exact product.
- The palette is matched to this person’s undertone and the original lighting, so the same reference gives a different result on another photo.
{
"model": "makeup-quality",
"image_ids": [
"<portrait_file_id>"
],
"look": "korean",
"intensity": "medium"
}A worked request for cutout-fast: {
"model": "cutout-fast",
"image_ids": [
"<file_id>"
]
} submitted to POST /v1/tasks/alphanet-flux, polled at GET /v1/tasks/{task_id}, results read at GET /v1/tasks/{task_id}/result.
Output shapes for the four productised models
Omitted, aspect follows the first reference image instead of forcing a square: 1:1 = 1024 × 1024 · 3:4 = 768 × 1024 · 4:3 = 1024 × 768 · 2:3 = 768 × 1152 · 3:2 = 1152 × 768 · 16:9 = 1344 × 768 · 9:16 = 768 × 1344.
For a machine
The whole catalog is at /api-catalog.json, one model per file at /api-catalog/<model>.json. Model names are frozen: they are billing-visible, so renaming one is a breaking change.