The companies you sell to, with their shipping addresses.
idintegeractivebooleanaddressobjectaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablecompanystringnullablecontactstringnullablecreated_atstringnullablecustomer_codestringnullablecustomer_type_idintegernullableemailstringnullablephonestringnullableprice_list_idintegernullablesalesperson_idintegernullableshipping_method_idintegernullabletax_rate_idintegernullableterritory_idintegernullableupdated_atstringnullablewebsitestringnullableidintegeraddressobjectaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablestatestringnullablecontactstringnullablecustomer_idintegernullableis_defaultbooleanphonestringnullable/customerssales:readcustomer_codestringnullablePartial match.
companystringnullablePartial match.
emailstringnullablePartial match.
price_list_idintegernullablesearchstringnullableFree-text match.
sortstringnullableComma-separated field:direction pairs, e.g. id:desc. Sortable: company, created_at, customer_code, id, 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/customers?limit=50" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": [
{
"id": 123,
"active": true,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"contact": "Alex Martin",
"created_at": "2026-09-10T14:30:00Z",
"customer_code": "SAMPLE-01",
"customer_type_id": 123,
"email": "orders@example.com",
"phone": "+1-514-555-0100",
"price_list_id": 123,
"salesperson_id": 123,
"shipping_method_id": 123,
"tax_rate_id": 123,
"territory_id": 123,
"updated_at": "2026-09-10T14:30:00Z",
"website": "https://example.com"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
},
"order": "id:asc"
}/customers/{customer_id}sales:readcustomer_idintegerrequiredThe customer's id.
data.curl "https://public-api.nutrasoft.ca/v1/customers/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"active": true,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"contact": "Alex Martin",
"created_at": "2026-09-10T14:30:00Z",
"customer_code": "SAMPLE-01",
"customer_type_id": 123,
"email": "orders@example.com",
"phone": "+1-514-555-0100",
"price_list_id": 123,
"salesperson_id": 123,
"shipping_method_id": 123,
"tax_rate_id": 123,
"territory_id": 123,
"updated_at": "2026-09-10T14:30:00Z",
"website": "https://example.com"
}
}/customerssales:writecustomer_code is unique within your account; a duplicate is a 409. The price list, customer type, salesperson, territory, shipping method and tax rate must be your account's or shared. Add shipping addresses afterwards.
companystringrequiredThe customer name.
customer_codestringrequiredYour reference for this customer, unique within your account. Stored trimmed and upper-cased.
activebooleanaddressobjectnullableaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
contactstringnullablecustomer_type_idintegernullableemailstringnullablephonestringnullableprice_list_idintegernullablesalesperson_idintegernullableshipping_method_idintegernullabletag_idsarray of integernullableThe customer's complete set of tags, each a tag of your account. Replaces the current set; [] removes every tag.
tax_rate_idintegernullableterritory_idintegernullablewebsitestringnullabledata.curl -X POST "https://public-api.nutrasoft.ca/v1/customers" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"company": "Example Foods Inc.",
"customer_code": "SAMPLE-01"
}'{
"data": {
"id": 123,
"active": true,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"contact": "Alex Martin",
"created_at": "2026-09-10T14:30:00Z",
"customer_code": "SAMPLE-01",
"customer_type_id": 123,
"email": "orders@example.com",
"phone": "+1-514-555-0100",
"price_list_id": 123,
"salesperson_id": 123,
"shipping_method_id": 123,
"tax_rate_id": 123,
"territory_id": 123,
"updated_at": "2026-09-10T14:30:00Z",
"website": "https://example.com"
}
}/customers/{customer_id}sales:writeOmitted fields are left unchanged. address and tag_ids are replaced as a whole. Existing orders and invoices keep the address they were raised with.
customer_idintegerrequiredThe customer's id.
activebooleannullableaddressobjectnullableaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
companystringnullablecontactstringnullablecustomer_codestringnullablecustomer_type_idintegernullableemailstringnullablephonestringnullableprice_list_idintegernullablesalesperson_idintegernullableshipping_method_idintegernullabletag_idsarray of integernullableReplaces the current set of tags; [] removes every tag.
tax_rate_idintegernullableterritory_idintegernullablewebsitestringnullabledata.curl -X PATCH "https://public-api.nutrasoft.ca/v1/customers/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"active": true
}'{
"data": {
"id": 123,
"active": true,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"contact": "Alex Martin",
"created_at": "2026-09-10T14:30:00Z",
"customer_code": "SAMPLE-01",
"customer_type_id": 123,
"email": "orders@example.com",
"phone": "+1-514-555-0100",
"price_list_id": 123,
"salesperson_id": 123,
"shipping_method_id": 123,
"tax_rate_id": 123,
"territory_id": 123,
"updated_at": "2026-09-10T14:30:00Z",
"website": "https://example.com"
}
}/customers/{customer_id}sales:writeDeletes the customer and its attached documents. Refused with 409 while an order, an invoice or another record uses the customer: deactivate it instead with PATCH and active: false.
customer_idintegerrequiredThe customer's id.
data.curl -X DELETE "https://public-api.nutrasoft.ca/v1/customers/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"active": true,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"company": "Example Foods Inc.",
"contact": "Alex Martin",
"created_at": "2026-09-10T14:30:00Z",
"customer_code": "SAMPLE-01",
"customer_type_id": 123,
"email": "orders@example.com",
"phone": "+1-514-555-0100",
"price_list_id": 123,
"salesperson_id": 123,
"shipping_method_id": 123,
"tax_rate_id": 123,
"territory_id": 123,
"updated_at": "2026-09-10T14:30:00Z",
"website": "https://example.com"
}
}/customers/{customer_id}/shipping-addressessales:readNot paginated: every address of the customer is returned.
customer_idintegerrequiredThe customer's id.
data, with pagination.curl "https://public-api.nutrasoft.ca/v1/customers/123/shipping-addresses" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": [
{
"id": 123,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"contact": "Alex Martin",
"customer_id": 123,
"is_default": false,
"phone": "+1-514-555-0100"
}
],
"pagination": {
"limit": 50,
"offset": 0,
"total": 1,
"has_more": false
},
"order": "id:asc"
}/customers/{customer_id}/shipping-addresses/{shipping_address_id}sales:readcustomer_idintegerrequiredThe customer's id.
shipping_address_idintegerrequiredThe address's id.
data.curl "https://public-api.nutrasoft.ca/v1/customers/123/shipping-addresses/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"contact": "Alex Martin",
"customer_id": 123,
"is_default": false,
"phone": "+1-514-555-0100"
}
}/customers/{customer_id}/shipping-addressessales:writeA customer has at most one default address, so is_default: true is a 409 while another address holds it.
customer_idintegerrequiredThe customer's id.
addressobjectrequiredaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
contactstringnullableis_defaultbooleanWhether this is the customer's default ship-to. Refused with 409 while another address is the default.
phonestringnullabledata.curl -X POST "https://public-api.nutrasoft.ca/v1/customers/123/shipping-addresses" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": {
"city": "Montreal"
}
}'{
"data": {
"id": 123,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"contact": "Alex Martin",
"customer_id": 123,
"is_default": false,
"phone": "+1-514-555-0100"
}
}/customers/{customer_id}/shipping-addresses/{shipping_address_id}sales:writeOmitted fields are left unchanged. address is replaced as a whole.
customer_idintegerrequiredThe customer's id.
shipping_address_idintegerrequiredThe address's id.
addressobjectnullableaddresscitystringnullableline1stringnullableline2stringnullablepostal_codestringnullablePostal or ZIP code.
statestringnullableProvince or state. Free text.
contactstringnullableis_defaultbooleannullablephonestringnullabledata.curl -X PATCH "https://public-api.nutrasoft.ca/v1/customers/123/shipping-addresses/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contact": "Alex Martin"
}'{
"data": {
"id": 123,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"contact": "Alex Martin",
"customer_id": 123,
"is_default": false,
"phone": "+1-514-555-0100"
}
}/customers/{customer_id}/shipping-addresses/{shipping_address_id}sales:writeOrders already raised keep the address they were stamped with.
customer_idintegerrequiredThe customer's id.
shipping_address_idintegerrequiredThe address's id.
data.curl -X DELETE "https://public-api.nutrasoft.ca/v1/customers/123/shipping-addresses/123" \
-H "Authorization: Bearer $NUTRASOFT_API_KEY"{
"data": {
"id": 123,
"address": {
"city": "Montreal",
"line1": "123 Example Street",
"line2": "Suite 200",
"postal_code": "H4S 2C1",
"state": "QC"
},
"contact": "Alex Martin",
"customer_id": 123,
"is_default": false,
"phone": "+1-514-555-0100"
}
}