Orders to your suppliers, in purchase units. Idempotent with Idempotency-Key.
idintegerbilling_addressobjectbilling_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablecompanystringnullableThe supplier name as it stood on this order.
created_atstringnullableexpected_datestringnullablelinesarray of objectsnullableOn a single order and on writes; null on the list.
linesidintegercostnumbernullablePer purchase unit. Requires cost:read.
discount_ratenumbernullablePercent off this line. Requires cost:read.
expiration_datestringnullablelead_timeintegernullableIn days.
notesstringnullableproduct_codestringnullableproduct_idintegernullableproduct_namestringnullablequantitynumbernullableOrdered, in the purchase unit.
quantity_basenumbernullableOrdered, in the product's base unit.
supplier_partnostringnullableThe supplier's part number.
order_datestringnullablepurchase_order_nointegernullableUnique within your account.
received_datestringnullableshipping_addressobjectshipping_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablestatusstringNote CLOSED, where a sales order status uses CLOSE.
OPENSENTCONFIRMEDCLOSEDBACK_ORDERCANCELLEDRECEIVEDsubtotalnumbernullableSum of the lines after line discounts, before tax. Requires cost:read; null means redacted, not zero.
supplier_idintegernullablesupplier_referencestringnullableThe supplier's own reference for this order.
tax1booleannullableWhether tax 1 applies to this document. Requires cost:read; null means redacted, not false.
tax1_ratenumbernullableTax 1 percentage, e.g. 5.0 for 5%. Requires cost:read.
tax2booleannullableWhether tax 2 applies to this document. Requires cost:read; null means redacted, not false.
tax2_ratenumbernullableTax 2 percentage, e.g. 5.0 for 5%. Requires cost:read.
updated_atstringnullable/purchase-orderspurchasing:readIntent to buy: a purchase order never moves stock. Use search or the named filters, not both. Money fields require cost:read.
supplier_idintegernullablestatusarray of stringnullableRepeat the parameter to match any of several statuses.
OPENSENTCONFIRMEDCLOSEDBACK_ORDERCANCELLEDRECEIVEDorder_date_fromstringnullableorder_date_tostringnullablesearchstringnullableFree-text match.
sortstringnullableComma-separated field:direction pairs, e.g. id:desc. Sortable: created_at, expected_date, id, order_date, purchase_order_no, status, updated_at. id is always added last, so paging is stable.
limitintegerRows to return. Maximum 200.
offsetintegerRows to skip. Maximum 10000: to read further, narrow the filters or page with updated_since.
updated_sincestringnullableOnly rows changed after this instant, as an ISO 8601 timestamp; without an offset it is read as UTC. Tracks the record itself, not its child rows, and deletions are not reported, so reconcile by re-listing from time to time.
data, with pagination.curl "https://public-api.nutrasoft.ca/v1/purchase-orders?limit=50" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": [
{
"id": 123,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"created_at": "2026-09-10T14:30:00Z",
"expected_date": "2026-09-10",
"lines": null,
"order_date": "2026-09-10",
"purchase_order_no": 10,
"received_date": "2026-09-10",
"shipping_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"status": "OPEN",
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"updated_at": "2026-09-10T14:30:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
},
"order": "id:asc"
}/purchase-orders/{purchase_order_id}purchasing:readpurchase_order_idintegerrequiredThe order's id.
data.curl "https://public-api.nutrasoft.ca/v1/purchase-orders/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"created_at": "2026-09-10T14:30:00Z",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"lead_time": 10,
"notes": "string",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"order_date": "2026-09-10",
"purchase_order_no": 10,
"received_date": "2026-09-10",
"shipping_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"status": "OPEN",
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"updated_at": "2026-09-10T14:30:00Z"
}
}/purchase-orderspurchasing:write· idempotent with Idempotency-KeyRaises an OPEN order: no stock moves and no cost changes. The vendor block and ship-to are copied from the supplier, and the subtotal is computed from the lines.
Idempotent on Idempotency-Key: a retry with the same key returns the order the first call created, with status 200. Reusing a key with a different body is a 409.
Refused with 409 when your account blocks unapproved suppliers and this one is suspended or rejected.
Idempotency-KeystringnullableYour own unique string for this order, up to 200 characters. Reusing it returns the order it created the first time.
linesarray of objectsrequiredFrom 1 to 200 lines.
linesproduct_idintegerrequiredA product in your account.
quantitynumberrequiredIn the product's purchase unit.
costnumbernullablePer purchase unit.
discount_ratenumbernullablePercent off this line, 0 to 100.
expiration_datestringnullablelead_timeintegernullableIn days.
notesstringnullablesupplier_partnostringnullableThe supplier's part number.
supplier_idintegerrequiredexpected_datestringnullablenotesstringnullableorder_datestringnullablesupplier_referencestringnullableThe supplier's own reference for this order.
data.curl -X POST "https://public-api.nutrasoft.ca/v1/purchase-orders" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c6a52-8d0e-4b7a-9c2f-5e8d1b4a7c90" \
-d '{
"lines": [
{
"product_id": 123,
"quantity": 12.5
}
],
"supplier_id": 123
}'{
"data": {
"id": 123,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"created_at": "2026-09-10T14:30:00Z",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"lead_time": 10,
"notes": "string",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"order_date": "2026-09-10",
"purchase_order_no": 10,
"received_date": "2026-09-10",
"shipping_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"status": "OPEN",
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"updated_at": "2026-09-10T14:30:00Z"
}
}/purchase-orders/{purchase_order_id}purchasing:writeOnly OPEN and SENT orders are editable; anything else is a 409. Omitted fields are left unchanged.
Sending lines replaces every line and recomputes the subtotal. Changing supplier_id copies the vendor block and ship-to from the new supplier. Not idempotent.
purchase_order_idintegerrequiredThe order's id.
expected_datestringnullablelinesarray of objectsnullableThe complete set of lines, from 1 to 200. They replace every line on the order.
linesproduct_idintegerrequiredA product in your account.
quantitynumberrequiredIn the product's purchase unit.
costnumbernullablePer purchase unit.
discount_ratenumbernullablePercent off this line, 0 to 100.
expiration_datestringnullablelead_timeintegernullableIn days.
notesstringnullablesupplier_partnostringnullableThe supplier's part number.
notesstringnullableorder_datestringnullablesupplier_idintegernullablesupplier_referencestringnullabledata.curl -X PATCH "https://public-api.nutrasoft.ca/v1/purchase-orders/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"expected_date": "2026-09-10"
}'{
"data": {
"id": 123,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"created_at": "2026-09-10T14:30:00Z",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"lead_time": 10,
"notes": "string",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"order_date": "2026-09-10",
"purchase_order_no": 10,
"received_date": "2026-09-10",
"shipping_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"status": "OPEN",
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"updated_at": "2026-09-10T14:30:00Z"
}
}/purchase-orders/{purchase_order_id}/statuspurchasing:writeOPEN may move to SENT, CONFIRMED or CANCELLED; SENT to CONFIRMED or CANCELLED; CONFIRMED to CANCELLED; RECEIVED and BACK_ORDER to CLOSED. Any other move is a 409, and a closed order is final.
purchase_order_idintegerrequiredThe order's id.
statusstringrequiredRECEIVED and BACK_ORDER are written by receiving in NutraSoft and cannot be set here.
SENTCONFIRMEDCANCELLEDCLOSEDdata.curl -X POST "https://public-api.nutrasoft.ca/v1/purchase-orders/123/status" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "SENT"
}'{
"data": {
"id": 123,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"created_at": "2026-09-10T14:30:00Z",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"lead_time": 10,
"notes": "string",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"order_date": "2026-09-10",
"purchase_order_no": 10,
"received_date": "2026-09-10",
"shipping_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"status": "OPEN",
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"updated_at": "2026-09-10T14:30:00Z"
}
}