Orders API2026-11Preview
Fulfillment orders
The lines of an order that we pack into one parcel, with the box they go in and our check of each item.
- Most orders have one. An order whose items arrive far apart, or that you split, has more.
- A Shopify order arrives as Shopify's own fulfillment request. We accept it when every line maps to a SKU (Variants), and turn it down naming the lines that do not, so Shopify keeps it with you.
- An item that fails our check raises qc.issue and waits for your choice before it ships.
The Fulfillment order object
idstring- Starts fo_.
orderstring- The order it belongs to.
statusstring- open (waiting for its items), in_progress (being packed), on_hold, closed (shipped) or cancelled.
requestobject|null- For a Shopify order: Shopify's fulfillment order and our answer to it, accepted, or rejected with the store variants that are not mapped to a SKU.
holdobject|null- reason and note, while on hold.
packagingstring|null- The box or mailer it goes in.
lines[].qcobject- Our check: pending, passed or issue, with the photos and when.
shipmentstring|null- Set once it leaves.
{
"id": "fo_7k2m",
"order": "ord_3n7q",
"status": "in_progress",
"request": {
"channel": "shopify",
"external_id": "gid://shopify/FulfillmentOrder/6650012",
"status": "accepted",
"unmapped": []
},
"hold": null,
"packaging": "pkg_acme_mailer",
"lines": [
{
"line": "lin_9a2c",
"sku": "5187209554",
"quantity": 1,
"qc": {
"status": "passed",
"photos": [
"https://media.ninjabuy.com/qc/ord_3n7q/1.webp",
"https://media.ninjabuy.com/qc/ord_3n7q/2.webp"
],
"checked_at": "2026-11-02T03:20:11Z"
}
}
],
"shipment": null,
"created_at": "2026-11-01T09:14:03Z"
}List fulfillment orders
GET/v1/fulfillment_orders
Newest first. Filter by order or status.
Scopeorders:read
Query parameters
orderstring- Optional. An order id.
statusstring- Optional.
limit, cursor- Pagination
curl "https://www.ninjabuy.com/api/v1/fulfillment_orders?status=on_hold" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11"HTTP/2 200 OK
{
"data": [
{
"id": "fo_7k1x",
"order": "ord_3n6z",
"status": "on_hold",
"hold": { "reason": "combine" }
}
],
"has_more": false,
"cursor": null
}Retrieve a fulfillment order
GET/v1/fulfillment_orders/{id}
Its lines, our check of each, the packaging and the shipment.
Scopeorders:read
Path parameters
idstringrequired- The fulfillment order's id.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such fulfillment order on this account. |
curl "https://www.ninjabuy.com/api/v1/fulfillment_orders/fo_7k2m" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11"HTTP/2 200 OK
{
"id": "fo_7k2m",
"order": "ord_3n7q",
"status": "in_progress",
"request": {
"channel": "shopify",
"external_id": "gid://shopify/FulfillmentOrder/6650012",
"status": "accepted",
"unmapped": []
},
"hold": null,
"packaging": "pkg_acme_mailer",
"lines": [
{
"line": "lin_9a2c",
"sku": "5187209554",
"quantity": 1,
"qc": {
"status": "passed",
"photos": [
"https://media.ninjabuy.com/qc/ord_3n7q/1.webp",
"https://media.ninjabuy.com/qc/ord_3n7q/2.webp"
],
"checked_at": "2026-11-02T03:20:11Z"
}
}
],
"shipment": null,
"created_at": "2026-11-01T09:14:03Z"
}Hold
POST/v1/fulfillment_orders/{id}/hold
Keeps it from shipping until you release it: to wait for another order to the same customer, or for stock you are sending in. Free storage on your shelf still runs.
Scopeorders:write
Path parameters
idstringrequired- The fulfillment order's id.
Body
reasonstringrequired- combine, wait_for_stock or other.
notestring- Optional. A note for yourself, saved with the hold.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such fulfillment order on this account. |
| 409 | invalid-state | It is closed or cancelled. |
curl -X POST "https://www.ninjabuy.com/api/v1/fulfillment_orders/fo_7k2m/hold" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{ "reason": "combine" }'HTTP/2 200 OK
{
"id": "fo_7k2m",
"order": "ord_3n7q",
"status": "on_hold",
"request": {
"channel": "shopify",
"external_id": "gid://shopify/FulfillmentOrder/6650012",
"status": "accepted",
"unmapped": []
},
"hold": {
"reason": "combine",
"note": null,
"since": "2026-11-02T04:00:00Z"
},
"packaging": "pkg_acme_mailer",
"lines": [
{
"line": "lin_9a2c",
"sku": "5187209554",
"quantity": 1,
"qc": {
"status": "passed",
"photos": [
"https://media.ninjabuy.com/qc/ord_3n7q/1.webp",
"https://media.ninjabuy.com/qc/ord_3n7q/2.webp"
],
"checked_at": "2026-11-02T03:20:11Z"
}
}
],
"shipment": null,
"created_at": "2026-11-01T09:14:03Z"
}Release
POST/v1/fulfillment_orders/{id}/release
Lets a held fulfillment order go on.
Scopeorders:write
Path parameters
idstringrequired- The fulfillment order's id.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such fulfillment order on this account. |
| 409 | invalid-state | It is not on hold. |
curl -X POST "https://www.ninjabuy.com/api/v1/fulfillment_orders/fo_7k2m/release" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)"HTTP/2 200 OK
{
"id": "fo_7k2m",
"order": "ord_3n7q",
"status": "in_progress",
"request": {
"channel": "shopify",
"external_id": "gid://shopify/FulfillmentOrder/6650012",
"status": "accepted",
"unmapped": []
},
"hold": null,
"packaging": "pkg_acme_mailer",
"lines": [
{
"line": "lin_9a2c",
"sku": "5187209554",
"quantity": 1,
"qc": {
"status": "passed",
"photos": [
"https://media.ninjabuy.com/qc/ord_3n7q/1.webp",
"https://media.ninjabuy.com/qc/ord_3n7q/2.webp"
],
"checked_at": "2026-11-02T03:20:11Z"
}
}
],
"shipment": null,
"created_at": "2026-11-01T09:14:03Z"
}Cancel
POST/v1/fulfillment_orders/{id}/cancel
Cancels the parcel while nothing has been packed into it. Its items stay on your shelf, to ship later or with another order. To cancel the purchase too, cancel the order.
Scopeorders:write
Path parameters
idstringrequired- The fulfillment order's id.
Errors
| Status | Type | When |
|---|---|---|
| 404 | not-found | No such fulfillment order on this account. |
| 409 | invalid-state | It is packed or shipped. |
curl -X POST "https://www.ninjabuy.com/api/v1/fulfillment_orders/fo_7k2m/cancel" \
-H "Authorization: Bearer $NINJABUY_API_KEY" \
-H "NinjaBuy-Version: 2026-11" \
-H "Idempotency-Key: $(uuidgen)"HTTP/2 200 OK
{
"id": "fo_7k2m",
"order": "ord_3n7q",
"status": "cancelled",
"request": {
"channel": "shopify",
"external_id": "gid://shopify/FulfillmentOrder/6650012",
"status": "accepted",
"unmapped": []
},
"hold": null,
"packaging": "pkg_acme_mailer",
"lines": [
{
"line": "lin_9a2c",
"sku": "5187209554",
"quantity": 1,
"qc": {
"status": "passed",
"photos": [
"https://media.ninjabuy.com/qc/ord_3n7q/1.webp",
"https://media.ninjabuy.com/qc/ord_3n7q/2.webp"
],
"checked_at": "2026-11-02T03:20:11Z"
}
}
],
"shipment": null,
"created_at": "2026-11-01T09:14:03Z"
}