Skip to content

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.

  • form must hold the address fields first-name, last-name, address-field, apartment-field, city-field, zip-field and country-field, sent with their id and type: 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 type without id and the API gives them one (text-field-…, select-group-…). To keep a field — and its translations — when you replace a rule, send back the id a GET returned.
  • By type: select, checkbox-group and radio-group need options ([{label, value}], 1–100); header needs heading_type (h1–h6); textarea takes rows (1–100); groups take inline (true or false).
  • The upload of Net Terms also sends its settings. A store with Net Terms turned off gets nothing.

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.

The rule object
{
"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

Scope net-terms:readCost 10

List rules, newest first.

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.

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
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"

Create a rule

POST/api/v2/net-terms/rules

Scope net-terms:writeCost 11

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.

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 day specific_day of the month, specific_interval months after the order.
  • custom: Due custom_count custom_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: Due custom_count days 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.

dataRule

The new rule.

cURL
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"
}'

Get a rule

GET/api/v2/net-terms/rules/{id}

Scope net-terms:readCost 10

Get a rule.

idstringrequired

Rule id.

dataRule

The rule. An id that does not exist answers 404 RESOURCE_NOT_FOUND.

cURL
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"

Replace a rule

PUT/api/v2/net-terms/rules/{id}

Scope net-terms:writeCost 11

Replace a rule; optional fields left out go back to their defaults.

idstringrequired

Rule id.

The same fields as Create a rule.

dataRule

The rule after the change.

cURL
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"
}'

Delete a rule

DEL/api/v2/net-terms/rules/{id}

Scope net-terms:writeCost 11

Delete a rule.

idstringrequired

Rule id.

data.idstring

Id of the deleted rule.

data.deletedboolean

true.

cURL
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"

Create or replace rules in bulk

POST/api/v2/net-terms/rules/bulk-upsert

Scope net-terms:writeCost ceil(10 + 0.4 × rules)

Create or replace up to 250 rules; each one succeeds or fails on its own.

See Bulk & idempotency.

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.

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
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"
}
]
}'

Delete rules in bulk

POST/api/v2/net-terms/rules/bulk-delete

Scope net-terms:writeCost ceil(10 + 0.4 × rules)

Delete up to 250 rules; an unknown id fails on its own.

See Bulk & idempotency.

ids[string]required

1–250 rule ids.

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
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"
]
}'

Upload rules to the storefront

POST/api/v2/net-terms/rules/upload

Scope net-terms:writeCost 20

Upload the rules to the storefront, as the app does.

The body is empty. See Upload.

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
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"