Get Purchase Order
GET /purchase_orders/{id}
🚀 Paid plan only
Reads one purchase order as JSON. The response is identical in shape to a
List row, including the nested supplier, destination_warehouse,
created_by and the full purchase_order_product_variants array, so a
list does not need a follow-up read per row. There is no line_items
field on a purchase order.
Unlike List, this reads the database rather than the search index, so it
is the way to confirm a write. .json may be appended to the path
explicitly; the unsuffixed path returns the same JSON.
The rendered document formats are separate operations: Download Purchase
Order PDF and Download Purchase Order CSV. There is NO printing job for a
purchase order - POST /api/v2/printing_jobs rejects
entity_type: purchase_order, and no printing-job template renders one.
Decimal fields (cost, tax_rate, subtotal, total_tax,
total_excluding_tax, total_including_tax, shipping_and_handling,
currency_rate) are serialized as JSON strings.
Parameters
Section titled “ Parameters ”Path Parameters
Section titled “Path Parameters ”Purchase order ID.
Example
491Header Parameters
Section titled “Header Parameters ”E.g. 123
Example
123Responses
Section titled “ Responses ”OK. One purchase order, in the same shape as a List row - the two share one serializer.
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.
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 record is looked up.
Purchase order not found (or belongs to another company).