List All Purchase Orders
GET /purchase_orders
🚀 Paid plan only
Lists purchase orders. Rows are the SAME shape as Get Purchase Order, already carrying the nested supplier, destination warehouse, creator and the full line-item array - no per-row follow-up read is needed.
This endpoint is search-index backed and indexing is asynchronous, so a just-created or just-updated purchase order can be absent or stale here. Confirm a write with Get Purchase Order, which reads the database.
Pagination totals are returned in the X-Total-Count,
X-Total-Pages-Count, X-Page-Index and X-Per-Page response headers,
not in the body. Do not send pageable - it is not a supported
parameter here and errors.
Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Results per page. Default 25, silently capped at 100.
Example
25Page to show. Totals are returned in the X-Total-Count and X-Total-Pages-Count response headers.
Example
1Free-text search across supplier name and post code, purchase order number, reference number, and line-item variant title, SKU, UPC and supplier reference. Substring matching. Search-index backed, so a just-written purchase order can be missing here - read it back with Get Purchase Order instead.
Example
acmeLifecycle state, or a received-status aggregate. An unrecognised value is a 400. There is no default, so drafts are included unless you filter. not_received, partially_received, fully_received, past_due and all are FILTER-ONLY values and never appear in a response state.
Example
activeOnly purchase orders for this supplier.
Only purchase orders delivering to this warehouse.
Only ACTIVE purchase orders containing this variant (sellable) id.
Only purchase orders containing a line item with this UPC.
Exact match on the purchase order reference number.
Created on or after this date. A range where after > before is a 400.
Example
2026-01-01Created on or before this date (inclusive of that whole day).
Example
2026-01-31Created at or after this timestamp.
Updated at or after this timestamp.
Only purchase orders with an id greater than this.
Field to sort on. Only supplier_name, created_at, expected_date, estimated_delivery_days and sort_by_received_percent are honoured; any other value is IGNORED silently and the results come back created_at descending, which is also the default when this is omitted.
Sort direction. Only used alongside a recognised sort_by.
Header Parameters
Section titled “Header Parameters ”E.g. 123
Example
123Responses
Section titled “ Responses ”OK
object
object
Decimal serialized as a JSON string. Coerce before arithmetic. Defaults to 0. Set it explicitly for a purchase order in a currency other than the company’s: receiving multiplies the cost price by it.
object
Whole days from created_at to expected_date, recalculated on any save that changes either date. A value you send is kept only until expected_date next changes, so treat it as derived and drive it with expected_date.
The line items. This is the key - there is no line_items field on a purchase order.
object
Unit cost. Decimal serialized as a JSON string. Coerce before arithmetic.
Line item id. Pass it to the line-item sub-routes.
The SELLABLE id, the same id the sellables endpoints return. No translation is needed in either direction.
Units ordered.
Units received so far. Set indirectly by sending received_quantity as a delta, and never settable directly.
Always the purchase order’s supplier - a sent value is overwritten.
Decimal serialized as a JSON string. Coerce before arithmetic.
Decimal serialized as a JSON string. Coerce before arithmetic.
Decimal serialized as a JSON string. Coerce before arithmetic.
object
Decimal serialized as a JSON string. Coerce before arithmetic.
Decimal serialized as a JSON string. Coerce before arithmetic.
The same supplier shape as the purchase order’s own supplier.
object
object
object
object
object
object
object
object
Unique per company when present. A duplicate is a 400.
Decimal serialized as a JSON string. Coerce before arithmetic.
Only these three values are ever returned. The received-status values accepted by the list state filter are filter-only inputs.
Computed on read, never stored. Decimal serialized as a JSON string. Coerce before arithmetic.
object
The template used to render this supplier’s purchase order document, on a plan with customizable templates.
Reminder and report emails go here. Can be blank, and the send still reports success.
Write-only: there is no stored column, so List and Get always return null. A Create or Update response echoes the value sent in that same request.
Decimal serialized as a JSON string. Coerce before arithmetic.
Use this for the purchase order value, computed on read and never stored. Decimal serialized as a JSON string. Coerce before arithmetic.
Decimal serialized as a JSON string. Coerce before arithmetic.
Example
[ { "id": 491, "number": "PO-0000001", "reference_number": null, "state": "active", "supplier_id": 1748, "destination_warehouse_id": 1784, "user_id": 1923, "created_by_id": 1923, "updated_by_id": null, "created_at": "2026-05-28T21:34:51Z", "updated_at": "2026-05-28T21:34:51Z", "expected_date": "2026-06-04T00:00:00Z", "estimated_delivery_days": 7, "currency_code": "gbp", "currency_rate": "1.0", "note": null, "units_ordered": 10, "units_received": 0, "product_variants_count": 1, "received_product_variants_count": 0, "subtotal": "45.0", "total_tax": "9.0", "total_excluding_tax": "45.0", "total_including_tax": "54.0", "shipping_and_handling": "0.0", "supplier_report_format": null, "sent_at": null, "received_at": null, "supplier": { "id": 1748, "name": "Default supplier", "sales_contact_email": "buying@example.com", "currency_code": "gbp" }, "destination_warehouse": { "id": 1784, "name": "Main warehouse" }, "created_by": { "id": 1923, "login": "seller", "email": "seller@example.com" }, "purchase_order_product_variants": [ { "id": 1575, "purchase_order_id": 491, "product_variant_id": 1226617, "supplier_id": 1748, "quantity": 10, "received": 0, "received_at": null, "cost": "4.5", "tax_rate": "20.0", "total_amount_excluding_tax": "45.0", "total_amount_including_tax": "54.0", "shipped": null, "supplier_product_variant": { "id": 8811, "supplier_id": 1748, "product_variant_id": 1226617, "cost": "4.5", "title": "APPLE MAGIC MOUSE [TEST]", "product_variant": { "id": 1226617, "sku_code": "MOUSE-01", "full_title": "APPLE MAGIC MOUSE [TEST]" } } } ] }]Headers
Section titled “Headers ”The company’s plan does not include purchase orders, or the user lacks the manage_purchase_orders permission. Body is {"error_messages":[...]}. Checked before the body is read.