{
  "catalog_version": "2026-09-26.1",
  "updated": "2026-09-26",
  "base_url": "https://dashboard.alphanetplus.com",
  "aspects": [
    {
      "value": "1:1",
      "size": "1024 × 1024"
    },
    {
      "value": "3:4",
      "size": "768 × 1024"
    },
    {
      "value": "4:3",
      "size": "1024 × 768"
    },
    {
      "value": "2:3",
      "size": "768 × 1152"
    },
    {
      "value": "3:2",
      "size": "1152 × 768"
    },
    {
      "value": "16:9",
      "size": "1344 × 768"
    },
    {
      "value": "9:16",
      "size": "768 × 1344"
    }
  ],
  "flow": [
    {
      "step": 1,
      "method": "POST",
      "path": "/v1/flux/uploads",
      "title": "Open an upload ticket",
      "detail": "One ticket per reference image. The response carries the URL to PUT the bytes to, the file id you submit, and the byte ceiling."
    },
    {
      "step": 2,
      "method": "PUT",
      "path": "{upload_url}",
      "title": "Upload the bytes",
      "detail": "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."
    },
    {
      "step": 3,
      "method": "POST",
      "path": "/v1/tasks/alphanet-flux",
      "title": "Submit the task",
      "detail": "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."
    },
    {
      "step": 4,
      "method": "GET",
      "path": "/v1/tasks/{task_id}",
      "title": "Poll, then fetch the result",
      "detail": "Poll until the status is terminal, then read /v1/tasks/{task_id}/result for the signed URLs and the sha256 of each artifact."
    }
  ],
  "model": {
    "id": "tryon-quality",
    "label": "Virtual try-on",
    "summary": "Puts the garment from one photo onto the person in another. Two references, in order, and no prompt.",
    "capability": "tool_tryon",
    "inputs": {
      "min": 2,
      "max": 2,
      "slots": [
        "person",
        "garment"
      ]
    },
    "params": [
      {
        "name": "garment_type",
        "type": "string",
        "values": "top | bottom | dress | outfit",
        "default": "top",
        "note": "Which part of the outfit the reference replaces. Omitted, the reference is read as a top."
      },
      {
        "name": "aspect",
        "type": "string",
        "values": "1:1 | 3:4 | 4:3 | 2:3 | 3:2 | 16:9 | 9:16",
        "note": "Optional. Omitted, the output follows the person photo’s shape — a 3:4 portrait comes back 768 × 1024."
      },
      {
        "name": "seed",
        "type": "integer"
      }
    ],
    "refuses": [
      "prompt",
      "width",
      "height",
      "num_inference_steps",
      "max_sequence_length",
      "output_format",
      "output_quality"
    ],
    "output": "PNG shaped like the person photo (3:4 → 768 × 1024). Face, hair, pose, other clothing and background are asked to stay identical.",
    "latency": "~69 s end to end, 59 s of it inference (measured 2026-09-26)",
    "limits": [
      "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."
    ],
    "submit_body_example": {
      "model": "tryon-quality",
      "image_ids": [
        "<person_file_id>",
        "<garment_file_id>"
      ],
      "garment_type": "top"
    },
    "price": "$0.01 per call",
    "try_it": "/virtual-try-on",
    "cases": [
      "tryon-top"
    ],
    "verified": "2026-09-26 (public gateway, re-measured); the 10/10 pass including the idempotency pair was 2026-09-25"
  }
}
