QR codes & minting

Called with brand account keys. A key only sees its own account's data. Every example uses the same sample brand, order and item, so you can follow one item from call to call.

Base URL http://62.169.23.239:8001/api/v1Auth Bearer token13 endpoints

Set up the QR batch#

PUT/brands/qr-wizard/orders/{order_id}/step-1

Requires scope qr:write

Save step 1 batch metadata and optional per-variant batch SKUs.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Request body

  • production_datedateRequired
  • batch_typestring
    One ofnew_batchrestock

    Defaults to new_batch

  • batch_skusarray of objects
    +Show 3 child attributes
    • sizestringRequired

      Size name, exactly as on the product's variants.

    • colorstringRequired

      Colour name, exactly as on the product's variants.

    • batch_skustring | null

      SKU printed on the label for this variant in this batch.

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • flow_typestringRequired

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable
  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofdraftstep_1_completestep_2_completestep_3_completefinalizedtransmittedprintinglabels_printedcancelled
  • wizard_stepintegerRequired
  • orderobjectRequired
    +Show 12 child attributes
    • order_idstringRequired

      Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

    • production_order_idstringRequired

      Human-readable order number shown in the portal (PO-YYYY-XXXX).

    • order_namestring | null
    • product_idstringRequired

      Skannit's id for the product.

    • product_namestringRequired
    • category_pathstring

      Defaults to

    • image_urlstring | null
    • total_quantityintegerRequired
    • order_datedate | null
    • expected_deliverydate | null

      Date the goods should leave the factory.

    • factory_namestring | null
    • factory_idstring | null

      The factory making the order. You get it from your factory partnerships in the portal.

  • product_contextobjectRequired
    +Show 6 child attributes
    • specifications_blurbstring | null
    • stock_unitsinteger

      Defaults to 0

    • qr_capacitystring
      One ofhighmediumlow

      Defaults to medium

    • lifecycle_stagestring | null
    • factory_originstring | null
    • batch_history_countinteger

      Defaults to 0

  • total_quantityintegerRequired
  • allocated_totalintegerRequired
  • is_allocation_completebooleanRequired
  • production_datedate | null
  • batch_typestringRequired
    One ofnew_batchrestock
  • selected_sizesarray of strings
  • selected_colorsarray of strings
  • allocationsarray of objects
    +Show 5 child attributes
    • sizestringRequired

      Size name, exactly as on the product's variants.

    • colorstringRequired

      Colour name, exactly as on the product's variants.

    • quantityintegerRequired

      Number of units.

    • batch_skustring | null

      SKU printed on the label for this variant in this batch.

    • volume_lstring | null

      Packaged volume of one unit, in litres. Used to size boxes.

PUT /brands/qr-wizard/orders/{order_id}/step-1
curl
curl -X PUT http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/step-1 \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "batch_type": "standard",
    "production_date": "2026-10-20",
    "batch_skus": [
      {
        "color": "White",
        "size": "M",
        "batch_sku": "TT-100-WHT-M"
      }
    ]
  }'
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "flow_type": "standard",
  "status": "draft",
  "wizard_step": 1,
  "order": {
    "order_id": "ord_8c2f4e1a9b7d3c60",
    "production_order_id": "PO-2026-7F3A",
    "order_name": "Trail Tee — AW26 drop",
    "product_id": "f6abe715-90aa-5908-a0a6-12951a3a21cc",
    "product_name": "Trail Tee",
    "category_path": "Apparel / Tops",
    "image_url": "https://files.skannit.example/image.png",
    "total_quantity": 24,
    "order_date": "2026-10-09",
    "expected_delivery": "2026-11-20",
    "factory_name": "Porto Knit",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70"
  },
  "product_context": {
    "specifications_blurb": "180 gsm organic cotton jersey",
    "stock_units": 24,
    "qr_capacity": "high",
    "lifecycle_stage": "in_production",
    "factory_origin": "Porto, PT",
    "batch_history_count": 24
  },
  "total_quantity": 24,
  "allocated_total": 1,
  "is_allocation_complete": false,
  "production_date": "2026-11-20",
  "batch_type": "new_batch",
  "selected_sizes": [
    "S",
    "M",
    "L"
  ],
  "selected_colors": [
    "White",
    "Black"
  ],
  "allocations": [
    {
      "size": "M",
      "color": "White",
      "quantity": 1,
      "batch_sku": "TT-100-WHT-M",
      "volume_l": 0.5
    }
  ]
}

Propose a box plan#

POST/brands/qr-wizard/orders/{order_id}/step-3/auto-plan

Requires scope qr:write

Propose a box plan covering every ordered unit: one variant per box, units per box from the factory carton's volume (default 120 when a variant has no volume). Nothing is saved — add destinations and PUT it to step-3.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • box_labelstringquery

Returns

HTTP 200
  • boxesarray of objects
    +Show 6 child attributes
    • idstringRequired
    • modestringRequired
      One ofsamemixed
    • capacityintegerRequired
    • regionstring | null
    • linesarray of objectsRequired

      Line items, one per variant.

      +Show 5 child attributes
      • colorstringRequired

        Colour name, exactly as on the product's variants.

      • sizestringRequired

        Size name, exactly as on the product's variants.

      • batch_skustring | null

        SKU printed on the label for this variant in this batch.

      • quantityintegerRequired

        Number of units.

      • volume_lstring | null

        Packaged volume of one unit, in litres. Used to size boxes.

    • created_atstring | null

      When the object was created (ISO 8601, UTC).

  • destinationsarray of objects
    +Show 8 child attributes
    • idstringRequired
    • namestringRequired
    • citystring | null
    • countrystringRequired
    • arrival_datestring | null
    • prioritystring
      One oflowstandardurgent

      Defaults to standard

    • box_idsarray of strings

      Ids of the boxes this call acts on.

    • instructionsstring

      Defaults to

POST /brands/qr-wizard/orders/{order_id}/step-3/auto-plan
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/step-3/auto-plan \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "boxes": [
    {
      "id": "SKN-CRT-00402-9A1C3E7F",
      "mode": "same",
      "capacity": 1,
      "region": "EU",
      "lines": [
        {
          "color": "White",
          "size": "M",
          "batch_sku": "TT-100-WHT-M",
          "quantity": 1,
          "volume_l": 0.5
        }
      ],
      "created_at": "2026-10-09T09:30:00Z"
    }
  ],
  "destinations": [
    "in_store"
  ]
}

Save the box plan#

PUT/brands/qr-wizard/orders/{order_id}/step-3

Requires scope qr:write

Save DPP section data for the batch.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Request body

  • boxesarray of objects
    +Show 6 child attributes
    • idstringRequired
    • modestringRequired
      One ofsamemixed
    • capacityintegerRequired
    • regionstring | null
    • linesarray of objectsRequired

      Line items, one per variant.

      +Show 5 child attributes
      • colorstringRequired

        Colour name, exactly as on the product's variants.

      • sizestringRequired

        Size name, exactly as on the product's variants.

      • batch_skustring | null

        SKU printed on the label for this variant in this batch.

      • quantityintegerRequired

        Number of units.

      • volume_lany | null

        Packaged volume of one unit, in litres. Used to size boxes.

    • created_atstring | null

      When the object was created (ISO 8601, UTC).

  • destinationsarray of objects
    +Show 8 child attributes
    • idstringRequired
    • namestringRequired
    • citystring | null
    • countrystringRequired
    • arrival_datestring | null
    • prioritystring
      One oflowstandardurgent

      Defaults to standard

    • box_idsarray of strings

      Ids of the boxes this call acts on.

    • instructionsstring

      Defaults to

  • completeboolean

    When true, validates full plan and marks step 3 complete

    Defaults to false

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • flow_typestringRequired

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable
  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofdraftstep_1_completestep_2_completestep_3_completefinalizedtransmittedprintinglabels_printedcancelled
  • wizard_stepintegerRequired
  • orderobjectRequired
    +Show 12 child attributes
    • order_idstringRequired

      Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

    • production_order_idstringRequired

      Human-readable order number shown in the portal (PO-YYYY-XXXX).

    • order_namestring | null
    • product_idstringRequired

      Skannit's id for the product.

    • product_namestringRequired
    • category_pathstring

      Defaults to

    • image_urlstring | null
    • total_quantityintegerRequired
    • order_datedate | null
    • expected_deliverydate | null

      Date the goods should leave the factory.

    • factory_namestring | null
    • factory_idstring | null

      The factory making the order. You get it from your factory partnerships in the portal.

  • logistics_planobjectRequired
    +Show 2 child attributes
    • boxesarray of objects
      +Show 6 child attributes
      • idstringRequired
      • modestringRequired
        One ofsamemixed
      • capacityintegerRequired
      • regionstring | null
      • linesarray of objectsRequired

        Line items, one per variant.

        +Show 5 child attributes
        • colorstringRequired

          Colour name, exactly as on the product's variants.

        • sizestringRequired

          Size name, exactly as on the product's variants.

        • batch_skustring | null

          SKU printed on the label for this variant in this batch.

        • quantityintegerRequired

          Number of units.

        • volume_lstring | null

          Packaged volume of one unit, in litres. Used to size boxes.

      • created_atstring | null

        When the object was created (ISO 8601, UTC).

    • destinationsarray of objects
      +Show 8 child attributes
      • idstringRequired
      • namestringRequired
      • citystring | null
      • countrystringRequired
      • arrival_datestring | null
      • prioritystring
        One oflowstandardurgent

        Defaults to standard

      • box_idsarray of strings

        Ids of the boxes this call acts on.

      • instructionsstring

        Defaults to

  • completionobjectRequired
    +Show 6 child attributes
    • units_requiredinteger

      Defaults to 0

    • units_packedinteger

      Defaults to 0

    • boxes_totalinteger

      Defaults to 0

    • boxes_assignedinteger

      Defaults to 0

    • destinations_totalinteger

      Defaults to 0

    • is_completeboolean

      Defaults to false

  • step_3_skippedboolean

    Defaults to false

PUT /brands/qr-wizard/orders/{order_id}/step-3
curl
curl -X PUT http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/step-3 \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "complete": true,
    "boxes": [
      {
        "id": "SKN-CRT-00402-9A1C3E7F",
        "mode": "same",
        "capacity": 48,
        "lines": [
          {
            "color": "White",
            "size": "M",
            "quantity": 48
          }
        ]
      }
    ],
    "destinations": [
      {
        "id": "dst_1",
        "name": "Rotterdam DC",
        "city": "Rotterdam",
        "country": "NL",
        "priority": "standard",
        "box_ids": [
          "SKN-CRT-00402-9A1C3E7F"
        ]
      }
    ]
  }'
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "flow_type": "standard",
  "status": "draft",
  "wizard_step": 1,
  "order": {
    "order_id": "ord_8c2f4e1a9b7d3c60",
    "production_order_id": "PO-2026-7F3A",
    "order_name": "Trail Tee — AW26 drop",
    "product_id": "f6abe715-90aa-5908-a0a6-12951a3a21cc",
    "product_name": "Trail Tee",
    "category_path": "Apparel / Tops",
    "image_url": "https://files.skannit.example/image.png",
    "total_quantity": 24,
    "order_date": "2026-10-09",
    "expected_delivery": "2026-11-20",
    "factory_name": "Porto Knit",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70"
  },
  "logistics_plan": {
    "boxes": [
      {
        "id": "SKN-CRT-00402-9A1C3E7F",
        "mode": "same",
        "capacity": 1,
        "region": "EU",
        "lines": [
          {
            "color": "White",
            "size": "M",
            "batch_sku": "TT-100-WHT-M",
            "quantity": 1,
            "volume_l": 0.5
          }
        ],
        "created_at": "2026-10-09T09:30:00Z"
      }
    ],
    "destinations": [
      "in_store"
    ]
  },
  "completion": {
    "units_required": 24,
    "units_packed": 24,
    "boxes_total": 24,
    "boxes_assigned": 24,
    "destinations_total": 1,
    "is_complete": true
  },
  "step_3_skipped": false
}

Skip the box plan#

POST/brands/qr-wizard/orders/{order_id}/step-3/skip

Requires scope qr:write

Explicitly skip box allocation (step 3). Advances wizard to step 3 so finalize is accessible.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200

A application/json file.

POST /brands/qr-wizard/orders/{order_id}/step-3/skip
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/step-3/skip \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
// 200 — body is application/json

Review before minting#

GET/brands/qr-wizard/orders/{order_id}/review

Requires scope qr:write

Final review summary before minting or transmittal.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • flow_typestringRequired

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable
  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofdraftstep_1_completestep_2_completestep_3_completefinalizedtransmittedprintinglabels_printedcancelled
  • wizard_stepintegerRequired
  • orderobjectRequired
    +Show 12 child attributes
    • order_idstringRequired

      Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

    • production_order_idstringRequired

      Human-readable order number shown in the portal (PO-YYYY-XXXX).

    • order_namestring | null
    • product_idstringRequired

      Skannit's id for the product.

    • product_namestringRequired
    • category_pathstring

      Defaults to

    • image_urlstring | null
    • total_quantityintegerRequired
    • order_datedate | null
    • expected_deliverydate | null

      Date the goods should leave the factory.

    • factory_namestring | null
    • factory_idstring | null

      The factory making the order. You get it from your factory partnerships in the portal.

  • qr_configobjectRequired
    +Show 3 child attributes
    • base_urlstringRequired
    • encryptionstringRequired
    • error_correctionstringRequired
  • label_specsobjectRequired
    +Show 3 child attributes
    • materialstring

      Defaults to Polypropylene (BOPP) - Matte Finish

    • dimensionsstring

      Defaults to 32mm x 32mm Square

    • adhesivestring

      Defaults to High-Tack Permanent Industrial

  • variant_summaryarray of objectsRequired
    +Show 2 child attributes
    • labelstringRequired
    • quantityintegerRequired

      Number of units.

  • total_units_mintedinteger

    Defaults to 0

  • print_batch_idstring | null
  • label_factory_namestring | null
  • ready_for_transmittalboolean

    Defaults to false

  • brand_logo_urlstring | null
  • previewobjectRequired
    +Show 11 child attributes
    • inventory_asset_idstringRequired
    • product_namestringRequired
    • sku_displaystring | null
    • colorstring | null

      Colour name, exactly as on the product's variants.

    • sizestring | null

      Size name, exactly as on the product's variants.

    • unit_tokenstring | null

      The item's own token. It is what the item's QR code carries, and the id every item event uses.

    • production_date_displaystring | null
    • location_displaystring | null
    • brand_logo_urlstring | null
    • sample_scan_urlstring | null
    • qr_svgstring | null
GET /brands/qr-wizard/orders/{order_id}/review
curl
curl http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/review \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "flow_type": "standard",
  "status": "draft",
  "wizard_step": 1,
  "order": {
    "order_id": "ord_8c2f4e1a9b7d3c60",
    "production_order_id": "PO-2026-7F3A",
    "order_name": "Trail Tee — AW26 drop",
    "product_id": "f6abe715-90aa-5908-a0a6-12951a3a21cc",
    "product_name": "Trail Tee",
    "category_path": "Apparel / Tops",
    "image_url": "https://files.skannit.example/image.png",
    "total_quantity": 24,
    "order_date": "2026-10-09",
    "expected_delivery": "2026-11-20",
    "factory_name": "Porto Knit",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70"
  },
  "qr_config": {
    "base_url": "https://files.skannit.example/base.png",
    "encryption": "none",
    "error_correction": "M"
  },
  "label_specs": {
    "material": "Polypropylene (BOPP) - Matte Finish",
    "dimensions": "32mm x 32mm Square",
    "adhesive": "High-Tack Permanent Industrial"
  },
  "variant_summary": [
    {
      "label": "Packed",
      "quantity": 1
    }
  ],
  "total_units_minted": 24,
  "print_batch_id": "PB-2026-1C7F2B",
  "label_factory_name": "Porto Labels",
  "ready_for_transmittal": true,
  "brand_logo_url": "https://files.skannit.example/brand_logo.png",
  "preview": {
    "inventory_asset_id": "d4528c6d-d6c7-5d61-a90b-2ce7a479f7bd",
    "product_name": "Trail Tee",
    "sku_display": "TT-100-WHT-M",
    "color": "White",
    "size": "M",
    "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
    "production_date_display": "20 Oct 2026",
    "location_display": "Rotterdam DC",
    "brand_logo_url": "https://files.skannit.example/brand_logo.png",
    "sample_scan_url": "https://files.skannit.example/sample_scan.png",
    "qr_svg": "<svg …/>"
  }
}

Finalize and mint#

POST/brands/qr-wizard/orders/{order_id}/finalize

Requires scope qr:write

Mint per-unit QR tokens. Use async_mint=true for parallel multi-order generation.

Honest async: 200 only once minting has completed; while it is still queued or running the answer is 202 Accepted with a status_url to poll.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • async_mintbooleanquery

    Queue mint for cron worker (poll mint-status). Default: sync when QR_MINT_SYNC_ON_FINALIZE=true

    Defaults to false

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofdraftstep_1_completestep_2_completestep_3_completefinalizedtransmittedprintinglabels_printedcancelled
  • mint_statusstring | null

    Progress of creating the item records: idle → queued → processing → completed (or failed).

  • mint_queuedboolean

    Defaults to false

  • status_urlstring | null

    Poll this until mint_status is "completed" — minting is asynchronous.

  • print_batch_idstring | null
  • total_units_mintedintegerRequired
  • qr_configobjectRequired
    +Show 3 child attributes
    • base_urlstringRequired
    • encryptionstringRequired
    • error_correctionstringRequired
  • label_specsobjectRequired
    +Show 3 child attributes
    • materialstring

      Defaults to Polypropylene (BOPP) - Matte Finish

    • dimensionsstring

      Defaults to 32mm x 32mm Square

    • adhesivestring

      Defaults to High-Tack Permanent Industrial

  • variant_summaryarray of objectsRequired
    +Show 2 child attributes
    • labelstringRequired
    • quantityintegerRequired

      Number of units.

  • sample_scan_urlstringRequired
  • sample_qr_svgstringRequired
  • local_exportobject | null
    +Show 6 child attributes
    • order_idstringRequired

      Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

    • qr_batch_idstringRequired

      The QR batch created for this order — one per production order.

    • export_dirstringRequired
    • units_exportedintegerRequired
    • svg_filesintegerRequired
    • png_filesintegerRequired
POST /brands/qr-wizard/orders/{order_id}/finalize
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/finalize \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "status": "draft",
  "mint_status": "queued",
  "mint_queued": true,
  "status_url": "https://files.skannit.example/status.png",
  "print_batch_id": "PB-2026-1C7F2B",
  "total_units_minted": 24,
  "qr_config": {
    "base_url": "https://files.skannit.example/base.png",
    "encryption": "none",
    "error_correction": "M"
  },
  "label_specs": {
    "material": "Polypropylene (BOPP) - Matte Finish",
    "dimensions": "32mm x 32mm Square",
    "adhesive": "High-Tack Permanent Industrial"
  },
  "variant_summary": [
    {
      "label": "Packed",
      "quantity": 1
    }
  ],
  "sample_scan_url": "https://files.skannit.example/sample_scan.png",
  "sample_qr_svg": "<svg …/>",
  "local_export": {
    "order_id": "ord_8c2f4e1a9b7d3c60",
    "qr_batch_id": "qb_3e9a1c7f2b40",
    "export_dir": "qr-exports/ord_8c2f4e1a9b7d3c60",
    "units_exported": 24,
    "svg_files": 1,
    "png_files": 1
  }
}

Get mint status#

GET/brands/qr-wizard/orders/{order_id}/mint-status

Requires scope qr:write

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • order_idstringRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • flow_typestring

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable

    Defaults to standard

  • batch_statusstringRequired
  • mint_statusstringRequired

    Progress of creating the item records: idle → queued → processing → completed (or failed).

    One ofidlequeuedprocessingcompletedfailed
  • mint_errorstring | null
  • total_quantityintegerRequired
  • units_mintedinteger

    Defaults to 0

  • ready_for_transmittalboolean

    Defaults to false

  • units_onchain_mintedinteger

    Defaults to 0

  • units_onchain_certifiedinteger

    Defaults to 0

  • units_cert_failedinteger

    Defaults to 0

  • chain_reg_statusstring | null
  • status_urlstring | null

    Set on actions that start on-chain work (mint-retry): where to poll.

GET /brands/qr-wizard/orders/{order_id}/mint-status
curl
curl http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/mint-status \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "flow_type": "standard",
  "batch_status": "minted",
  "mint_status": "idle",
  "mint_error": null,
  "total_quantity": 24,
  "units_minted": 24,
  "ready_for_transmittal": true,
  "units_onchain_minted": 24,
  "units_onchain_certified": 24,
  "units_cert_failed": 24,
  "chain_reg_status": "confirmed",
  "status_url": "https://files.skannit.example/status.png"
}

Retry failed mints#

POST/brands/qr-wizard/orders/{order_id}/mint-retry

Requires scope qr:write

Re-queue a failed mint. Honest async, like finalize: 202 + status_url until the batch is fully on-chain.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • order_idstringRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • flow_typestring

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable

    Defaults to standard

  • batch_statusstringRequired
  • mint_statusstringRequired

    Progress of creating the item records: idle → queued → processing → completed (or failed).

    One ofidlequeuedprocessingcompletedfailed
  • mint_errorstring | null
  • total_quantityintegerRequired
  • units_mintedinteger

    Defaults to 0

  • ready_for_transmittalboolean

    Defaults to false

  • units_onchain_mintedinteger

    Defaults to 0

  • units_onchain_certifiedinteger

    Defaults to 0

  • units_cert_failedinteger

    Defaults to 0

  • chain_reg_statusstring | null
  • status_urlstring | null

    Set on actions that start on-chain work (mint-retry): where to poll.

POST /brands/qr-wizard/orders/{order_id}/mint-retry
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/mint-retry \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "flow_type": "standard",
  "batch_status": "minted",
  "mint_status": "idle",
  "mint_error": null,
  "total_quantity": 24,
  "units_minted": 24,
  "ready_for_transmittal": true,
  "units_onchain_minted": 24,
  "units_onchain_certified": 24,
  "units_cert_failed": 24,
  "chain_reg_status": "confirmed",
  "status_url": "https://files.skannit.example/status.png"
}

List items and QR tokens#

GET/brands/qr-wizard/orders/{order_id}/units

Requires scope qr:write

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • pending_onlybooleanquery

    Defaults to false

  • pageintegerquery

    Defaults to 1

  • limitintegerquery

    Defaults to 50

Returns

HTTP 200
  • order_idstringRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • flow_typestringRequired

    standard = the factory knows each item's variant when printing; variable = variants are assigned at QC.

    One ofstandardvariable
  • itemsarray of objectsRequired

    The objects on this page.

    +Show 8 child attributes
    • unit_tokenstringRequired

      The item's own token. It is what the item's QR code carries, and the id every item event uses.

    • sequence_numberintegerRequired
    • sizestring | null

      Size name, exactly as on the product's variants.

    • colorstring | null

      Colour name, exactly as on the product's variants.

    • batch_skustring | null

      SKU printed on the label for this variant in this batch.

    • statusstringRequired

      Current state of the object. See the allowed values.

      One ofpendingmintedvariant_assignedtransmitted
    • scan_urlstringRequired

      URL encoded in the item's QR code. Opening it shows the passport.

    • variant_assigned_attimestamp | null
  • totalintegerRequired

    Total count.

  • pending_variant_countinteger

    Defaults to 0

GET /brands/qr-wizard/orders/{order_id}/units
curl
curl http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/units \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "flow_type": "standard",
  "items": [
    {
      "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
      "sequence_number": 1,
      "size": "M",
      "color": "White",
      "batch_sku": "TT-100-WHT-M",
      "status": "pending",
      "scan_url": "https://files.skannit.example/scan.png",
      "variant_assigned_at": null
    }
  ],
  "total": 1,
  "pending_variant_count": 24
}

Send the print job to the factory#

POST/brands/qr-wizard/orders/{order_id}/transmit

Requires scope qr:write

Send finalized batch package to the label factory.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Request body

  • label_factory_namestring | null

    Optional when label factory was saved in step 2

Returns

HTTP 200
  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofdraftstep_1_completestep_2_completestep_3_completefinalizedtransmittedprintinglabels_printedcancelled
  • label_factory_namestringRequired
  • transmitted_atstringRequired
  • total_unitsintegerRequired
  • messagestringRequired
POST /brands/qr-wizard/orders/{order_id}/transmit
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/transmit \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "label_factory_name": "Porto Labels"
  }'
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "status": "draft",
  "label_factory_name": "Porto Labels",
  "transmitted_at": "2026-10-09T09:30:00Z",
  "total_units": 24,
  "message": "Print job sent to Porto Labels"
}

Prepare print files#

POST/brands/qr-wizard/orders/{order_id}/export-qr

Requires scope qr:write

Write all minted unit QR codes to QR_LOCAL_EXPORT_DIR (SVG + optional PNG).

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200
  • order_idstringRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • qr_batch_idstringRequired

    The QR batch created for this order — one per production order.

  • export_dirstringRequired
  • units_exportedintegerRequired
  • svg_filesintegerRequired
  • png_filesintegerRequired
POST /brands/qr-wizard/orders/{order_id}/export-qr
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/export-qr \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "export_dir": "qr-exports/ord_8c2f4e1a9b7d3c60",
  "units_exported": 24,
  "svg_files": 1,
  "png_files": 1
}

Download print files#

GET/brands/qr-wizard/orders/{order_id}/export-qr.zip

Requires scope qr:write

Download prepared QR export files as a ZIP archive.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

Returns

HTTP 200

A application/json file.

GET /brands/qr-wizard/orders/{order_id}/export-qr.zip
curl
curl http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/export-qr.zip \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
// 200 — body is application/json

Get one item's QR code#

GET/brands/qr-wizard/orders/{order_id}/qr.svg

Requires scope qr:write

Return QR code as SVG (Level H) for a minted unit.

Parameters

  • order_idstringpathRequired

    Skannit's id for the production order. Use it in every /production-orders/{order_id} and QR call.

  • unit_tokenstringquery

    Specific unit token; defaults to first unit

Returns

HTTP 200

A application/json file.

GET /brands/qr-wizard/orders/{order_id}/qr.svg
curl
curl http://62.169.23.239:8001/api/v1/brands/qr-wizard/orders/ord_8c2f4e1a9b7d3c60/qr.svg \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
// 200 — body is application/json
NextCustody & shipping→