Supplier invoices. Creating one receives stock: each line creates or tops up a lot.
idintegerbill_datestringnullablebill_nointegernullablebilling_addressobjectbilling_addresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablecancelled_atstringnullablecompanystringnullableis_cancelledbooleanlinesarray of objectsnullableOn a single bill and on writes; null on the list.
linesidintegercostnumbernullablePer purchase unit. Requires cost:read.
discount_ratenumbernullablePercent off this line. Requires cost:read.
expiration_datestringnullableproduct_codestringnullableproduct_idintegernullableproduct_namestringnullablequantitynumbernullableReceived, in the purchase unit.
quantity_basenumbernullableReceived, in the product's base unit.
supplier_partnostringnullablepaid_amountnumbernullableRequires cost:read.
purchase_order_idintegernullablesubtotalnumbernullableSum of the lines after line discounts, before tax. Requires cost:read; null means redacted, not zero.
supplier_idintegernullablesupplier_referencestringnullabletax1booleannullableWhether 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.
/billspurchasing:readWhat suppliers invoiced. Use search or the named filters, not both. Money fields require cost:read.
supplier_idintegernullablepurchase_order_idintegernullablebill_date_fromstringnullablebill_date_tostringnullablesearchstringnullableFree-text match.
sortstringnullableComma-separated field:direction pairs, e.g. id:desc. Sortable: bill_date, bill_no, id. 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.
data, with pagination.curl "https://public-api.nutrasoft.ca/v1/bills?limit=50" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": [
{
"id": 123,
"bill_date": "2026-09-10",
"bill_no": 10,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"cancelled_at": "2026-09-10",
"company": "Example Foods Inc.",
"is_cancelled": false,
"lines": null,
"paid_amount": 12.5,
"purchase_order_id": 123,
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
},
"order": "id:asc"
}/bills/{bill_id}purchasing:readbill_idintegerrequiredThe bill's id.
data.curl "https://public-api.nutrasoft.ca/v1/bills/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"bill_date": "2026-09-10",
"bill_no": 10,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"cancelled_at": "2026-09-10",
"company": "Example Foods Inc.",
"is_cancelled": false,
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"paid_amount": 12.5,
"purchase_order_id": 123,
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5
}
}/billspurchasing:write· idempotent with Idempotency-KeyReceives stock. Each line creates a lot, or tops up the lot with that number for that product at that location, and writes one PURCHASE_ENTRY stock movement. Unless your account costs manually, product costs are recalculated. quantity and cost are in the purchase unit; lots are in base units.
Idempotent on Idempotency-Key: a retry with the same key returns the bill the first call created, with status 200, and receives nothing twice. Reusing a key with a different body is a 409.
A lot number that exists for the product and location with a different expiry is a 409; with the same expiry the lot is topped up.
Idempotency-KeystringnullableYour own unique string for this bill, up to 200 characters. Reusing it returns the bill it created the first time.
bill_datestringrequiredThe date on the supplier's invoice.
linesarray of objectsrequiredAt least 1 line and at most 1000, for at most 200 different products. Each line receives stock.
lineslot_numberstringrequiredThe supplier's lot code.
product_idintegerrequiredA product in your account.
quantitynumberrequiredIn the product's purchase unit.
costnumbernullablePer purchase unit.
discount_ratenumbernullableexpiration_datestringnullableRefused with 409 when the lot exists with a different expiry.
location_idintegernullableWhere the stock lands: one of your warehouses or a location in one.
supplier_partnostringnullablesupplier_idintegerrequirednotesstringnullablepurchase_order_idintegernullableLinks the bill to one of your orders, without changing its status.
supplier_referencestringnullableUsually the supplier's own invoice number.
data.curl -X POST "https://public-api.nutrasoft.ca/v1/bills" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 3f1c6a52-8d0e-4b7a-9c2f-5e8d1b4a7c90" \
-d '{
"bill_date": "2026-09-10",
"lines": [
{
"lot_number": "LOT-2026-0142",
"product_id": 123,
"quantity": 12.5
}
],
"supplier_id": 123
}'{
"data": {
"id": 123,
"bill_date": "2026-09-10",
"bill_no": 10,
"billing_address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"cancelled_at": "2026-09-10",
"company": "Example Foods Inc.",
"is_cancelled": false,
"lines": [
{
"id": 123,
"cost": 12.5,
"discount_rate": 12.5,
"expiration_date": "2026-09-10T14:30:00Z",
"product_code": "SAMPLE-01",
"product_id": 123,
"product_name": "Sample name",
"quantity": 12.5,
"quantity_base": 12.5,
"supplier_partno": "string"
}
],
"paid_amount": 12.5,
"purchase_order_id": 123,
"subtotal": 12.5,
"supplier_id": 123,
"supplier_reference": "INV-58213",
"tax1": false,
"tax1_rate": 12.5,
"tax2": false,
"tax2_rate": 12.5
}
}