Public API v2: Net Terms
Pay-later terms at checkout: who can use them, when payment is due, order limits and the checkout form.
| Scopes | net-terms:read, net-terms:write |
| Plan | Plans with Net Terms; otherwise 403 |
| Takes effect | Saved in the app; reaches the storefront at the next upload. |
Every response has the same envelope (success, status, data, meta; see Responses). Returns below describes data. The examples are real calls; the rules were created disabled.
Good to know
Section titled “Good to know”formmust hold the address fieldsfirst-name,last-name,address-field,apartment-field,city-field,zip-fieldandcountry-field, sent with their id andtype: text. Optional fields known by id:phone-field,company-field,po-number-field,eu-vat-field,uk-vat-field,ein-vat-field,abn-vat-field,gst-vat-field.- Other fields: send
typewithoutidand the API gives them one (text-field-…,select-group-…). To keep a field — and its translations — when you replace a rule, send back theida GET returned. - By type:
select,checkbox-groupandradio-groupneedoptions([{label, value}], 1–100);headerneedsheading_type(h1–h6);textareatakesrows(1–100); groups takeinline(true or false). - The upload of Net Terms also sends its settings. A store with Net Terms turned off gets nothing.
Net Terms API endpoints
- GET/api/v2/net-terms/rules# List rules
- POST/api/v2/net-terms/rules# Create a rule
- GET/api/v2/net-terms/rules/{id}# Get a rule
- PUT/api/v2/net-terms/rules/{id}# Replace a rule
- DEL/api/v2/net-terms/rules/{id}# Delete a rule
- POST/api/v2/net-terms/rules/bulk-upsert# Create or replace rules in bulk
- POST/api/v2/net-terms/rules/bulk-delete# Delete rules in bulk
- POST/api/v2/net-terms/rules/upload# Upload rules to the storefront
The rule object
Section titled “The rule object”What every read returns. Lists come back as [] when empty, never null.
idstringread-only
Rule id.
namestring
Rule name.
priorityinteger
Lower number wins; see Rules.
statusenum
disabled rules are kept but not applied. One of disabled, enabled.
CustomersCommon object
Who gets the rule.
Show fields
apply_toenum
all everyone, logged in or not · logged_in any logged-in customer · non_logged_in visitors who are not logged in · customer_ids the listed customers · customer_tags customers with any of the tags · company_location the listed B2B company locations. Accepted here: logged_in, customer_ids, customer_tags.
customer_ids[string]
Used when apply_to is customer_ids; required and not empty then.
customer_tags[string]
Used when apply_to is customer_tags; required and not empty then.
ProductsCommon object
Which products the rule covers.
Show fields
product_condition_typeenum
all every product · by_ids · by_collections · by_tags · by_variants. Accepted here: all, by_ids, by_collections, by_tags.
product_ids[string]
Used when the type is by_ids; required and not empty then.
product_collections[string]
Used when the type is by_collections; required and not empty then.
product_tags[string]
Used when the type is by_tags; required and not empty then.
limit_typeenum
One of min_amount, max_amount, min_quantity, max_quantity.
limit_valuestring
order_tags[string]
due_typeenum
One of on_receipt, on_fulfillment, net_7, net_15, net_30, net_60, net_90, on_specific_day, custom, end_of_month, net_end_of_month, end_of_next_month.
due_settingsobject
Show fields
specific_dayinteger
specific_intervalinteger
custom_countinteger
custom_intervalenum
One of days, weeks, months.
form[object]
Show fields
idstring
typestring
labelstring
created_atstring or nullread-only
UTC, ending in Z.
updated_atstring or nullread-only
UTC, ending in Z.
{ "id": "99", "name": "Net 30 for wholesale", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_ids": [], "customer_tags": [ "wholesale" ], "product_condition_type": "all", "product_ids": [], "product_collections": [], "product_tags": [], "limit_type": "min_amount", "limit_value": "0.00", "order_tags": [], "due_type": "net_30", "due_settings": { "specific_day": 1, "specific_interval": 1, "custom_count": 1, "custom_interval": "days" }, "form": [ { "id": "first-name", "type": "text", "label": "First name", "required": false, "help_text": "", "placeholder": "" }, { "id": "last-name", "type": "text", "label": "Last name", "required": true, "help_text": "", "placeholder": "" }, { "id": "address-field", "type": "text", "label": "Address", "required": true, "help_text": "", "placeholder": "" }, { "id": "apartment-field", "type": "text", "label": "Apartment, suite, etc.", "required": false, "help_text": "", "placeholder": "" }, { "id": "city-field", "type": "text", "label": "City", "required": true, "help_text": "", "placeholder": "" }, { "id": "zip-field", "type": "text", "label": "Postal code", "required": true, "help_text": "", "placeholder": "" }, { "id": "country-field", "type": "text", "label": "Country", "required": true, "help_text": "", "pcc_label": "Personal Customs Code", "show_state": true, "placeholder": "", "state_label": "State", "pcc_placeholder": "", "state_help_text": "" } ], "created_at": "2026-10-21T09:34:36.000Z", "updated_at": "2026-10-21T09:34:36.000Z"}List rules
GET/api/v2/net-terms/rules
List rules, newest first.
Query parameters
Section titled “Query parameters”limitinteger
1–250, default 50. See Paging.
cursorstring
next_cursor or prev_cursor of the last page; leave out for the first page. Keep the same filters on every page.
filter_statusenum
One of disabled, enabled.
filter_namestring
Part of the name, any case. 1–200 characters.
Returns
Section titled “Returns”data[Rule]
The rules of this page; [] when there are none.
meta.paginationobject
limit, next_cursor, prev_cursor and links to the next and previous pages.
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules?limit=2&filter_name=Net" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com"{ "success": true, "status": "success", "data": [ { "id": "99", "name": "Net 30 for wholesale", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_ids": [], "customer_tags": [ "wholesale" ], "product_condition_type": "all", "product_ids": [], "product_collections": [], "product_tags": [], "limit_type": "min_amount", "limit_value": "0.00", "order_tags": [], "due_type": "net_30", "due_settings": { "specific_day": 1, "specific_interval": 1, "custom_count": 1, "custom_interval": "days" }, "form": [ { "id": "first-name", "type": "text", "label": "First name", "required": false, "help_text": "", "placeholder": "" }, { "id": "last-name", "type": "text", "label": "Last name", "required": true, "help_text": "", "placeholder": "" }, { "id": "address-field", "type": "text", "label": "Address", "required": true, "help_text": "", "placeholder": "" }, { "id": "apartment-field", "type": "text", "label": "Apartment, suite, etc.", "required": false, "help_text": "", "placeholder": "" }, { "id": "city-field", "type": "text", "label": "City", "required": true, "help_text": "", "placeholder": "" }, { "id": "zip-field", "type": "text", "label": "Postal code", "required": true, "help_text": "", "placeholder": "" }, { "id": "country-field", "type": "text", "label": "Country", "required": true, "help_text": "", "pcc_label": "Personal Customs Code", "show_state": true, "placeholder": "", "state_label": "State", "pcc_placeholder": "", "state_help_text": "" } ], "created_at": "2026-10-21T09:34:36.000Z", "updated_at": "2026-10-21T09:34:36.000Z" } ], "meta": { "timestamp": "2026-10-21T09:34:39.492Z", "version": "v2", "request_id": "7a2ab96a-8ee2-43e1-82a6-5a743ccc3408", "rate_limit": { "cost": 10, "limit": 600, "remaining": 590, "restore_rate": 10 }, "pagination": { "limit": 2, "next_cursor": null, "prev_cursor": null, "links": { "self": "/api/v2/net-terms/rules?limit=2&filter_name=Net", "next": null, "prev": null } } }}Create a rule
POST/api/v2/net-terms/rules
Create a rule.
The body of POST /rules, PUT /rules/{id} and each element of bulk-upsert (add id to replace a rule). PUT replaces the whole rule: optional fields left out go back to their defaults. Fields not listed here are refused with 422.
Arguments
Section titled “Arguments”namestringrequired
Rule name. 1–200 characters.
priorityintegerrequired
Lower number wins; see Rules. 0–99.
statusenumrequired
disabled rules are kept but not applied. One of disabled, enabled.
CustomersCommon objectrequired
Who gets the rule.
Show fields
apply_toenum
all everyone, logged in or not · logged_in any logged-in customer · non_logged_in visitors who are not logged in · customer_ids the listed customers · customer_tags customers with any of the tags · company_location the listed B2B company locations. Accepted here: logged_in, customer_ids, customer_tags.
customer_ids[string]
Used when apply_to is customer_ids; required and not empty then.
customer_tags[string]
Used when apply_to is customer_tags; required and not empty then.
ProductsCommon objectrequired
Which products the rule covers.
Show fields
product_condition_typeenum
all every product · by_ids · by_collections · by_tags · by_variants. Accepted here: all, by_ids, by_collections, by_tags.
product_ids[string]
Used when the type is by_ids; required and not empty then.
product_collections[string]
Used when the type is by_collections; required and not empty then.
product_tags[string]
Used when the type is by_tags; required and not empty then.
limit_typeenum
Default "min_amount".
min_amount,max_amount,min_quantity,max_quantity: Order limit for paying on terms;"0"with a minimum is no limit.
limit_valuestring
A quantity, or an amount in the shop currency; "0" with a minimum is no limit. Decimal string, up to 2 decimals. Default "0".
order_tags[string]
Tags added to an order placed on these terms.
due_typeenumrequired
on_receipt,on_fulfillment: Due when the order is received, or when it is fulfilled.net_7,net_15,net_30,net_60,net_90: Due 7, 15, 30, 60 or 90 days after the order.on_specific_day: Due on dayspecific_dayof the month,specific_intervalmonths after the order.custom: Duecustom_countcustom_interval(days, weeks or months) after the order.end_of_month,end_of_next_month: Due at the end of this month, or of next month.net_end_of_month: Duecustom_countdays after the end of the month.
due_settingsobject
Required by the due types that take a setting.
Show fields
specific_dayinteger
Day of the month, on_specific_day. 1–31.
specific_intervalinteger
Months after the order, on_specific_day. 1–12.
custom_countinteger
custom (in custom_interval) or net_end_of_month (days). 1–366.
custom_intervalenum
custom. One of days, weeks, months.
form[object]
The checkout form; left out, the address fields the app starts every rule with. 7–100 items.
Show fields
idstring
An address field (first-name … country-field) or a fixed field (phone-field, company-field, po-number-field, *-vat-field) by its id. Left out on any other field: the server makes one, as the app does. Send back the id a GET returned to keep that field and its translations. 0–100 characters.
typeenumrequired
text for the address and fixed fields. One of text, textarea, number, date, file, header, select, checkbox-group, radio-group.
labelstringrequired
1–1,000 characters.
options[object]
Required for select, checkbox-group and radio-group. 1–100 items.
Show fields
labelstringrequired
1–1,000 characters.
valuestringrequired
1–1,000 characters.
heading_typeenum
Required for header. One of h1, h2, h3, h4, h5, h6.
rowsinteger
Lines of a textarea. 1–100.
inlineboolean
Options side by side, checkbox-group and radio-group.
Returns
Section titled “Returns”dataRule
The new rule.
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com" \ -H "Content-Type: application/json" \ -d '{ "name": "Net 30 for wholesale", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_tags": [ "wholesale" ], "product_condition_type": "all", "due_type": "net_30"}'{ "success": true, "status": "success", "data": { "id": "99", "name": "Net 30 for wholesale", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_ids": [], "customer_tags": [ "wholesale" ], "product_condition_type": "all", "product_ids": [], "product_collections": [], "product_tags": [], "limit_type": "min_amount", "limit_value": "0.00", "order_tags": [], "due_type": "net_30", "due_settings": { "specific_day": 1, "specific_interval": 1, "custom_count": 1, "custom_interval": "days" }, "form": [ { "id": "first-name", "type": "text", "label": "First name", "required": false, "help_text": "", "placeholder": "" }, { "id": "last-name", "type": "text", "label": "Last name", "required": true, "help_text": "", "placeholder": "" }, { "id": "address-field", "type": "text", "label": "Address", "required": true, "help_text": "", "placeholder": "" }, { "id": "apartment-field", "type": "text", "label": "Apartment, suite, etc.", "required": false, "help_text": "", "placeholder": "" }, { "id": "city-field", "type": "text", "label": "City", "required": true, "help_text": "", "placeholder": "" }, { "id": "zip-field", "type": "text", "label": "Postal code", "required": true, "help_text": "", "placeholder": "" }, { "id": "country-field", "type": "text", "label": "Country", "required": true, "help_text": "", "pcc_label": "Personal Customs Code", "show_state": true, "placeholder": "", "state_label": "State", "pcc_placeholder": "", "state_help_text": "" } ], "created_at": "2026-10-21T09:34:36.000Z", "updated_at": "2026-10-21T09:34:36.000Z" }, "meta": { "timestamp": "2026-10-21T09:34:36.877Z", "version": "v2", "request_id": "6cc08d29-db41-4c0b-9ba8-e05ea1b54ac7", "rate_limit": { "cost": 11, "limit": 600, "remaining": 589, "restore_rate": 10 } }}Get a rule
GET/api/v2/net-terms/rules/{id}
Get a rule.
Path parameters
Section titled “Path parameters”idstringrequired
Rule id.
Returns
Section titled “Returns”dataRule
The rule. An id that does not exist answers 404 RESOURCE_NOT_FOUND.
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/99" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com"{ "success": true, "status": "success", "data": { "id": "99", "name": "Net 30 for wholesale", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_ids": [], "customer_tags": [ "wholesale" ], "product_condition_type": "all", "product_ids": [], "product_collections": [], "product_tags": [], "limit_type": "min_amount", "limit_value": "0.00", "order_tags": [], "due_type": "net_30", "due_settings": { "specific_day": 1, "specific_interval": 1, "custom_count": 1, "custom_interval": "days" }, "form": [ { "id": "first-name", "type": "text", "label": "First name", "required": false, "help_text": "", "placeholder": "" }, { "id": "last-name", "type": "text", "label": "Last name", "required": true, "help_text": "", "placeholder": "" }, { "id": "address-field", "type": "text", "label": "Address", "required": true, "help_text": "", "placeholder": "" }, { "id": "apartment-field", "type": "text", "label": "Apartment, suite, etc.", "required": false, "help_text": "", "placeholder": "" }, { "id": "city-field", "type": "text", "label": "City", "required": true, "help_text": "", "placeholder": "" }, { "id": "zip-field", "type": "text", "label": "Postal code", "required": true, "help_text": "", "placeholder": "" }, { "id": "country-field", "type": "text", "label": "Country", "required": true, "help_text": "", "pcc_label": "Personal Customs Code", "show_state": true, "placeholder": "", "state_label": "State", "pcc_placeholder": "", "state_help_text": "" } ], "created_at": "2026-10-21T09:34:36.000Z", "updated_at": "2026-10-21T09:34:36.000Z" }, "meta": { "timestamp": "2026-10-21T09:34:38.183Z", "version": "v2", "request_id": "223f3821-8435-458f-8ac4-ea1485c27a89", "rate_limit": { "cost": 10, "limit": 600, "remaining": 590, "restore_rate": 10 } }}Replace a rule
PUT/api/v2/net-terms/rules/{id}
Replace a rule; optional fields left out go back to their defaults.
Path parameters
Section titled “Path parameters”idstringrequired
Rule id.
Arguments
Section titled “Arguments”The same fields as Create a rule.
Returns
Section titled “Returns”dataRule
The rule after the change.
curl -X PUT "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/99" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com" \ -H "Content-Type: application/json" \ -d '{ "name": "Net 30 for wholesale (updated)", "priority": 2, "status": "disabled", "apply_to": "customer_tags", "customer_tags": [ "wholesale" ], "product_condition_type": "all", "due_type": "net_30"}'{ "success": true, "status": "success", "data": { "id": "99", "name": "Net 30 for wholesale (updated)", "priority": 2, "status": "disabled", "apply_to": "customer_tags", "customer_ids": [], "customer_tags": [ "wholesale" ], "product_condition_type": "all", "product_ids": [], "product_collections": [], "product_tags": [], "limit_type": "min_amount", "limit_value": "0.00", "order_tags": [], "due_type": "net_30", "due_settings": { "specific_day": 1, "specific_interval": 1, "custom_count": 1, "custom_interval": "days" }, "form": [ { "id": "first-name", "type": "text", "label": "First name", "required": false, "help_text": "", "placeholder": "" }, { "id": "last-name", "type": "text", "label": "Last name", "required": true, "help_text": "", "placeholder": "" }, { "id": "address-field", "type": "text", "label": "Address", "required": true, "help_text": "", "placeholder": "" }, { "id": "apartment-field", "type": "text", "label": "Apartment, suite, etc.", "required": false, "help_text": "", "placeholder": "" }, { "id": "city-field", "type": "text", "label": "City", "required": true, "help_text": "", "placeholder": "" }, { "id": "zip-field", "type": "text", "label": "Postal code", "required": true, "help_text": "", "placeholder": "" }, { "id": "country-field", "type": "text", "label": "Country", "required": true, "help_text": "", "pcc_label": "Personal Customs Code", "show_state": true, "placeholder": "", "state_label": "State", "pcc_placeholder": "", "state_help_text": "" } ], "created_at": "2026-10-21T09:34:36.000Z", "updated_at": "2026-10-21T09:34:40.000Z" }, "meta": { "timestamp": "2026-10-21T09:34:40.810Z", "version": "v2", "request_id": "4bf990ae-4d91-4621-b101-3796469f7331", "rate_limit": { "cost": 11, "limit": 600, "remaining": 589, "restore_rate": 10 } }}Delete a rule
DEL/api/v2/net-terms/rules/{id}
Delete a rule.
Path parameters
Section titled “Path parameters”idstringrequired
Rule id.
Returns
Section titled “Returns”data.idstring
Id of the deleted rule.
data.deletedboolean
true.
curl -X DELETE "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/99" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com"{ "success": true, "status": "success", "data": { "id": "99", "deleted": true }, "meta": { "timestamp": "2026-10-21T09:34:44.763Z", "version": "v2", "request_id": "b6420776-27c2-4f9b-8f6f-5bbf4b5b7b20", "rate_limit": { "cost": 11, "limit": 600, "remaining": 589, "restore_rate": 10 } }}Create or replace rules in bulk
POST/api/v2/net-terms/rules/bulk-upsert
Create or replace up to 250 rules; each one succeeds or fails on its own.
See Bulk & idempotency.
Arguments
Section titled “Arguments”rules[object]required
1–250 rules, each with the fields of Create a rule.
Show fields
idstring
Set it to replace that rule, as Replace a rule does; leave it out to create one.
Returns
Section titled “Returns”data.results[object]
One entry per rule, in the order sent.
Show fields
indexinteger
Position of the rule in rules.
idstring
Rule id.
resultenum
created, updated or error.
errorobject
code and message, only when result is error.
data.summaryobject
total, succeeded, failed.
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/bulk-upsert" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com" \ -H "Content-Type: application/json" \ -d '{ "rules": [ { "name": "Net 30 for wholesale B", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_tags": [ "wholesale" ], "product_condition_type": "all", "due_type": "net_30" }, { "name": "Net 30 for wholesale (bulk)", "priority": 1, "status": "disabled", "apply_to": "customer_tags", "customer_tags": [ "wholesale" ], "product_condition_type": "all", "due_type": "net_30", "id": "99" } ]}'{ "success": true, "status": "success", "data": { "results": [ { "index": 0, "id": "100", "result": "created" }, { "index": 1, "id": "99", "result": "updated" } ], "summary": { "total": 2, "succeeded": 2, "failed": 0 } }, "meta": { "timestamp": "2026-10-21T09:34:42.139Z", "version": "v2", "request_id": "b7253f8e-b1a3-4945-b5ef-bff6d40adfce", "rate_limit": { "cost": 11, "limit": 600, "remaining": 589, "restore_rate": 10 } }}Delete rules in bulk
POST/api/v2/net-terms/rules/bulk-delete
Delete up to 250 rules; an unknown id fails on its own.
See Bulk & idempotency.
Arguments
Section titled “Arguments”ids[string]required
1–250 rule ids.
Returns
Section titled “Returns”data.results[object]
One entry per id: index, id, result (deleted or error) and error (code, message) when it failed.
data.summaryobject
total, succeeded, failed.
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/bulk-delete" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com" \ -H "Content-Type: application/json" \ -d '{ "ids": [ "100", "999999999" ]}'{ "success": true, "status": "success", "data": { "results": [ { "index": 0, "id": "100", "result": "deleted" }, { "index": 1, "id": "999999999", "result": "error", "error": { "code": "RESOURCE_NOT_FOUND", "message": "Resource not found" } } ], "summary": { "total": 2, "succeeded": 1, "failed": 1 } }, "meta": { "timestamp": "2026-10-21T09:34:43.450Z", "version": "v2", "request_id": "09845fc4-f922-4413-98ab-9e7db3e7b607", "rate_limit": { "cost": 11, "limit": 600, "remaining": 589, "restore_rate": 10 } }}Upload rules to the storefront
POST/api/v2/net-terms/rules/upload
Upload the rules to the storefront, as the app does.
The body is empty. See Upload.
Returns
Section titled “Returns”data.statusenum
uploaded, or partial_success when some rules did not reach the storefront.
data.skippedobject
capacity_exceeded, write_failed and rule_id_range; see Upload.
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/net-terms/rules/upload" \ -H "X-API-Key: $B2B_API_KEY" \ -H "X-Shop-Domain: your-store.myshopify.com"{ "success": true, "status": "success", "data": { "status": "uploaded", "skipped": { "capacity_exceeded": 0, "write_failed": 0, "rule_id_range": null } }, "meta": { "timestamp": "2026-10-21T09:34:46.663Z", "version": "v2", "request_id": "db2079e7-e134-412e-9943-e2c2b29a9e8c", "rate_limit": { "cost": 20, "limit": 600, "remaining": 580, "restore_rate": 10 } }}- Public API v2: Authentication & keysCreate Public API v2 keys with per-module permissions, send them with every request, and keep them safe.
- Public API v2: Auto TagRules that tag customers and orders, add notes or mark a customer tax exempt when an event happens.
- Public API v2: Buy X Get YBuy X Get Y offers: what the customer buys, what they get, and the discount on it.
- Public API v2: Bulk & idempotencyCreate, replace or delete up to 250 rules in one Public API v2 request, and retry POST requests safely.