CanopyDocs
Reference

Orders

GET
/api/orders

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Query Parameters

page?integer
Range0 < value
Default1
limit?integer
Range0 < value <= 500
Default20
search?string
Lengthlength <= 100
sortBy?string
Lengthlength <= 50
sortOrder?string
Default"asc"

Value in

  • "asc"
  • "desc"
status?string

Value in

  • "PENDING"
  • "REPLENISH"
  • "ALLOCATED"
  • "PICKING"
  • "PICKED"
  • "PACKING"
  • "FULFILLED"
  • "SHIPPED"
  • "PARTIALLY_SHIPPED"
  • "DELIVERED"
  • "ON_HOLD"
  • "CANCELLED"
  • "BACKORDERED"
  • "UNFULFILLABLE"
  • "EXTERNALLY_FULFILLED"
  • "MERGED"
statuses?string
priority?string
channelId?string
isWholesale?string

Value in

  • "true"
  • "false"
channelEditReview?string

Value in

  • "true"
  • "false"
partial?string

Value in

  • "true"
  • "false"
partlyElsewhere?string

Value in

  • "true"
  • "false"
mergeState?string

Value in

  • "master"
  • "child"
  • "any"
dateFrom?string
dateTo?string
datePreset?string

Value in

  • "today"
  • "yesterday"
  • "monthToDate"
  • "last30"
  • "custom"
destination?string

Value in

  • "domestic"
  • "international"
countries?not ()|array<string>|not (unknown)
warehouseIds?|array<string>|
slaFilter?string

Value in

  • "dueToday"
  • "late"
  • "upcoming"
  • "undated"
  • "committed"
  • "onSchedule"
fulfilledToday?string

Value in

  • "true"
  • "false"
timezone?string
Lengthlength <= 50
Default"UTC"
orderNumber?string
externalOrderId?string
updatedSince?string
Formatdate-time
wholesaleAccountId?string
wholesaleShipMode?string

Value in

  • "COURIER"
  • "FREIGHT"

Header Parameters

X-Client-Id?string

Scope results to one client (brand). Resolve a client name to its id via GET /api/clients/lookup. Validated against the credential's tenant; ignored by a client-pinned credential.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders"
{  "success": true,  "data": [    {      "id": "string",      "clientId": "string",      "warehouseId": "string",      "orderNumber": "string",      "channelId": "string",      "channelOrderId": "string",      "splitFromOrderId": "string",      "status": "PENDING",      "priority": "STANDARD",      "shippingMethod": "string",      "shippingAddress": {        "name": "string",        "company": "string",        "line1": "string",        "line2": "string",        "city": "string",        "state": "string",        "zip": "string",        "country": "string",        "phone": "string"      },      "billingAddress": {        "name": "string",        "company": "string",        "line1": "string",        "line2": "string",        "city": "string",        "state": "string",        "zip": "string",        "country": "string",        "phone": "string"      },      "customerName": "string",      "customerEmail": "string",      "customerPhone": "string",      "notes": "string",      "giftNote": "string",      "tags": [        "string"      ],      "holdReason": "string",      "holdUntil": "2019-08-24T14:15:22Z",      "holdSource": "OPERATOR",      "channelEditReview": null,      "isWholesale": true,      "allowPartialShip": true,      "wholesaleShipMode": "COURIER",      "requiredShipDate": "2019-08-24T14:15:22Z",      "totalAmount": 0,      "currency": "string",      "presentmentCurrency": "string",      "allocatedAt": "2019-08-24T14:15:22Z",      "pickedAt": "2019-08-24T14:15:22Z",      "packedAt": "2019-08-24T14:15:22Z",      "shippedAt": "2019-08-24T14:15:22Z",      "trackingNumber": "string",      "carrierCode": "string",      "postageTypeOverride": "string",      "manualPostageType": "string",      "postageTypeOverrideAccountId": "string",      "manualPostageAccountId": "string",      "serviceOptionsOverride": {        "signature": "STANDARD",        "insurance": {          "amount": 0,          "currency": "string"        }      },      "manualServiceOptions": {        "signature": "STANDARD",        "insurance": {          "amount": 0,          "currency": "string"        }      },      "isActive": true,      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z",      "splitFrom": {        "id": "string",        "orderNumber": "string"      },      "deliveredAt": "2019-08-24T14:15:22Z",      "openShortLines": 0,      "wholesaleAccountName": "string",      "displayTotal": 0,      "lineCount": 0,      "previewItems": [        {          "skuCode": "string",          "skuName": "string",          "imageUrl": "string"        }      ],      "totalQuantity": 0,      "totalValue": 0,      "clientName": "string",      "clientCode": "string",      "channelName": "string",      "warehouseName": "string",      "currentTote": {        "id": "string",        "barcode": "string",        "name": "string"      }    }  ],  "pagination": {    "page": 0,    "limit": 0,    "total": 0,    "totalPages": 0  }}
POST
/api/orders

Backend order intake. Omit warehouseId and the order lands where the client's routing rules send it, else in the client's default warehouse, which your 3PL sets (read it back as defaultWarehouseId on GET /api/clients/lookup); a tenant with a single warehouse needs no default. Once the tenant has two or more warehouses, every client needs a default. warehouseId pins the order to one warehouse and is for the 3PL's own tenant-wide credentials (and staff): a client-pinned credential sending it is refused with 403 — the warehouse is chosen by routing. GET /api/warehouse/warehouses lists the ids. The create is rejected when no warehouse can be resolved. orderNumber is unique per client: a repeat gets 409 with existingOrderId naming the order that already has it, whatever the body, so use an Idempotency-Key for safe retries rather than the number. The response is the stored order before auto-allocation runs; read it back for the allocated state.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders" \  -H "Content-Type: application/json" \  -d '{    "lines": [      {        "skuId": "string",        "quantity": 1      }    ]  }'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0,    "lines": [      {        "id": "string",        "orderId": "string",        "skuId": "string",        "quantity": 0,        "quantityAllocated": 0,        "quantityPicked": 0,        "quantityPacked": 0,        "quantityShipped": 0,        "quantityFulfilled": 0,        "fulfilledExternally": true,        "unitPrice": 0,        "presentmentUnitPrice": 0,        "taxAllocated": 0,        "presentmentTaxAllocated": 0,        "discountAllocated": 0,        "presentmentDiscountAllocated": 0,        "status": "PENDING",        "isKitParent": true,        "kitParentLineId": "string",        "channelLineId": "string",        "createdAt": "2019-08-24T14:15:22Z",        "updatedAt": "2019-08-24T14:15:22Z",        "sku": {          "skuCode": "string",          "name": "string",          "weight": 0,          "nonPhysical": true        }      }    ]  }}
GET
/api/orders/blocked

Orders that cannot allocate, grouped by the SKU blocking them, with a diagnosis of AWAITING_PUTAWAY (stock on site but in a non-pickable bin — allocation cannot reach it), AWAITING_RESTOCK (nothing usable, inbound open) or OUT_OF_STOCK. Groups are ordered by how many orders each unblocks. Considers PENDING, BACKORDERED and PARTIALLY_SHIPPED orders only — a resting split still owes units its remainder cannot allocate.

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Query Parameters

limit?integer

Maximum groups to return (default 200).

Range0 < value <= 500

Header Parameters

X-Client-Id?string

Scope results to one client (brand). Resolve a client name to its id via GET /api/clients/lookup. Validated against the credential's tenant; ignored by a client-pinned credential.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/blocked"
{  "success": true,  "data": [    {      "skuId": "string",      "skuCode": "string",      "skuName": "string",      "orderCount": 0,      "unitsShort": 0,      "onHand": 0,      "pickable": 0,      "stuckInNonPickable": 0,      "reserved": 0,      "approxAvailable": 0,      "additionalUnitsNeeded": 0,      "diagnosis": "ALLOCATABLE_NOW",      "inbound": [        {          "shipmentNumber": "string",          "expected": 0,          "received": 0        }      ],      "earliestRequiredShipDate": "2019-08-24T14:15:22Z",      "highestPriority": "STANDARD",      "orders": [        {          "id": "string",          "orderNumber": "string",          "status": "PENDING",          "priority": "STANDARD",          "requiredShipDate": "2019-08-24T14:15:22Z",          "unitsShort": 0,          "clearableNow": true        }      ]    }  ]}
GET
/api/orders/diagnose-missing

Searches by orderNumber (exact, then partial) and externalOrderId, INCLUDING cancelled and deactivated orders. When nothing matches, returns per-channel intake health and a diagnosis: CHANNEL_SYNC_FAILING, ORDER_SYNC_DISABLED, CHANNEL_DISCONNECTED, INTAKE_STALLED (inferred from volume), ORDERS_NOT_IMPORTED (the latest sync fetched orders it could not import — notImportedOrders says which and why; answered first when one of them is the searched order), NO_CHANNELS_CONFIGURED or NO_INTAKE_PROBLEM_FOUND. At least one of the two query parameters is required.

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Query Parameters

orderNumber?string

Exact, then partial, match on the order number.

externalOrderId?string

The sales channel's order id.

Header Parameters

X-Client-Id?string

Scope results to one client (brand). Resolve a client name to its id via GET /api/clients/lookup. Validated against the credential's tenant; ignored by a client-pinned credential.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/diagnose-missing"
{  "success": true,  "data": {    "query": {      "orderNumber": "string",      "externalOrderId": "string"    },    "matches": [      {        "id": "string",        "orderNumber": "string",        "externalOrderId": "string",        "status": "PENDING",        "isActive": true,        "clientName": "string",        "channelName": "string",        "createdAt": "2019-08-24T14:15:22Z",        "splitFrom": {          "id": "string",          "orderNumber": "string"        },        "matchedBy": "orderNumber"      }    ],    "diagnosis": "FOUND",    "suspects": [      "string"    ],    "channels": [      {        "channelId": "string",        "channelName": "string",        "channelType": "SHOPIFY",        "clientName": "string",        "isActive": true,        "orderSyncEnabled": true,        "lastOrderSyncStatus": "string",        "lastOrderSyncAt": "2019-08-24T14:15:22Z",        "lastOrderSyncError": "string",        "lastSuccessfulOrderSyncAt": "2019-08-24T14:15:22Z",        "failingSince": "2019-08-24T14:15:22Z",        "consecutiveFailures": 0,        "ordersNotImported": 0,        "notImportedOrders": [          {            "orderNumber": "string",            "externalOrderId": "string",            "reason": "string"          }        ],        "lastOrderReceivedAt": "2019-08-24T14:15:22Z",        "ordersLast24h": 0,        "avgOrdersPerDayPrior7d": 0      }    ],    "channelsComplete": true,    "thresholds": {      "staleIntakeHours": 0,      "baselineDays": 0    }  }}
GET
/api/orders/{id}

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Path Parameters

id*string

Order id

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string"
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "splitFrom": {      "id": "string",      "orderNumber": "string"    },    "splitSiblings": [      {        "id": "string",        "orderNumber": "string",        "status": "PENDING",        "warehouseId": "string",        "warehouseName": "string"      }    ],    "warehouseName": "string",    "warehouseSource": "EXPLICIT",    "routingRule": {      "id": "string",      "name": "string"    },    "openShortLines": 0,    "noteCount": 0,    "attachmentCount": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "wholesaleAccount": {      "id": "string",      "name": "string"    },    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "financialStatus": "string",    "totalOutstanding": 0,    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "partialShip": {      "eligible": true,      "source": "order",      "inherited": {        "eligible": true,        "source": "channel"      }    },    "client": {      "id": "string",      "name": "string",      "code": "string"    },    "channel": {      "id": "string",      "name": "string",      "type": "SHOPIFY"    },    "lines": [      {        "id": "string",        "skuId": "string",        "skuCode": "string",        "skuName": "string",        "skuImageUrl": "string",        "quantity": 0,        "quantityAllocated": 0,        "quantityPicked": 0,        "quantityPacked": 0,        "quantityShipped": 0,        "quantityFulfilled": 0,        "fulfilledExternally": true,        "unitPrice": 0,        "presentmentUnitPrice": 0,        "taxAllocated": 0,        "presentmentTaxAllocated": 0,        "discountAllocated": 0,        "presentmentDiscountAllocated": 0,        "status": "PENDING",        "isKitParent": true,        "kitParentLineId": "string",        "channelLineId": "string",        "customerLineKey": "string",        "settledInFamily": 0,        "lots": [          {            "lotId": "string",            "lotNumber": "string",            "expiresAt": "2019-08-24T14:15:22Z",            "quantity": 0,            "status": "ACTIVE"          }        ],        "pickLocations": [          "string"        ]      }    ],    "editLogs": [      {        "id": "string",        "action": "CREATED",        "field": "string",        "previousValue": null,        "newValue": null,        "notes": "string",        "performedBy": {          "firstName": "string",          "lastName": "string",          "email": "string"        },        "createdAt": "2019-08-24T14:15:22Z"      }    ],    "trackingEvents": [      {        "id": "string",        "status": "string",        "rawStatus": "string",        "description": "string",        "location": "string",        "carrier": "string",        "occurredAt": "2019-08-24T14:15:22Z"      }    ],    "reships": [      {        "id": "string",        "depth": "RELABEL",        "reason": "LABEL_ERROR",        "disposition": "RESTOCK",        "status": "OPEN",        "oldShipment": {          "id": "string",          "trackingNumber": "string"        },        "newShipment": {          "id": "string",          "trackingNumber": "string"        },        "notes": "string",        "performedBy": {          "firstName": "string",          "lastName": "string",          "email": "string"        },        "createdAt": "2019-08-24T14:15:22Z",        "lines": [          {            "orderLineId": "string",            "quantity": 0          }        ]      }    ]  }}
PATCH
/api/orders/{id}

Which fields are editable depends on the order's status: everything before allocation; address, notes and tags while it is being picked and packed; notes and tags once shipped. A field that is not editable in the current status is rejected with 400. A concurrent edit or status change is rejected with 409 — re-read the order and retry.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0  }}
PATCH
/api/orders/{id}/hold

A client-pinned credential holds as its client (holdSource: CLIENT); a tenant-wide credential holds as the warehouse (holdSource: OPERATOR).

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/hold" \  -H "Content-Type: application/json" \  -d '{    "reason": "string"  }'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0,    "releasedUnits": 0  }}
PATCH
/api/orders/{id}/release

A client-pinned credential may release only a hold its client placed (holdSource: CLIENT); a hold placed by the warehouse, the system, the sales channel or a payment check is refused with 403. A tenant-wide credential may release any hold.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/release"
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0  }}
GET
/api/orders/{id}/holds

Every hold reason and note on the order (WORK_STAGE_MACHINE §6.1), open rows first then newest. An order is ON_HOLD while any open row is blocking; holdReason / holdSource on the order mirror the newest open blocking row.

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Path Parameters

id*string

Order id

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string/holds"
{  "success": true,  "data": [    {      "id": "string",      "orderId": "string",      "kind": "OPERATOR_HOLD",      "blocking": true,      "source": "OPERATOR",      "payload": null,      "message": "string",      "dedupeKey": "string",      "releaseAt": "2019-08-24T14:15:22Z",      "placedAt": "2019-08-24T14:15:22Z",      "placedById": "string",      "resolvedAt": "2019-08-24T14:15:22Z",      "resolvedById": "string",      "resolution": "RELEASED"    }  ]}
POST
/api/orders/{id}/holds/{holdId}/resolve

Lifts one row: RELEASED (the default) for a hold reason, ACKNOWLEDGED for a note. A client-pinned credential may resolve only its client's own hold (CLIENT_HOLD) and a note that is not a warehouse decision; any other is refused with 403. A row that closed with another answer is refused with 409 (the same answer again changes nothing). The order stays ON_HOLD while another blocking row is open — the response says so (released, stillHeldFor).

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

holdId*string

Hold id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/holds/string/resolve" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0,    "released": true,    "stillHeldFor": [      "OPERATOR_HOLD"    ]  }}
PATCH
/api/orders/{id}/cancel

Refused (400) once the order has shipped, and (409) when a parcel already has carrier scans or a live freight booking exists.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/cancel"
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0  }}
PATCH
/api/orders/{id}/postage-override

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. Pins the postage type (and optionally signature / insurance options) the label will be bought with, beating the client's automation rules. Send postageType: null to clear it. Refused once a label exists — void it first.

Authorization

oauth2 shipping:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: shipping:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/postage-override" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "orderNumber": "string",    "status": "PENDING",    "priority": "STANDARD",    "manualPostageType": "string",    "manualPostageAccountId": "string",    "manualServiceOptions": {      "property1": null,      "property2": null    }  }}
GET
/api/orders/{id}/reship/preview

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. What POST /reship would do with the same inputs, with zero writes: the first gate that refuses (blocked), or the lines and parcel it would act on. Send action=reship with depth and reason.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Query Parameters

action*string

Value in

  • "reship"
  • "uncancel"
  • "unmark"
  • "abandon"
  • "amend"
  • "edit"
depth?string

Value in

  • "RELABEL"
  • "REPICK"
reason?string

Value in

  • "LABEL_ERROR"
  • "SERVICE_CHANGE"
  • "LOST_OR_DAMAGED"
  • "RETURNED_TO_SENDER"
  • "MISPICK"
  • "OTHER"
  • "CLIENT_REQUEST"
disposition?string

Value in

  • "WRITE_OFF"
  • "NONE"
  • "GOODWILL"
newWarehouseId?string
Length1 <= length
reshipId?string
Length1 <= length
reshipGroupId?string
Length1 <= length
sourceShipmentId?string
Length1 <= length
oldShipmentId?string
Length1 <= length
lines?never
lineIds?never

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string/reship/preview?action=reship"
{  "success": true,  "data": {    "orderId": "string",    "action": "reship",    "depth": "RELABEL",    "blocked": {      "code": "string",      "message": "string"    },    "warnings": [      "string"    ]  }}
POST
/api/orders/{id}/reship

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. RELABEL retires the old label and buys a new one for the same box; REPICK sends the selected units again from stock (the order goes back through picking). Gated on the order's state — run the preview first; a refused gate is a 400 naming the reason.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/reship" \  -H "Content-Type: application/json" \  -d '{    "depth": "RELABEL",    "reason": "LABEL_ERROR"  }'
{  "success": true,  "data": {    "reshipId": "string",    "orderId": "string",    "depth": "RELABEL",    "newShipmentId": "string",    "warnings": [      "string"    ]  }}
PATCH
/api/orders/{id}/requeue

Only UNFULFILLABLE orders can be re-queued; the order is re-allocated immediately.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/requeue"
{  "success": true,  "data": {    "orderId": "string",    "orderNumber": "string",    "status": "FULLY_ALLOCATED",    "lines": [      {        "skuId": "string",        "skuCode": "string",        "requested": 0,        "allocated": 0,        "shortfall": 0      }    ]  }}
POST
/api/orders/{id}/mark-shipped

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. For orders fulfilled outside Canopy's label flow. Only allowed from FULFILLED.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/mark-shipped" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0  }}
POST
/api/orders/{id}/mark-delivered

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/mark-delivered" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "warehouseId": "string",    "orderNumber": "string",    "channelId": "string",    "channelOrderId": "string",    "splitFromOrderId": "string",    "status": "PENDING",    "priority": "STANDARD",    "shippingMethod": "string",    "shippingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "billingAddress": {      "name": "string",      "company": "string",      "line1": "string",      "line2": "string",      "city": "string",      "state": "string",      "zip": "string",      "country": "string",      "phone": "string"    },    "customerName": "string",    "customerEmail": "string",    "customerPhone": "string",    "notes": "string",    "giftNote": "string",    "tags": [      "string"    ],    "holdReason": "string",    "holdUntil": "2019-08-24T14:15:22Z",    "holdSource": "OPERATOR",    "channelEditReview": null,    "isWholesale": true,    "allowPartialShip": true,    "wholesaleShipMode": "COURIER",    "requiredShipDate": "2019-08-24T14:15:22Z",    "totalAmount": 0,    "currency": "string",    "presentmentCurrency": "string",    "allocatedAt": "2019-08-24T14:15:22Z",    "pickedAt": "2019-08-24T14:15:22Z",    "packedAt": "2019-08-24T14:15:22Z",    "shippedAt": "2019-08-24T14:15:22Z",    "trackingNumber": "string",    "carrierCode": "string",    "postageTypeOverride": "string",    "manualPostageType": "string",    "postageTypeOverrideAccountId": "string",    "manualPostageAccountId": "string",    "serviceOptionsOverride": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "manualServiceOptions": {      "signature": "STANDARD",      "insurance": {        "amount": 0,        "currency": "string"      }    },    "isActive": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z",    "packedPriority": "STANDARD",    "cancelledAt": "2019-08-24T14:15:22Z",    "cancelSource": "OPERATOR",    "financialStatus": "string",    "totalOutstanding": 0,    "wholesaleAccountId": "string",    "wholesaleInstructions": "string",    "stagingBinId": "string",    "presentmentTotal": 0,    "shippingAmount": 0,    "presentmentShippingAmount": 0,    "deliveredAt": "2019-08-24T14:15:22Z",    "version": 0  }}
POST
/api/orders/{id}/lines

Allowed until the order starts picking (PENDING, ON_HOLD, ALLOCATED, REPLENISH, BACKORDERED, UNFULFILLABLE, PARTIALLY_SHIPPED).

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/lines" \  -H "Content-Type: application/json" \  -d '{    "skuId": "string",    "quantity": 1  }'
{  "success": true,  "data": {    "id": "string",    "skuId": "string",    "skuCode": "string",    "skuName": "string",    "quantity": 0,    "quantityAllocated": 0,    "quantityPicked": 0,    "quantityPacked": 0,    "quantityFulfilled": 0,    "fulfilledExternally": true,    "unitPrice": 0,    "status": "PENDING",    "heldForReview": {      "message": "string",      "heldBy": [        {          "id": "string",          "orderNumber": "string",          "warehouseId": "string"        }      ]    }  }}
PATCH
/api/orders/{id}/lines/{lineId}

Before allocation (PENDING or ON_HOLD) quantity and price can both be edited. Once the order is ALLOCATED only a quantity decrease is accepted — no increase, no price change — and the line must still owe at least one unit afterwards. Wholesale orders refuse it. On a PICKING or PICKED order an API token is refused with 403: a reduction there retires pick work, which only warehouse staff can do, from the order in Canopy.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

lineId*string

Order line id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://example.com/api/orders/string/lines/string" \  -H "Content-Type: application/json" \  -d '{}'
{  "success": true,  "data": {    "id": "string",    "skuId": "string",    "skuCode": "string",    "skuName": "string",    "quantity": 0,    "quantityAllocated": 0,    "quantityPicked": 0,    "quantityPacked": 0,    "quantityFulfilled": 0,    "fulfilledExternally": true,    "unitPrice": 0,    "status": "PENDING",    "heldForReview": {      "message": "string",      "heldBy": [        {          "id": "string",          "orderNumber": "string",          "warehouseId": "string"        }      ]    }  }}
DELETE
/api/orders/{id}/lines/{lineId}

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

lineId*string

Order line id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X DELETE "https://example.com/api/orders/string/lines/string"
{  "success": true,  "data": {    "success": true,    "stagedForPutBack": 0,    "heldForReview": {      "message": "string",      "heldBy": [        {          "id": "string",          "orderNumber": "string",          "warehouseId": "string"        }      ]    }  }}
POST
/api/orders/{id}/allocate

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. Run allocation for this order against current on-hand stock. Accepted while the order is PENDING, BACKORDERED or PARTIALLY_SHIPPED — safe to re-run as more stock lands; an order in any other status is rejected with 400.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/allocate"
{  "success": true,  "data": {    "orderId": "string",    "orderNumber": "string",    "status": "FULLY_ALLOCATED",    "lines": [      {        "skuId": "string",        "skuCode": "string",        "requested": 0,        "allocated": 0,        "shortfall": 0      }    ]  }}
POST
/api/orders/{id}/reprocess-rules

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. Re-evaluate the client's automation rules against this order — use it after fixing whatever made the rules miss (a new mapping, a corrected address).

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/reprocess-rules"
{  "success": true,  "data": {    "orderId": "string",    "status": "PENDING",    "cancelled": true,    "applied": [      {        "type": "string",        "detail": "string"      }    ],    "skipped": [      {        "type": "string",        "reason": "string"      }    ]  }}
GET
/api/orders/{id}/history

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Path Parameters

id*string

Order id

Query Parameters

page?integer
Range0 < value
Default1
limit?integer
Range0 < value <= 500
Default20

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string/history"
{  "success": true,  "data": [    {      "id": "string",      "action": "CREATED",      "field": "string",      "previousValue": null,      "newValue": null,      "notes": "string",      "performedBy": {        "firstName": "string",        "lastName": "string",        "email": "string"      },      "createdAt": "2019-08-24T14:15:22Z"    }  ],  "pagination": {    "page": 0,    "limit": 0,    "total": 0,    "totalPages": 0  },  "trackingEvents": [    {      "id": "string",      "status": "string",      "rawStatus": "string",      "description": "string",      "location": "string",      "carrier": "string",      "occurredAt": "2019-08-24T14:15:22Z"    }  ]}
GET
/api/orders/{id}/handling

Tenant-wide credentials only. A credential pinned to one client is refused (403), as that client's portal users are; use a tenant-wide credential with X-Client-Id. Pick-list assignee(s), packer, tote, packing station, label and the stage timestamps. The packer is exact (PackRecord.packedById); the picker is the assignee of the pick list, since Canopy does not record a per-item picker. stage is derived from the work records, so a bought-but-unscanned label reads LABELLED_AWAITING_HANDOFF rather than SHIPPED.

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Path Parameters

id*string

Order id

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string/handling"
{  "success": true,  "data": {    "orderId": "string",    "orderNumber": "string",    "status": "PENDING",    "clientName": "string",    "warehouseName": "string",    "stage": "NOT_STARTED",    "location": {      "kind": "NOT_PICKED_YET",      "label": "string",      "detail": "string"    },    "timeline": {      "createdAt": "2019-08-24T14:15:22Z",      "allocatedAt": "2019-08-24T14:15:22Z",      "pickedAt": "2019-08-24T14:15:22Z",      "packedAt": "2019-08-24T14:15:22Z",      "shippedAt": "2019-08-24T14:15:22Z",      "deliveredAt": "2019-08-24T14:15:22Z"    },    "picks": [      {        "pickListId": "string",        "status": "string",        "strategy": "string",        "zoneName": "string",        "pickedByName": "string",        "pickedByEmail": "string",        "startedAt": "2019-08-24T14:15:22Z",        "completedAt": "2019-08-24T14:15:22Z",        "itemsTotal": 0,        "itemsPicked": 0,        "itemsShort": 0,        "unitsExpected": 0,        "unitsPicked": 0,        "toteBarcode": "string"      }    ],    "pack": {      "packRecordId": "string",      "status": "string",      "packedByName": "string",      "packedByEmail": "string",      "stationName": "string",      "startedAt": "2019-08-24T14:15:22Z",      "completedAt": "2019-08-24T14:15:22Z",      "itemsTotal": 0,      "itemsVerified": 0    },    "shipment": {      "shipmentId": "string",      "trackingNumber": "string",      "carrierService": "string",      "status": "string",      "shipDate": "2019-08-24T14:15:22Z",      "voidedAt": "2019-08-24T14:15:22Z"    },    "currentTote": {      "barcode": "string",      "name": "string"    }  }}
GET
/api/orders/{id}/notes

Authorization

oauth2 orders:read
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:read

Path Parameters

id*string

Order id

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/api/orders/string/notes"
{  "success": true,  "data": [    {      "id": "string",      "clientId": "string",      "orderId": "string",      "body": "string",      "author": {        "id": "string",        "firstName": "string",        "lastName": "string",        "email": "string",        "role": "string"      },      "isEdited": true,      "createdAt": "2019-08-24T14:15:22Z",      "updatedAt": "2019-08-24T14:15:22Z"    }  ]}
POST
/api/orders/{id}/notes

Append a note to the order's thread — the durable record of why the order was touched. Send an Idempotency-Key so a retry can't append a duplicate.

Authorization

oauth2 orders:write
AuthorizationBearer <token>

OAuth2 client-credentials grant.

In: header

Scope: orders:write

Path Parameters

id*string

Order id

Header Parameters

Idempotency-Key?string

Optional client-supplied key that makes this write safe to retry. A replay of a completed key returns the original response; an in-flight duplicate gets 409. A key is bound to the operation — method, URL and request body — and to the caller — the credential and its token scopes; reusing it with any of those changed gets 422.

Lengthlength <= 255

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X POST "https://example.com/api/orders/string/notes" \  -H "Content-Type: application/json" \  -d '{    "body": "string"  }'
{  "success": true,  "data": {    "id": "string",    "clientId": "string",    "orderId": "string",    "body": "string",    "author": {      "id": "string",      "firstName": "string",      "lastName": "string",      "email": "string",      "role": "string"    },    "isEdited": true,    "createdAt": "2019-08-24T14:15:22Z",    "updatedAt": "2019-08-24T14:15:22Z"  }}