Orders from your customers, with their lines in both the ordered unit and base units.
idintegerbilling_addressobjectbilling_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablecompanystringnullableThe customer name as it stood on this order.
created_atstringnullablecustomer_idintegernullablecustomer_purchase_order_nostringnullableThe customer's own purchase order reference. Free text.
expected_datestringnullablelinesarray of objectsnullableOn a single order and on writes; null on the list.
linesidintegerSend it back on PATCH to keep this line.
cancelled_qty_basenumbernullableWritten off, in the product's base unit.
discount_ratenumbernullablePercent off this line. Requires cost:read.
notesstringnullableorder_qtynumbernullableOrdered, in uom_type units.
order_qty_basenumbernullableOrdered, in the product's base unit.
pricenumbernullablePer uom_type unit. Requires cost:read.
product_codestringnullableproduct_idintegernullableproduct_namestringnullableshipped_qty_basenumbernullableShipped, in the product's base unit.
tax1booleannullableWhether tax 1 applies to this line. Requires cost:read.
tax2booleannullableWhether tax 2 applies to this line. Requires cost:read.
uom_typestringnullableThe unit order_qty and price are in.
INVENTORY_UNITPACKAGING_SIZEBASE_UOMorder_datestringnullablesales_order_nointegernullableThe order number, unique in your account.
ship_datestringnullableshipping_addressobjectshipping_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablestatusstringNote CLOSE, where a purchase order status uses CLOSED.
OPENBACK_ORDERPREPARINGCANCELLEDCLOSESHIPPEDsubtotalnumbernullableSum of the lines after line discounts, before tax. Requires cost:read; null means redacted, not zero.
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.
tracking_numberstringnullableupdated_atstringnullable/sales-orderssales:readMoney fields require cost:read. Addresses are those the order was raised with.
customer_idintegernullablestatusarray of stringnullableRepeat the parameter to match any of several statuses.
OPENBACK_ORDERPREPARINGCANCELLEDCLOSESHIPPEDorder_date_fromstringnullableorder_date_tostringnullablesearchstringnullableFree-text match.
sortstringnullableComma-separated field:direction pairs, e.g. id:desc. Sortable: created_at, expected_date, id, order_date, sales_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/sales-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",
"customer_id": 123,
"customer_purchase_order_no": "PO-10042",
"expected_date": "2026-09-10",
"lines": null,
"order_date": "2026-09-10",
"sales_order_no": 10,
"ship_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,
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"tracking_number": "string",
"updated_at": "2026-09-10T14:30:00Z"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
},
"order": "id:asc"
}/sales-orders/{sales_order_id}sales:readsales_order_idintegerrequiredThe order's id.
data.curl "https://public-api.nutrasoft.ca/v1/sales-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",
"customer_id": 123,
"customer_purchase_order_no": "PO-10042",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cancelled_qty_base": 12.5,
"discount_rate": 12.5,
"notes": "string",
"order_qty": 12.5,
"order_qty_base": 12.5,
"price": 12.5,
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"shipped_qty_base": 12.5,
"tax1": false,
"tax2": false,
"uom_type": "INVENTORY_UNIT"
}
],
"order_date": "2026-09-10",
"sales_order_no": 10,
"ship_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,
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"tracking_number": "string",
"updated_at": "2026-09-10T14:30:00Z"
}
}/sales-orderssales:writeCreates an OPEN order with its lines. Each order_qty is in its line's uom_type unit and is stored in base units, and the subtotal is computed from the lines. Not idempotent: a retry creates a second order.
customer_idintegerrequiredA customer in your account.
linesarray of objectsrequiredFrom 1 to 200 lines.
linesorder_qtynumberrequiredQuantity ordered, in uom_type units.
product_idintegerrequiredA product in your account.
discount_ratenumbernullablePercent off this line, 0 to 100.
idintegernullableOn PATCH, the id of an existing line to keep and update. Omit it to add a line.
notesstringnullablepricenumbernullablePer uom_type unit, stored as sent. No price list is applied.
tax1booleanWhether tax 1 applies to this line.
tax2booleanWhether tax 2 applies to this line.
uom_typestringThe unit order_qty and price are in: BASE_UOM is the base unit, INVENTORY_UNIT holds uom_qty * uom_base_conversion base units and PACKAGING_SIZE holds uom_base_conversion, per the product.
INVENTORY_UNITPACKAGING_SIZEBASE_UOMbilling_addressobjectnullableOmit it to use the customer's current address.
billing_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
customer_purchase_order_nostringnullableThe customer's own purchase order reference. Free text.
expected_datestringnullableorder_datestringnullableshipping_addressobjectnullableOmit it to use the billing address of this order.
shipping_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
tracking_numberstringnullabledata.curl -X POST "https://public-api.nutrasoft.ca/v1/sales-orders" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_id": 123,
"lines": [
{
"order_qty": 12.5,
"product_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",
"customer_id": 123,
"customer_purchase_order_no": "PO-10042",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cancelled_qty_base": 12.5,
"discount_rate": 12.5,
"notes": "string",
"order_qty": 12.5,
"order_qty_base": 12.5,
"price": 12.5,
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"shipped_qty_base": 12.5,
"tax1": false,
"tax2": false,
"uom_type": "INVENTORY_UNIT"
}
],
"order_date": "2026-09-10",
"sales_order_no": 10,
"ship_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,
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"tracking_number": "string",
"updated_at": "2026-09-10T14:30:00Z"
}
}/sales-orders/{sales_order_id}sales:writeOmitted fields are left unchanged. Sending lines replaces the order's lines and recomputes its subtotal.
Refused with 409 for an order that is not OPEN and for one placed and paid through the storefront.
sales_order_idintegerrequiredThe order's id.
billing_addressobjectnullablebilling_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
customer_idintegernullablecustomer_purchase_order_nostringnullableexpected_datestringnullablelinesarray of objectsnullableThe complete set of lines, from 1 to 200. A line sent with its id is updated, a line without one is added, and a line left out is deleted. The subtotal is recomputed. Round trips need cost:read, or the prices you send back are empty.
linesorder_qtynumberrequiredQuantity ordered, in uom_type units.
product_idintegerrequiredA product in your account.
discount_ratenumbernullablePercent off this line, 0 to 100.
idintegernullableOn PATCH, the id of an existing line to keep and update. Omit it to add a line.
notesstringnullablepricenumbernullablePer uom_type unit, stored as sent. No price list is applied.
tax1booleanWhether tax 1 applies to this line.
tax2booleanWhether tax 2 applies to this line.
uom_typestringThe unit order_qty and price are in: BASE_UOM is the base unit, INVENTORY_UNIT holds uom_qty * uom_base_conversion base units and PACKAGING_SIZE holds uom_base_conversion, per the product.
INVENTORY_UNITPACKAGING_SIZEBASE_UOMorder_datestringnullableshipping_addressobjectnullableshipping_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
tracking_numberstringnullabledata.curl -X PATCH "https://public-api.nutrasoft.ca/v1/sales-orders/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"customer_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",
"customer_id": 123,
"customer_purchase_order_no": "PO-10042",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cancelled_qty_base": 12.5,
"discount_rate": 12.5,
"notes": "string",
"order_qty": 12.5,
"order_qty_base": 12.5,
"price": 12.5,
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"shipped_qty_base": 12.5,
"tax1": false,
"tax2": false,
"uom_type": "INVENTORY_UNIT"
}
],
"order_date": "2026-09-10",
"sales_order_no": 10,
"ship_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,
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"tracking_number": "string",
"updated_at": "2026-09-10T14:30:00Z"
}
}/sales-orders/{sales_order_id}/cancelsales:writeCancels the order and writes off every unshipped quantity. An order that already shipped something becomes CLOSE rather than CANCELLED, so read status on the response.
Only OPEN, BACK_ORDER, PREPARING and SHIPPED orders can be cancelled; anything else is a 409. An order paid through the storefront is also a 409: cancel it in NutraSoft, where the payment can be refunded.
sales_order_idintegerrequiredThe order's id.
data.curl -X POST "https://public-api.nutrasoft.ca/v1/sales-orders/123/cancel" \
-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",
"customer_id": 123,
"customer_purchase_order_no": "PO-10042",
"expected_date": "2026-09-10",
"lines": [
{
"id": 123,
"cancelled_qty_base": 12.5,
"discount_rate": 12.5,
"notes": "string",
"order_qty": 12.5,
"order_qty_base": 12.5,
"price": 12.5,
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"shipped_qty_base": 12.5,
"tax1": false,
"tax2": false,
"uom_type": "INVENTORY_UNIT"
}
],
"order_date": "2026-09-10",
"sales_order_no": 10,
"ship_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,
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5,
"tracking_number": "string",
"updated_at": "2026-09-10T14:30:00Z"
}
}