QR codes & labels

Called with factory 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 token24 endpoints

Endpoints

Cancel a reprint request (requester only)#

DELETE/factory/qr/orders/{order_id}/labels/reprints/{request_id}

Requires scope factory_qr:write

Cancel a pending reprint request. Only the original requester may cancel.

Parameters

  • order_idstringpathRequired

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

  • request_idstringpathRequired

Returns

HTTP 200
  • request_idstringRequired
  • 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.

  • unit_tokenstring | null

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

  • requested_bystringRequired
  • requested_by_namestringRequired
  • reasonstringRequired
  • statusstringRequired

    Current state of the object. See the allowed values.

  • review_notesstring | null
  • reviewed_bystring | null
  • reviewed_attimestamp | null
  • created_attimestampRequired

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

DELETE /factory/qr/orders/{order_id}/labels/reprints/{request_id}
curl
curl -X DELETE http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/reprints/e9804536-aea1-5a8e-9436-cee0369250fc \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "request_id": "e9804536-aea1-5a8e-9436-cee0369250fc",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "requested_by": "requested by",
  "requested_by_name": "Requested by",
  "reason": "Customer changed their mind",
  "status": "active",
  "review_notes": "review notes",
  "reviewed_by": "reviewed by",
  "reviewed_at": null,
  "created_at": "2026-10-09T09:30:00Z"
}

List Qr Batches#

GET/factory/qr/batches

Requires scope factory_qr:read

QR batches for this factory (finalized/transmitted, mint complete).

Parameters

  • flow_typestringquery

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

    One ofstandardvariable
  • assignment_pending_onlybooleanquery

    Only variable-flow batches with unassigned units

    Defaults to false

  • limitintegerquery

    Defaults to 50

Returns

HTTP 200
  • itemsarray of objectsRequired

    The objects on this page.

    +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).

    • 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
    • batch_statusstringRequired
    • brand_namestringRequired
    • product_namestringRequired
    • total_unitsintegerRequired
    • variant_assigned_countintegerRequired
    • variant_pending_countintegerRequired
    • transmitted_attimestamp | null
    • label_factoryobject | null
      +Show 11 child attributes
      • factory_idstring | null

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

      • namestringRequired
      • addressstring | null
      • locationstring | null

        Free-text place in your warehouse, for example "Aisle 4, Bay B".

      • verifiedboolean

        Defaults to false

      • certificationsarray of strings
      • capacity_tagstring | null
      • lead_time_hours_mininteger | null
      • lead_time_hours_maxinteger | null
      • pickup_availableboolean

        Defaults to false

      • performance_scorenumber | null
  • totalintegerRequired

    Total count.

GET /factory/qr/batches
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/batches \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "items": [
    {
      "order_id": "ord_8c2f4e1a9b7d3c60",
      "production_order_id": "PO-2026-7F3A",
      "qr_batch_id": "qb_3e9a1c7f2b40",
      "flow_type": "standard",
      "batch_status": "minted",
      "brand_name": "Northwind Apparel",
      "product_name": "Trail Tee",
      "total_units": 24,
      "variant_assigned_count": 24,
      "variant_pending_count": 24,
      "transmitted_at": null,
      "label_factory": {
        "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
        "name": "Northwind Apparel",
        "address": "address",
        "location": "Aisle 4, Bay B",
        "verified": true,
        "certifications": [
          "certification"
        ],
        "capacity_tag": "capacity tag",
        "lead_time_hours_min": 1,
        "lead_time_hours_max": 1,
        "pickup_available": false,
        "performance_score": 1
      }
    }
  ],
  "total": 1
}

List Completed Production Orders#

GET/factory/qr/completed-orders

Requires scope factory_qr:read

Completed production orders ready for QC (variable) or post-label handoff (standard).

Parameters

  • brand_namestringquery

    Filter by brand name

  • date_fromdatequery

    Queued on or after

  • date_todatequery

    Queued on or before

  • flow_typeanyquery

    Filter by flow: variable (default), standard, or all

    Defaults to variable

  • pageintegerquery

    Defaults to 1

  • limitintegerquery

    Defaults to 5

Returns

HTTP 200
  • itemsarray of objectsRequired

    The objects on this page.

    +Show 12 child attributes
    • order_idstringRequired

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

    • order_display_idstringRequired

      Order number formatted for display (#PO-YYYY-XXXX).

    • brand_namestringRequired
    • product_namestringRequired
    • quantityintegerRequired

      Number of units.

    • assignedinteger

      Defaults to 0

    • statusstringRequired

      Current state of the object. See the allowed values.

    • status_labelstringRequired
    • queued_ago_labelstring | null
    • flow_typestringRequired

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

      One ofstandardvariable
    • can_start_assigningboolean

      Defaults to false

    • assignment_percentinteger

      Defaults to 0

  • paginationobjectRequired

    Page position: current_page, limit, total_pages, total_results.

    +Show 6 child attributes
    • total_resultsintegerRequired
    • total_pagesintegerRequired
    • current_pageintegerRequired
    • limitintegerRequired
    • showing_fromintegerRequired
    • showing_tointegerRequired
GET /factory/qr/completed-orders
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/completed-orders \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "items": [
    {
      "order_id": "ord_8c2f4e1a9b7d3c60",
      "order_display_id": "#PO-2026-7F3A",
      "brand_name": "Northwind Apparel",
      "product_name": "Trail Tee",
      "quantity": 1,
      "assigned": 1,
      "status": "active",
      "status_label": "Available",
      "queued_ago_label": "Queued ago",
      "flow_type": "standard",
      "can_start_assigning": false,
      "assignment_percent": 72
    }
  ],
  "pagination": {
    "total_results": 24,
    "total_pages": 24,
    "current_page": 1,
    "limit": 1,
    "showing_from": 1,
    "showing_to": 1
  }
}

List Label Printing Batches#

GET/factory/qr/label-printing-batches

Requires scope factory_qr:read

QR batches assigned to this label printing factory (transmitted/printing/labels_printed).

Parameters

  • limitintegerquery

    Defaults to 50

Returns

HTTP 200
  • itemsarray of objectsRequired

    The objects on this page.

    +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).

    • 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
    • batch_statusstringRequired
    • brand_namestringRequired
    • product_namestringRequired
    • total_unitsintegerRequired
    • variant_assigned_countintegerRequired
    • variant_pending_countintegerRequired
    • transmitted_attimestamp | null
    • label_factoryobject | null
      +Show 11 child attributes
      • factory_idstring | null

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

      • namestringRequired
      • addressstring | null
      • locationstring | null

        Free-text place in your warehouse, for example "Aisle 4, Bay B".

      • verifiedboolean

        Defaults to false

      • certificationsarray of strings
      • capacity_tagstring | null
      • lead_time_hours_mininteger | null
      • lead_time_hours_maxinteger | null
      • pickup_availableboolean

        Defaults to false

      • performance_scorenumber | null
  • totalintegerRequired

    Total count.

GET /factory/qr/label-printing-batches
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/label-printing-batches \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "items": [
    {
      "order_id": "ord_8c2f4e1a9b7d3c60",
      "production_order_id": "PO-2026-7F3A",
      "qr_batch_id": "qb_3e9a1c7f2b40",
      "flow_type": "standard",
      "batch_status": "minted",
      "brand_name": "Northwind Apparel",
      "product_name": "Trail Tee",
      "total_units": 24,
      "variant_assigned_count": 24,
      "variant_pending_count": 24,
      "transmitted_at": null,
      "label_factory": {
        "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
        "name": "Northwind Apparel",
        "address": "address",
        "location": "Aisle 4, Bay B",
        "verified": true,
        "certifications": [
          "certification"
        ],
        "capacity_tag": "capacity tag",
        "lead_time_hours_min": 1,
        "lead_time_hours_max": 1,
        "pickup_available": false,
        "performance_score": 1
      }
    }
  ],
  "total": 1
}

Get Qr Batch Detail#

GET/factory/qr/orders/{order_id}

Requires scope factory_qr:read

Batch summary + variant assignment progress (flow 2).

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_typestringRequired

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

    One ofstandardvariable
  • batch_statusstringRequired
  • 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.

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

      Number of units.

  • total_unitsintegerRequired
  • variant_assigned_countintegerRequired
  • variant_pending_countintegerRequired
  • assignment_percentintegerRequired
  • label_factoryobject | null
    +Show 11 child attributes
    • factory_idstring | null

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

    • namestringRequired
    • addressstring | null
    • locationstring | null

      Free-text place in your warehouse, for example "Aisle 4, Bay B".

    • verifiedboolean

      Defaults to false

    • certificationsarray of strings
    • capacity_tagstring | null
    • lead_time_hours_mininteger | null
    • lead_time_hours_maxinteger | null
    • pickup_availableboolean

      Defaults to false

    • performance_scorenumber | null
GET /factory/qr/orders/{order_id}
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60 \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "flow_type": "standard",
  "batch_status": "minted",
  "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"
  },
  "variant_summary": [
    {
      "label": "Packed",
      "quantity": 1
    }
  ],
  "total_units": 24,
  "variant_assigned_count": 24,
  "variant_pending_count": 24,
  "assignment_percent": 72,
  "label_factory": {
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
    "name": "Northwind Apparel",
    "address": "address",
    "location": "Aisle 4, Bay B",
    "verified": true,
    "certifications": [
      "certification"
    ],
    "capacity_tag": "capacity tag",
    "lead_time_hours_min": 1,
    "lead_time_hours_max": 1,
    "pickup_available": false,
    "performance_score": 1
  }
}

Get Assignment Feed#

GET/factory/qr/orders/{order_id}/assignment-feed

Requires scope factory_qr:read

Live feed of recent variant assignments for the QC screen.

Parameters

  • order_idstringpathRequired

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

  • limitintegerquery

    Defaults to 20

Returns

HTTP 200
  • order_idstringRequired

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

  • itemsarray of objectsRequired

    The objects on this page.

    +Show 9 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.

    • qr_display_idstringRequired
    • sizestringRequired

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

    • colorstringRequired

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

    • assignment_labelstringRequired
    • unit_hex_idstringRequired
    • assigned_attimestampRequired
    • ago_labelstringRequired
    • transaction_idstringRequired
  • totalinteger

    Total count.

    Defaults to 0

GET /factory/qr/orders/{order_id}/assignment-feed
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/assignment-feed \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "items": [
    {
      "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
      "qr_display_id": "5baa6167-9f50-5823-b9ea-a4031e858bc7",
      "size": "M",
      "color": "White",
      "assignment_label": "Assignment",
      "unit_hex_id": "be8a6316-5d86-53b4-9af4-dae2be1285b7",
      "assigned_at": "2026-10-09T09:30:00Z",
      "ago_label": "Ago",
      "transaction_id": "37239195-d001-509b-9181-4a3b8cc01166"
    }
  ],
  "total": 1
}

Get Assignment Workspace#

GET/factory/qr/orders/{order_id}/assignment-workspace

Requires scope factory_qr:read

QC page: summary cards, variant filters, active session, per-variant progress.

Parameters

  • order_idstringpathRequired

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

  • colorstringquery

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

  • sizestringquery

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

Returns

HTTP 200
  • order_idstringRequired

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

  • order_display_idstringRequired

    Order number formatted for display (#PO-YYYY-XXXX).

  • flow_typestringRequired

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

    One ofstandardvariable
  • batch_statusstringRequired
  • is_activeboolean

    Defaults to false

  • product_namestringRequired
  • brand_namestringRequired
  • summaryobjectRequired
    +Show 8 child attributes
    • total_unitsinteger

      Defaults to 0

    • total_assignedinteger

      Defaults to 0

    • total_unassignedinteger

      Defaults to 0

    • total_variantsinteger

      Defaults to 0

    • progress_assignedinteger

      Defaults to 0

    • progress_totalinteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • filter_optionsobjectRequired
    +Show 2 child attributes
    • colorsarray of strings
    • sizesarray of strings
  • variantsarray of objectsRequired
    +Show 9 child attributes
    • colorstringRequired

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

    • sizestringRequired

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestringRequired
    • assigned_countinteger

      Defaults to 0

    • target_quantityinteger

      Defaults to 0

    • remaining_quotainteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • active_sessionobjectRequired
    +Show 6 child attributes
    • colorstring | null

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

    • sizestring | null

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestring | null
    • remaining_quotainteger

      Defaults to 0

    • status_labelstring

      Defaults to Ready for scanning and mapping

  • total_assigned_footerstring

    Defaults to

GET /factory/qr/orders/{order_id}/assignment-workspace
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/assignment-workspace \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "order_display_id": "#PO-2026-7F3A",
  "flow_type": "standard",
  "batch_status": "minted",
  "is_active": false,
  "product_name": "Trail Tee",
  "brand_name": "Northwind Apparel",
  "summary": {
    "total_units": 24,
    "total_assigned": 24,
    "total_unassigned": 24,
    "total_variants": 24,
    "progress_assigned": 1,
    "progress_total": 1,
    "progress_percent": 72,
    "progress_label": ""
  },
  "filter_options": {
    "colors": [
      "White",
      "Black"
    ],
    "sizes": [
      "S",
      "M",
      "L"
    ]
  },
  "variants": [
    "White / M"
  ],
  "active_session": {
    "color": "White",
    "size": "M",
    "sku": "TT-100-WHT-M",
    "product_name": "Trail Tee",
    "remaining_quota": 1,
    "status_label": "Ready for scanning and mapping"
  },
  "total_assigned_footer": ""
}

Check whether all units' on-chain custody has reached this factory#

GET/factory/qr/orders/{order_id}/labels/custody-readiness

Requires scope factory_qr:read

Whether every unit's OwnershipCertificate custody transfer has actually CONFIRMED on-chain to this factory's wallet yet. start_label_print_session below refuses to open a print session (409 custody_transfer_incomplete) until ready here is true — poll this to know when the button should become usable instead of finding out by a failed attempt.

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.

  • total_unitsintegerRequired
  • transferred_unitsintegerRequired
  • stalled_unitsinteger

    Units whose custody transfer exhausted all relayer retry attempts and gave up (e.g. an underfunded gas vault) without ever confirming on-chain. Counted toward 'ready' so printing isn't blocked indefinitely, but NOT included in transferred_units — the transfer never actually landed on-chain for these units.

    Defaults to 0

  • readybooleanRequired

    True once every unit's OwnershipCertificate custody has either confirmed to this factory's wallet or permanently stalled — start_print_session refuses to open a print session until this is True. See stalled_units for the count that never actually confirmed.

GET /factory/qr/orders/{order_id}/labels/custody-readiness
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/custody-readiness \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "total_units": 24,
  "transferred_units": 24,
  "stalled_units": 24,
  "ready": true
}

Paginated per-label preview with individual QR SVGs#

GET/factory/qr/orders/{order_id}/labels/label-previews

Requires scope factory_qr:read

Returns a paginated list of label cards — one per QR unit — each with its own QR SVG rendered server-side from the unit's scan URL. Used for the Print Run Preview grid and, with session_only, the print sheet.

Parameters

  • order_idstringpathRequired

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

  • pageintegerquery

    Defaults to 1

  • limitintegerquery

    Defaults to 15

  • session_onlybooleanquery

    Only the open print session's labels

    Defaults to false

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.

  • batch_statusstringRequired
  • base_serialstringRequired
  • itemsarray of objectsRequired

    The objects on this page.

    +Show 10 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
    • serialstringRequired
    • colorstring | null

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

    • sizestring | null

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

    • batch_skustring | null

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

    • qr_svgstring | null
    • scan_urlstringRequired

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

    • label_idstringRequired
    • print_statusstring

      Defaults to ready

  • totalintegerRequired

    Total count.

  • pageintegerRequired
  • limitintegerRequired
  • total_pagesintegerRequired
GET /factory/qr/orders/{order_id}/labels/label-previews
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/label-previews \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "batch_status": "minted",
  "base_serial": "base serial",
  "items": [
    {
      "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
      "sequence_number": 1,
      "serial": "serial",
      "color": "White",
      "size": "M",
      "batch_sku": "TT-100-WHT-M",
      "qr_svg": "<svg …/>",
      "scan_url": "https://files.skannit.example/scan.png",
      "label_id": "eb59f099-a43a-52e3-883d-01cd9b494f22",
      "print_status": "ready"
    }
  ],
  "total": 1,
  "page": 1,
  "limit": 1,
  "total_pages": 24
}

Composed label preview for factory printing#

GET/factory/qr/orders/{order_id}/labels/print-preview

Requires scope factory_qr:read

Label layout + product fields after brand transmit (uses wizard label config).

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.

  • batch_statusstringRequired
  • flow_typestringRequired

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

    One ofstandardvariable
  • total_unitsintegerRequired
  • label_template_idstringRequired
  • label_layoutstringRequired
  • qr_placementstringRequired
  • data_fieldsobjectRequired
    +Show 4 child attributes
    • product_nameboolean

      Defaults to true

    • sku_numberboolean

      Defaults to true

    • sizeboolean

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

      Defaults to false

    • colorboolean

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

      Defaults to false

  • brand_logo_urlstring | null
  • custom_label_templatesarray of objects
    +Show 9 child attributes
    • template_idstringRequired
    • label_namestringRequired
    • placementstringRequired
    • label_sizestringRequired
    • data_fieldsobjectRequired
      +Show 4 child attributes
      • product_nameboolean

        Defaults to true

      • sku_numberboolean

        Defaults to true

      • sizeboolean

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

        Defaults to false

      • colorboolean

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

        Defaults to false

    • instructionsstring

      Defaults to

    • urlstring | null
    • sort_orderinteger

      Defaults to 0

    • copiesinteger

      How many of this label each unit carries (0 = slot not used). Every carrier holds the unit's QR; their sum is the unit's replica_count.

      Defaults to 1

  • 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
  • sample_scan_urlstring | null
  • labels_printed_attimestamp | null
  • print_sessionobject | null
    +Show 19 child attributes
    • session_idstringRequired
    • factory_idstringRequired

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

    • started_attimestampRequired
    • confirmed_attimestamp | null
    • unit_countintegerRequired
    • printer_namestring | null

      Optional print config (stored in session JSONB when provided)

    • media_typestring | null
    • print_quality_dpiinteger | null
    • copiesinteger | null
    • print_modestring | null
    • range_frominteger | null

      What this session claimed (FC-03 range / FC-04 variant). None = no filter.

    • range_tointeger | null
    • variant_colorstring | null
    • variant_sizestring | null
    • first_sequenceinteger | null
    • last_sequenceinteger | null
    • printed_countinteger | null
    • failed_countinteger | null
    • cancelled_attimestamp | null
  • hardwareobject

    Live hardware status for the Configuration Terminal bottom cards.

    +Show 5 child attributes
    • hardware_statusstring
      One ofreadybusyofflineerror

      Defaults to ready

    • hardware_modelstring

      Defaults to ZT411

    • ribbon_capacity_pctinteger

      Defaults to 100

    • system_alerts_countinteger

      Defaults to 0

    • printer_namestring | null
  • operational_summaryobject

    Operational Summary panel shown on the right side of Configuration Terminal.

    +Show 7 child attributes
    • variant_detailstring | null
    • estimated_volume_unitsinteger

      Defaults to 0

    • avg_print_speed_labels_per_secnumber

      Defaults to 4.2

    • ink_consumption_pctnumber

      Defaults to 0

    • ink_capacity_mlinteger

      Defaults to 3000

    • est_time_to_completion_minutesnumber

      Defaults to 0

    • spec_versionstring

      Defaults to v2.4 SPEC

  • print_mode_optionsarray of objects
    +Show 3 child attributes
    • modestringRequired
      One ofallrangeby_variant
    • labelstringRequired
    • descriptionstringRequired
  • serial_prefixstring

    Serial structure (FC-02): brand prefix is locked, factory appends /NNN.

    Defaults to

  • serial_examplestring

    Defaults to

  • printed_unitsinteger

    Session progress (FC-03 / FC-07)

    Defaults to 0

  • claimed_unitsinteger

    Defaults to 0

  • remaining_unitsinteger

    Defaults to 0

  • next_sequenceinteger | null
  • max_sequenceinteger

    Defaults to 0

  • variant_progressarray of objects
    +Show 7 child attributes
    • colorstring | null

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

    • sizestring | null

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

    • totalinteger

      Total count.

      Defaults to 0

    • printedinteger

      Defaults to 0

    • claimedinteger

      Defaults to 0

    • first_sequenceinteger | null
    • last_sequenceinteger | null
  • session_historyarray of objects
    +Show 19 child attributes
    • session_idstringRequired
    • factory_idstringRequired

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

    • started_attimestampRequired
    • confirmed_attimestamp | null
    • unit_countintegerRequired
    • printer_namestring | null

      Optional print config (stored in session JSONB when provided)

    • media_typestring | null
    • print_quality_dpiinteger | null
    • copiesinteger | null
    • print_modestring | null
    • range_frominteger | null

      What this session claimed (FC-03 range / FC-04 variant). None = no filter.

    • range_tointeger | null
    • variant_colorstring | null
    • variant_sizestring | null
    • first_sequenceinteger | null
    • last_sequenceinteger | null
    • printed_countinteger | null
    • failed_countinteger | null
    • cancelled_attimestamp | null
  • label_optionsobject

    Factory-side label preview choices (FC-06).

    +Show 7 child attributes
    • show_logoboolean

      Defaults to true

    • show_product_nameboolean

      Defaults to true

    • show_serialboolean

      Defaults to true

    • show_variantboolean

      Defaults to true

    • orientationstring
      One oflandscapeportrait

      Defaults to landscape

    • label_sizestring
      One of50x3075x50100x75100x150

      Defaults to 75x50

    • qr_size_mminteger

      Defaults to 22

  • reprint_pin_setboolean

    Defaults to false

  • available_printersarray of strings
GET /factory/qr/orders/{order_id}/labels/print-preview
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/print-preview \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "batch_status": "minted",
  "flow_type": "standard",
  "total_units": 24,
  "label_template_id": "129932db-d986-5996-b14f-156f02dc8f0e",
  "label_layout": "label layout",
  "qr_placement": "qr placement",
  "data_fields": {
    "product_name": "Trail Tee",
    "sku_number": true,
    "size": "M",
    "color": "White"
  },
  "brand_logo_url": "https://files.skannit.example/brand_logo.png",
  "custom_label_templates": [
    {
      "template_id": "06717e94-4fb6-5f84-8378-441a9f248abd",
      "label_name": "Label",
      "placement": "placement",
      "label_size": "label size",
      "data_fields": {
        "product_name": "Trail Tee",
        "sku_number": true,
        "size": "M",
        "color": "White"
      },
      "instructions": "",
      "url": "url",
      "sort_order": 1,
      "copies": 1
    }
  ],
  "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 …/>"
  },
  "sample_scan_url": "https://files.skannit.example/sample_scan.png",
  "labels_printed_at": null,
  "print_session": {
    "session_id": "5e8cd9bb-f7b6-538a-8879-2d5730e5b7a8",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
    "started_at": "2026-10-09T09:30:00Z",
    "confirmed_at": null,
    "unit_count": 24,
    "printer_name": "Printer",
    "media_type": "media type",
    "print_quality_dpi": 1,
    "copies": 1,
    "print_mode": "print mode",
    "range_from": 1,
    "range_to": 1,
    "variant_color": "variant color",
    "variant_size": "variant size",
    "first_sequence": 1,
    "last_sequence": 1,
    "printed_count": 24,
    "failed_count": 24,
    "cancelled_at": null
  },
  "hardware": {
    "hardware_status": "ready",
    "hardware_model": "ZT411",
    "ribbon_capacity_pct": 100,
    "system_alerts_count": 24,
    "printer_name": "Printer"
  },
  "operational_summary": {
    "variant_detail": "variant detail",
    "estimated_volume_units": 24,
    "avg_print_speed_labels_per_sec": 4.2,
    "ink_consumption_pct": 72.5,
    "ink_capacity_ml": 3000,
    "est_time_to_completion_minutes": 1,
    "spec_version": "v2.4 SPEC"
  },
  "print_mode_options": [
    {
      "mode": "all",
      "label": "Packed",
      "description": "Organic cotton tee"
    }
  ],
  "serial_prefix": "",
  "serial_example": "",
  "printed_units": 24,
  "claimed_units": 24,
  "remaining_units": 24,
  "next_sequence": 1,
  "max_sequence": 1,
  "variant_progress": [
    {
      "color": "White",
      "size": "M",
      "total": 1,
      "printed": 1,
      "claimed": 1,
      "first_sequence": 1,
      "last_sequence": 1
    }
  ],
  "session_history": [
    {
      "session_id": "5e8cd9bb-f7b6-538a-8879-2d5730e5b7a8",
      "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
      "started_at": "2026-10-09T09:30:00Z",
      "confirmed_at": null,
      "unit_count": 24,
      "printer_name": "Printer",
      "media_type": "media type",
      "print_quality_dpi": 1,
      "copies": 1,
      "print_mode": "print mode",
      "range_from": 1,
      "range_to": 1,
      "variant_color": "variant color",
      "variant_size": "variant size",
      "first_sequence": 1,
      "last_sequence": 1,
      "printed_count": 24,
      "failed_count": 24,
      "cancelled_at": null
    }
  ],
  "label_options": {
    "show_logo": true,
    "show_product_name": true,
    "show_serial": true,
    "show_variant": true,
    "orientation": "landscape",
    "label_size": "50x30",
    "qr_size_mm": 22
  },
  "reprint_pin_set": false,
  "available_printers": [
    "available printer"
  ]
}

List reprint requests for a batch#

GET/factory/qr/orders/{order_id}/labels/reprints

Requires scope factory_qr:read

List all reprint requests for the batch, ordered newest first.

Parameters

  • order_idstringpathRequired

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

  • statusstringquery

    Filter by status

  • pageintegerquery

    Defaults to 1

  • limitintegerquery

    Defaults to 20

Returns

HTTP 200
  • order_idstringRequired

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

  • itemsarray of objectsRequired

    The objects on this page.

    +Show 12 child attributes
    • request_idstringRequired
    • 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.

    • unit_tokenstring | null

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

    • requested_bystringRequired
    • requested_by_namestringRequired
    • reasonstringRequired
    • statusstringRequired

      Current state of the object. See the allowed values.

    • review_notesstring | null
    • reviewed_bystring | null
    • reviewed_attimestamp | null
    • created_attimestampRequired

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

  • totalintegerRequired

    Total count.

GET /factory/qr/orders/{order_id}/labels/reprints
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/reprints \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "items": [
    {
      "request_id": "e9804536-aea1-5a8e-9436-cee0369250fc",
      "order_id": "ord_8c2f4e1a9b7d3c60",
      "qr_batch_id": "qb_3e9a1c7f2b40",
      "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
      "requested_by": "requested by",
      "requested_by_name": "Requested by",
      "reason": "Customer changed their mind",
      "status": "active",
      "review_notes": "review notes",
      "reviewed_by": "reviewed by",
      "reviewed_at": null,
      "created_at": "2026-10-09T09:30:00Z"
    }
  ],
  "total": 1
}

Download Qr Svg#

GET/factory/qr/orders/{order_id}/qr.svg

Requires scope factory_qr:read

Parameters

  • order_idstringpathRequired

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

  • unit_tokenstringquery

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

Returns

HTTP 200

A application/json file.

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

List Qr Units#

GET/factory/qr/orders/{order_id}/units

Requires scope factory_qr:read

Parameters

  • order_idstringpathRequired

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

  • pending_onlybooleanquery

    Unassigned units only (variable flow)

    Defaults to false

  • exclude_packedbooleanquery

    Exclude units already in sealed boxes or active packing session

    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 /factory/qr/orders/{order_id}/units
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/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
}

Lookup Qr Unit#

GET/factory/qr/units/lookup

Requires scope factory_qr:read

Packing/QC scan — resolve token and allowed variants from the order matrix.

Parameters

  • unit_tokenstringqueryRequired

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

Returns

HTTP 200
  • unit_tokenstringRequired

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

  • 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_typestringRequired

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

    One ofstandardvariable
  • 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_lockedbooleanRequired
  • allowed_sizesarray of strings
  • allowed_colorsarray of strings
GET /factory/qr/units/lookup
curl
curl http://62.169.23.239:8001/api/v1/factory/qr/units/lookup?unit_token=Qm7xK2pL9vR4tY8wZ1nB3c \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "flow_type": "standard",
  "sequence_number": 1,
  "size": "M",
  "color": "White",
  "batch_sku": "TT-100-WHT-M",
  "status": "pending",
  "scan_url": "https://files.skannit.example/scan.png",
  "variant_locked": false,
  "allowed_sizes": [
    "allowed size"
  ],
  "allowed_colors": [
    "allowed color"
  ]
}

Complete Assignment Session#

POST/factory/qr/orders/{order_id}/assignment-session/complete

Requires scope factory_qr:write

Clear active variant session (Complete Session).

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.

  • order_display_idstringRequired

    Order number formatted for display (#PO-YYYY-XXXX).

  • flow_typestringRequired

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

    One ofstandardvariable
  • batch_statusstringRequired
  • is_activeboolean

    Defaults to false

  • product_namestringRequired
  • brand_namestringRequired
  • summaryobjectRequired
    +Show 8 child attributes
    • total_unitsinteger

      Defaults to 0

    • total_assignedinteger

      Defaults to 0

    • total_unassignedinteger

      Defaults to 0

    • total_variantsinteger

      Defaults to 0

    • progress_assignedinteger

      Defaults to 0

    • progress_totalinteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • filter_optionsobjectRequired
    +Show 2 child attributes
    • colorsarray of strings
    • sizesarray of strings
  • variantsarray of objectsRequired
    +Show 9 child attributes
    • colorstringRequired

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

    • sizestringRequired

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestringRequired
    • assigned_countinteger

      Defaults to 0

    • target_quantityinteger

      Defaults to 0

    • remaining_quotainteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • active_sessionobjectRequired
    +Show 6 child attributes
    • colorstring | null

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

    • sizestring | null

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestring | null
    • remaining_quotainteger

      Defaults to 0

    • status_labelstring

      Defaults to Ready for scanning and mapping

  • total_assigned_footerstring

    Defaults to

POST /factory/qr/orders/{order_id}/assignment-session/complete
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/assignment-session/complete \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "order_display_id": "#PO-2026-7F3A",
  "flow_type": "standard",
  "batch_status": "minted",
  "is_active": false,
  "product_name": "Trail Tee",
  "brand_name": "Northwind Apparel",
  "summary": {
    "total_units": 24,
    "total_assigned": 24,
    "total_unassigned": 24,
    "total_variants": 24,
    "progress_assigned": 1,
    "progress_total": 1,
    "progress_percent": 72,
    "progress_label": ""
  },
  "filter_options": {
    "colors": [
      "White",
      "Black"
    ],
    "sizes": [
      "S",
      "M",
      "L"
    ]
  },
  "variants": [
    "White / M"
  ],
  "active_session": {
    "color": "White",
    "size": "M",
    "sku": "TT-100-WHT-M",
    "product_name": "Trail Tee",
    "remaining_quota": 1,
    "status_label": "Ready for scanning and mapping"
  },
  "total_assigned_footer": ""
}

Start factory label print session#

POST/factory/qr/orders/{order_id}/labels/print-session

Requires scope factory_qr:write

Factory begins printing QR labels for a **transmitted** batch. Sets batch status to printing. Accepts optional print configuration (printer, media, DPI, copies, mode). Refuses to start (409 custody_transfer_incomplete) until every unit's on-chain custody has actually confirmed to this factory's wallet — see GET .../labels/custody-readiness above to check/poll this beforehand.

Parameters

  • order_idstringpathRequired

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

Request body

  • printer_namestring | null
  • media_typestring | null
    One ofsynthetic_adhesivestandard_paper
  • print_quality_dpiinteger | null
  • copiesinteger | null
  • print_modestring | null
    One ofallrangeby_variant
  • range_frominteger | null

    range: sequence numbers, inclusive. Only unprinted units in the range are claimed.

  • range_tointeger | null
  • variant_colorstring | null

    by_variant: one print job per variant (flow A, variant pre-assigned).

  • variant_sizestring | null

Returns

HTTP 201
  • 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.

  • batch_statusstringRequired
  • print_sessionobjectRequired
    +Show 19 child attributes
    • session_idstringRequired
    • factory_idstringRequired

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

    • started_attimestampRequired
    • confirmed_attimestamp | null
    • unit_countintegerRequired
    • printer_namestring | null

      Optional print config (stored in session JSONB when provided)

    • media_typestring | null
    • print_quality_dpiinteger | null
    • copiesinteger | null
    • print_modestring | null
    • range_frominteger | null

      What this session claimed (FC-03 range / FC-04 variant). None = no filter.

    • range_tointeger | null
    • variant_colorstring | null
    • variant_sizestring | null
    • first_sequenceinteger | null
    • last_sequenceinteger | null
    • printed_countinteger | null
    • failed_countinteger | null
    • cancelled_attimestamp | null
POST /factory/qr/orders/{order_id}/labels/print-session
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/print-session \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
201Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "batch_status": "minted",
  "print_session": {
    "session_id": "5e8cd9bb-f7b6-538a-8879-2d5730e5b7a8",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
    "started_at": "2026-10-09T09:30:00Z",
    "confirmed_at": null,
    "unit_count": 24,
    "printer_name": "Printer",
    "media_type": "media type",
    "print_quality_dpi": 1,
    "copies": 1,
    "print_mode": "print mode",
    "range_from": 1,
    "range_to": 1,
    "variant_color": "variant color",
    "variant_size": "variant size",
    "first_sequence": 1,
    "last_sequence": 1,
    "printed_count": 24,
    "failed_count": 24,
    "cancelled_at": null
  }
}

Confirm labels printed#

POST/factory/qr/orders/{order_id}/labels/print-session/confirm

Requires scope factory_qr:write

Mark this session's labels printed. Failed sequence numbers go back to the unprinted pool. The batch becomes labels_printed only when every unit is done.

Parameters

  • order_idstringpathRequired

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

Request body

  • unit_countinteger | null

    Deprecated — the session's claimed units are confirmed.

  • failed_sequence_numbersarray of integers

    Labels in this session that did not print. They are released back to the unprinted pool so the next session prints them; nothing that printed can be printed again without an authorised reprint.

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.

  • batch_statusstringRequired
  • labels_printed_attimestamp | null
  • print_sessionobjectRequired
    +Show 19 child attributes
    • session_idstringRequired
    • factory_idstringRequired

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

    • started_attimestampRequired
    • confirmed_attimestamp | null
    • unit_countintegerRequired
    • printer_namestring | null

      Optional print config (stored in session JSONB when provided)

    • media_typestring | null
    • print_quality_dpiinteger | null
    • copiesinteger | null
    • print_modestring | null
    • range_frominteger | null

      What this session claimed (FC-03 range / FC-04 variant). None = no filter.

    • range_tointeger | null
    • variant_colorstring | null
    • variant_sizestring | null
    • first_sequenceinteger | null
    • last_sequenceinteger | null
    • printed_countinteger | null
    • failed_countinteger | null
    • cancelled_attimestamp | null
POST /factory/qr/orders/{order_id}/labels/print-session/confirm
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/print-session/confirm \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "batch_status": "minted",
  "labels_printed_at": null,
  "print_session": {
    "session_id": "5e8cd9bb-f7b6-538a-8879-2d5730e5b7a8",
    "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
    "started_at": "2026-10-09T09:30:00Z",
    "confirmed_at": null,
    "unit_count": 24,
    "printer_name": "Printer",
    "media_type": "media type",
    "print_quality_dpi": 1,
    "copies": 1,
    "print_mode": "print mode",
    "range_from": 1,
    "range_to": 1,
    "variant_color": "variant color",
    "variant_size": "variant size",
    "first_sequence": 1,
    "last_sequence": 1,
    "printed_count": 24,
    "failed_count": 24,
    "cancelled_at": null
  }
}

Create a reprint request#

POST/factory/qr/orders/{order_id}/labels/reprints

Requires scope factory_qr:write

Submit a reprint request for a unit or the whole batch. Valid reasons: VOIDED_LABEL, LOST_IN_TRANSIT, DAMAGED, PRINT_ERROR, OTHER.

Parameters

  • order_idstringpathRequired

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

Request body

  • reasonstringRequired
    One ofVOIDED_LABELLOST_IN_TRANSITDAMAGEDPRINT_ERROROTHER
  • unit_tokenstring | null

    Specific unit; omit for batch-level reprint

  • notesstring | null

Returns

HTTP 201
  • request_idstringRequired
  • 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.

  • unit_tokenstring | null

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

  • requested_bystringRequired
  • requested_by_namestringRequired
  • reasonstringRequired
  • statusstringRequired

    Current state of the object. See the allowed values.

  • review_notesstring | null
  • reviewed_bystring | null
  • reviewed_attimestamp | null
  • created_attimestampRequired

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

POST /factory/qr/orders/{order_id}/labels/reprints
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/reprints \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Customer changed their mind",
    "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
    "notes": "Received at dock 3"
  }'
201Response
json
{
  "request_id": "e9804536-aea1-5a8e-9436-cee0369250fc",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "requested_by": "requested by",
  "requested_by_name": "Requested by",
  "reason": "Customer changed their mind",
  "status": "active",
  "review_notes": "review notes",
  "reviewed_by": "reviewed by",
  "reviewed_at": null,
  "created_at": "2026-10-09T09:30:00Z"
}

Mark an authorized reprint request as printed#

POST/factory/qr/orders/{order_id}/labels/reprints/{request_id}/printed

Requires scope factory_qr:write

Complete the reprint lifecycle after replacement labels are issued.

Parameters

  • order_idstringpathRequired

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

  • request_idstringpathRequired

Returns

HTTP 200
  • request_idstringRequired
  • 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.

  • unit_tokenstring | null

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

  • requested_bystringRequired
  • requested_by_namestringRequired
  • reasonstringRequired
  • statusstringRequired

    Current state of the object. See the allowed values.

  • review_notesstring | null
  • reviewed_bystring | null
  • reviewed_attimestamp | null
  • created_attimestampRequired

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

POST /factory/qr/orders/{order_id}/labels/reprints/{request_id}/printed
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/labels/reprints/e9804536-aea1-5a8e-9436-cee0369250fc/printed \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "request_id": "e9804536-aea1-5a8e-9436-cee0369250fc",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "qr_batch_id": "qb_3e9a1c7f2b40",
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "requested_by": "requested by",
  "requested_by_name": "Requested by",
  "reason": "Customer changed their mind",
  "status": "active",
  "review_notes": "review notes",
  "reviewed_by": "reviewed by",
  "reviewed_at": null,
  "created_at": "2026-10-09T09:30:00Z"
}

Bulk Assign Variants#

POST/factory/qr/orders/{order_id}/units/bulk-assign

Requires scope factory_qr:write

Parameters

  • order_idstringpathRequired

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

Request body

  • assignmentsarray of objectsRequired
    +Show 4 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.

    • 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
  • updatedintegerRequired
  • failedarray of strings
  • assignment_percentintegerRequired
POST /factory/qr/orders/{order_id}/units/bulk-assign
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/units/bulk-assign \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "assignments": [
      {
        "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
        "size": "M",
        "color": "White",
        "batch_sku": "TT-100-WHT-M"
      }
    ]
  }'
200Response
json
{
  "updated": 1,
  "failed": [
    "failed"
  ],
  "assignment_percent": 72
}

Assign Variant#

POST/factory/qr/orders/{order_id}/units/{unit_token}/assign-variant

Requires scope factory_qr:write

Flow 2: lock size/color onto a unit after QC scan (variable flow only).

Parameters

  • order_idstringpathRequired

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

  • unit_tokenstringpathRequired

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

Request body

  • 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.

  • print_labelsboolean

    Defaults to false

  • printer_namestring

    Defaults to Zebra ZT411

  • station_idstring | null

Returns

HTTP 200
  • unit_tokenstringRequired

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

  • qr_display_idstringRequired
  • 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.

  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofpendingmintedvariant_assignedtransmitted
  • variant_assigned_attimestampRequired
  • order_idstringRequired

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

  • assignment_percentintegerRequired
  • transaction_idstringRequired
  • variant_remaining_quotainteger

    Defaults to 0

  • assigned_by_namestring | null
  • station_idstring | null
  • label_printobject | null
    +Show 5 child attributes
    • printer_namestring

      Defaults to Zebra ZT411

    • hand_tag_countinteger

      Defaults to 0

    • nylon_bag_countinteger

      Defaults to 0

    • labels_totalinteger

      Defaults to 0

    • messagestring

      Defaults to

POST /factory/qr/orders/{order_id}/units/{unit_token}/assign-variant
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/units/Qm7xK2pL9vR4tY8wZ1nB3c/assign-variant \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "size": "M",
    "color": "White",
    "batch_sku": "TT-100-WHT-M"
  }'
200Response
json
{
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "qr_display_id": "5baa6167-9f50-5823-b9ea-a4031e858bc7",
  "size": "M",
  "color": "White",
  "batch_sku": "TT-100-WHT-M",
  "status": "pending",
  "variant_assigned_at": "2026-10-09T09:30:00Z",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "assignment_percent": 72,
  "transaction_id": "37239195-d001-509b-9181-4a3b8cc01166",
  "variant_remaining_quota": 1,
  "assigned_by_name": "Assigned by",
  "station_id": "a46dc9a7-fa33-5293-bd1d-d4ca258059f4",
  "label_print": {
    "printer_name": "Zebra ZT411",
    "hand_tag_count": 24,
    "nylon_bag_count": 24,
    "labels_total": 1,
    "message": "Print job sent to Porto Labels"
  }
}

Print Unit Labels#

POST/factory/qr/orders/{order_id}/units/{unit_token}/print-labels

Requires scope factory_qr:write

Print the brand-planned replica labels (hang tag, poly bag, extra copies) after QC.

Parameters

  • order_idstringpathRequired

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

  • unit_tokenstringpathRequired

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

Request body

  • printer_namestring

    Label counts come from the brand's step-2 label slots, server-side.

    Defaults to Zebra ZT411

Returns

HTTP 200
  • transaction_idstringRequired
  • unit_tokenstringRequired

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

  • qr_display_idstringRequired
  • printer_namestringRequired
  • hand_tag_countintegerRequired
  • nylon_bag_countintegerRequired
  • labels_totalintegerRequired
  • messagestringRequired
POST /factory/qr/orders/{order_id}/units/{unit_token}/print-labels
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/units/Qm7xK2pL9vR4tY8wZ1nB3c/print-labels \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{}'
200Response
json
{
  "transaction_id": "37239195-d001-509b-9181-4a3b8cc01166",
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "qr_display_id": "5baa6167-9f50-5823-b9ea-a4031e858bc7",
  "printer_name": "Printer",
  "hand_tag_count": 24,
  "nylon_bag_count": 24,
  "labels_total": 1,
  "message": "Print job sent to Porto Labels"
}

Redo Assignment#

POST/factory/qr/orders/{order_id}/units/{unit_token}/redo-assignment

Requires scope factory_qr:write

Undo the last variant assignment for a unit (Redo Assignment).

Parameters

  • order_idstringpathRequired

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

  • unit_tokenstringpathRequired

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

Returns

HTTP 200
  • unit_tokenstringRequired

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

  • order_idstringRequired

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

  • statusstringRequired

    Current state of the object. See the allowed values.

    One ofpendingmintedvariant_assignedtransmitted
  • assignment_percentintegerRequired
  • messagestring

    Defaults to Assignment cleared — unit ready to scan again

POST /factory/qr/orders/{order_id}/units/{unit_token}/redo-assignment
curl
curl -X POST http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/units/Qm7xK2pL9vR4tY8wZ1nB3c/redo-assignment \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
200Response
json
{
  "unit_token": "Qm7xK2pL9vR4tY8wZ1nB3c",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "status": "pending",
  "assignment_percent": 72,
  "message": "Print job sent to Porto Labels"
}

Save Assignment Session#

PUT/factory/qr/orders/{order_id}/assignment-session

Requires scope factory_qr:write

Set active variant (color/size) for scanning — Start Next Variant.

Parameters

  • order_idstringpathRequired

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

Request body

  • colorstringRequired

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

  • sizestringRequired

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

Returns

HTTP 200
  • order_idstringRequired

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

  • order_display_idstringRequired

    Order number formatted for display (#PO-YYYY-XXXX).

  • flow_typestringRequired

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

    One ofstandardvariable
  • batch_statusstringRequired
  • is_activeboolean

    Defaults to false

  • product_namestringRequired
  • brand_namestringRequired
  • summaryobjectRequired
    +Show 8 child attributes
    • total_unitsinteger

      Defaults to 0

    • total_assignedinteger

      Defaults to 0

    • total_unassignedinteger

      Defaults to 0

    • total_variantsinteger

      Defaults to 0

    • progress_assignedinteger

      Defaults to 0

    • progress_totalinteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • filter_optionsobjectRequired
    +Show 2 child attributes
    • colorsarray of strings
    • sizesarray of strings
  • variantsarray of objectsRequired
    +Show 9 child attributes
    • colorstringRequired

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

    • sizestringRequired

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestringRequired
    • assigned_countinteger

      Defaults to 0

    • target_quantityinteger

      Defaults to 0

    • remaining_quotainteger

      Defaults to 0

    • progress_percentinteger

      Defaults to 0

    • progress_labelstring

      Defaults to

  • active_sessionobjectRequired
    +Show 6 child attributes
    • colorstring | null

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

    • sizestring | null

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

    • skustring | null

      Stock-keeping unit of the variant.

    • product_namestring | null
    • remaining_quotainteger

      Defaults to 0

    • status_labelstring

      Defaults to Ready for scanning and mapping

  • total_assigned_footerstring

    Defaults to

PUT /factory/qr/orders/{order_id}/assignment-session
curl
curl -X PUT http://62.169.23.239:8001/api/v1/factory/qr/orders/ord_8c2f4e1a9b7d3c60/assignment-session \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "color": "White",
    "size": "M"
  }'
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "order_display_id": "#PO-2026-7F3A",
  "flow_type": "standard",
  "batch_status": "minted",
  "is_active": false,
  "product_name": "Trail Tee",
  "brand_name": "Northwind Apparel",
  "summary": {
    "total_units": 24,
    "total_assigned": 24,
    "total_unassigned": 24,
    "total_variants": 24,
    "progress_assigned": 1,
    "progress_total": 1,
    "progress_percent": 72,
    "progress_label": ""
  },
  "filter_options": {
    "colors": [
      "White",
      "Black"
    ],
    "sizes": [
      "S",
      "M",
      "L"
    ]
  },
  "variants": [
    "White / M"
  ],
  "active_session": {
    "color": "White",
    "size": "M",
    "sku": "TT-100-WHT-M",
    "product_name": "Trail Tee",
    "remaining_quota": 1,
    "status_label": "Ready for scanning and mapping"
  },
  "total_assigned_footer": ""
}
NextPacking & shipping→