Declarations & certificates

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 token4 endpoints

Retrieve factory declarations#

GET/brands/production-orders/{order_id}/declarations

Requires scope orders:read

Material composition and per-size weights, sustainability, repairability, origin & compliance, and every certificate — declared by the factory for this order before production started. missing lists what is still to be declared; locked is true once production started.

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_idstring | null

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

  • product_idstring | null

    Skannit's id for the product.

  • factory_idstring | null

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

  • lockedboolean

    Locked once production starts; certificates may still be added as amendments.

    Defaults to false

  • locked_attimestamp | null
  • missingarray of strings

    Still to declare before production can start, e.g. ["material_weights"].

  • material_compositionarray of objects
    +Show 3 child attributes
    • material_namestringRequired
    • percentagenumberRequired
    • garment_partstring | null
  • element_weightsarray of objects
    +Show 3 child attributes
    • garment_partstring | null
    • sizestringRequired

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

    • gramsnumberRequired
  • material_declared_attimestamp | null
  • carbon_co2string | null
  • water_used_lstring | null
  • circular_scoreinteger | null
  • end_of_life_instructionsstring | null
  • sustainability_declared_attimestamp | null
  • repair_difficultystring | null
  • spare_parts_includedarray of strings
  • repair_instructions_urlstring | null
  • repairability_declared_attimestamp | null
  • country_of_originstring | null
  • main_supplierstring | null
  • compliance_standardsobject
    +Show 3 child attributes
    • eu_dpp_readyboolean

      Defaults to false

    • esg_certifiedboolean

      Defaults to false

    • reach_compliantboolean

      Defaults to false

  • origin_declared_attimestamp | null
  • certificatesarray of objects
    +Show 14 child attributes
    • certificate_idstringRequired
    • order_idstringRequired

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

    • cert_typestringRequired
      One oforiginfabricdyefactory_auditother
    • file_urlstringRequired
    • file_namestring | null
    • content_typestring | null
    • certificate_numberstring | null
    • issuerstring | null
    • valid_untildate | null
    • expiredboolean

      Defaults to false

    • is_amendmentboolean

      Added after production started — always carries a note saying why.

      Defaults to false

    • notestring | null
    • uploaded_by_rolestringRequired
      One offactorybrand
    • created_attimestampRequired

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

GET /brands/production-orders/{order_id}/declarations
curl
curl http://62.169.23.239:8001/api/v1/brands/production-orders/ord_8c2f4e1a9b7d3c60/declarations \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
{
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "order_display_id": "#PO-2026-7F3A",
  "product_id": "f6abe715-90aa-5908-a0a6-12951a3a21cc",
  "factory_id": "0a2a5d14-a4a4-5b01-be71-b6999803bd70",
  "locked": false,
  "locked_at": null,
  "missing": [
    "care_label"
  ],
  "material_composition": [
    {
      "material_name": "Organic cotton",
      "percentage": 72.5,
      "garment_part": "body"
    }
  ],
  "element_weights": [
    {
      "garment_part": "body",
      "size": "M",
      "grams": 1
    }
  ],
  "material_declared_at": null,
  "carbon_co2": 3.2,
  "water_used_l": 2700,
  "circular_score": 72,
  "end_of_life_instructions": "Return to any Northwind store for recycling",
  "sustainability_declared_at": null,
  "repair_difficulty": "easy",
  "spare_parts_included": [
    "buttons"
  ],
  "repair_instructions_url": "https://files.skannit.example/repair_instructions.png",
  "repairability_declared_at": null,
  "country_of_origin": "PT",
  "main_supplier": "Tecidos do Norte",
  "compliance_standards": {
    "eu_dpp_ready": true,
    "esg_certified": true,
    "reach_compliant": true
  },
  "origin_declared_at": null,
  "certificates": [
    {
      "certificate_id": "8adb1935-cf92-52d2-ba1a-5e36cfce41e0",
      "order_id": "ord_8c2f4e1a9b7d3c60",
      "cert_type": "origin",
      "file_url": "https://files.skannit.example/file.png",
      "file_name": "certificate.pdf",
      "content_type": "application/pdf",
      "certificate_number": "GOTS-2026-11842",
      "issuer": "Control Union",
      "valid_until": "2026-11-20",
      "expired": false,
      "is_amendment": false,
      "note": "Corner of box dented",
      "uploaded_by_role": "factory",
      "created_at": "2026-10-09T09:30:00Z"
    }
  ]
}

List certificates#

GET/brands/production-orders/{order_id}/certificates

Requires scope orders:read

Parameters

  • order_idstringpathRequired

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

Returns

HTTP 200
  • certificate_idstringRequired
  • order_idstringRequired

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

  • cert_typestringRequired
    One oforiginfabricdyefactory_auditother
  • file_urlstringRequired
  • file_namestring | null
  • content_typestring | null
  • certificate_numberstring | null
  • issuerstring | null
  • valid_untildate | null
  • expiredboolean

    Defaults to false

  • is_amendmentboolean

    Added after production started — always carries a note saying why.

    Defaults to false

  • notestring | null
  • uploaded_by_rolestringRequired
    One offactorybrand
  • created_attimestampRequired

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

GET /brands/production-orders/{order_id}/certificates
curl
curl http://62.169.23.239:8001/api/v1/brands/production-orders/ord_8c2f4e1a9b7d3c60/certificates \
  -H "Authorization: Bearer $SKANNIT_TOKEN"
200Response
json
[
  {
    "certificate_id": "8adb1935-cf92-52d2-ba1a-5e36cfce41e0",
    "order_id": "ord_8c2f4e1a9b7d3c60",
    "cert_type": "origin",
    "file_url": "https://files.skannit.example/file.png",
    "file_name": "certificate.pdf",
    "content_type": "application/pdf",
    "certificate_number": "GOTS-2026-11842",
    "issuer": "Control Union",
    "valid_until": "2026-11-20",
    "expired": false,
    "is_amendment": false,
    "note": "Corner of box dented",
    "uploaded_by_role": "factory",
    "created_at": "2026-10-09T09:30:00Z"
  }
]

Attach a certificate#

POST/brands/production-orders/{order_id}/certificates

Requires scope orders:write

multipart/form-data. Marked as brand-supplied. After production has started it is recorded as an amendment, and note is required.

Parameters

  • order_idstringpathRequired

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

Request body

multipart/form-data
  • cert_typestring | null

    origin | fabric | dye | factory_audit | other

  • certificate_numberstring | null
  • issuerstring | null
  • valid_untilstring | null

    YYYY-MM-DD

  • notestring | null
  • source_certificate_idstring | null

    Reuse a certificate from one of your earlier orders instead of uploading

  • filestring | null

    PDF, Word document or image

Returns

HTTP 201
  • certificate_idstringRequired
  • order_idstringRequired

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

  • cert_typestringRequired
    One oforiginfabricdyefactory_auditother
  • file_urlstringRequired
  • file_namestring | null
  • content_typestring | null
  • certificate_numberstring | null
  • issuerstring | null
  • valid_untildate | null
  • expiredboolean

    Defaults to false

  • is_amendmentboolean

    Added after production started — always carries a note saying why.

    Defaults to false

  • notestring | null
  • uploaded_by_rolestringRequired
    One offactorybrand
  • created_attimestampRequired

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

POST /brands/production-orders/{order_id}/certificates
curl
curl -X POST http://62.169.23.239:8001/api/v1/brands/production-orders/ord_8c2f4e1a9b7d3c60/certificates \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F cert_type=origin \
  -F certificate_number=GOTS-2026-11842 \
  -F file=@certificate.pdf
201Response
json
{
  "certificate_id": "8adb1935-cf92-52d2-ba1a-5e36cfce41e0",
  "order_id": "ord_8c2f4e1a9b7d3c60",
  "cert_type": "origin",
  "file_url": "https://files.skannit.example/file.png",
  "file_name": "certificate.pdf",
  "content_type": "application/pdf",
  "certificate_number": "GOTS-2026-11842",
  "issuer": "Control Union",
  "valid_until": "2026-11-20",
  "expired": false,
  "is_amendment": false,
  "note": "Corner of box dented",
  "uploaded_by_role": "factory",
  "created_at": "2026-10-09T09:30:00Z"
}

Remove a certificate#

DELETE/brands/production-orders/{order_id}/certificates/{certificate_id}

Requires scope orders:write

Parameters

  • order_idstringpathRequired

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

  • certificate_idstringpathRequired

Returns

HTTP 204

No body.

DELETE /brands/production-orders/{order_id}/certificates/{certificate_id}
curl
curl -X DELETE http://62.169.23.239:8001/api/v1/brands/production-orders/ord_8c2f4e1a9b7d3c60/certificates/8adb1935-cf92-52d2-ba1a-5e36cfce41e0 \
  -H "Authorization: Bearer $SKANNIT_TOKEN" \
  -H "Idempotency-Key: $(uuidgen)"
204Response
json
// 204 — no body
NextPassports & insight→