IdealFactory Developer Docs

Orders & print files

When a customer pays in your checkout, tell us which designs they bought and in what quantities. We render the production files and hand you download links. You send design references and quantities only — no customer names, no addresses, no prices. Money and customer data stay entirely in your system: this API has no fields for them, so nothing can leak by accident.

Producing in-house is what this API models. If you later want IdealFactory to arrange production and shipping for you, that is a separate, explicit integration — it necessarily includes a shipping address, and this endpoint will never quietly start carrying one.

Both endpoints authenticate with your API token (Authorization: Bearer …) — server to server, never from a page.

Create the order

Call once when your order is paid:

POSThttps://api.idealfactory.com/v1/shop/orders

{
  "external_id": "your-order-1001",
  "lines": [
    { "design_version_id": "01j9…", "quantity": 3, "external_id": "your-line-1" },
    { "design_version_id": "01j9…", "quantity": 1, "external_id": "your-line-2" }
  ]
}

The response is the same shape as the status poll below (201 on create).

curl -X POST https://api.idealfactory.com/v1/shop/orders \
  -H "Authorization: Bearer $IF_API_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{"external_id":"your-order-1001","lines":[{"design_version_id":"01j9…","quantity":3}]}'

Poll status & collect files

GEThttps://api.idealfactory.com/v1/shop/orders/{your-order-ref}

{
  "data": {
    "reference_number": "IF2608-0042",
    "external_id": "your-order-1001",
    "lines": [
      {
        "external_id": "your-line-1",
        "design_version_id": "01j9…",
        "quantity": 3,
        "prints": [
          {
            "id": "01j9…",
            "status": "processing",
            "files": [
              { "index": 0, "type": "single_file", "copies": 1,
                "url": "https://…/print-files/01j9…/0?token=…" }
            ]
          }
        ]
      }
    ]
  }
}

Print statuses

prints[].status is one of exactly four values:

Status Meaning Your move
processing Queued or rendering — files is still empty Keep polling (or wait for the webhook)
ready Files are rendered — files is populated Download
failed The render failed or an operator flagged an issue Contact IdealFactory with the reference_number
cancelled The item was cancelled on our side Stop polling this item

Webhook: print_files.ready

Instead of polling on a timer, register a webhook URL (with your shop's connection) and we POST to it as each item's files finish rendering:

{
  "event": "print_files.ready",
  "order_external_id": "your-order-1001",
  "line_external_id": "your-line-1",
  "design_version_id": "01j9…",
  "print_id": "01j9…",
  "status": "ready",
  "files": [ { "index": 0, "type": "single_file", "copies": 1, "url": "…" } ],
  "sent_at": "2026-08-24T12:00:00+00:00"
}

Three rules to build against:

$expected = 'sha256='.hash_hmac('sha256', $rawBody, $secret);
abort_unless(hash_equals($expected, $signatureHeader), 401);

Print-file URLs

The files[].url links are self-contained: a plain GET that redirects to the file, authenticated by a token scoped to that one order. Properties worth knowing:

Files are also always available to your team in the IdealFactory brand panel under Fulfillment → Prints, with the same references — useful before any automation exists, and as the manual fallback ever after.