Payment Terms
Payment terms set how many days a customer or vendor has to pay (Net 30, Due on Receipt) and can carry an early-payment discount (2/10 Net 30). Use them as defaults on customers and vendors and record them on invoices and bills.
The Payment Terms page is switched off in the DayZero app for now and new businesses start with no terms, but these endpoints work. Load the standard set with Seed defaults.
All requests need Authorization: Bearer dz_… and x-business-id. GET needs read access, POST and PUT write access, DELETE delete access. Successful responses are wrapped as {"success": true, "data": …}; the examples below show data.
Create a payment term
POST /api/v1/payment-terms returns 201.
curl -X POST "https://api.ondayzero.com/api/v1/payment-terms" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{
"name": "2/10 Net 30",
"days_until_due": 30,
"discount_percent": 2.0,
"discount_days": 10
}'{
"id": "019a0c3e-7d2a-7c41-9a5e-2f6b1d8e4c10",
"business_id": "019a0b11-4e6f-7a20-8c3d-5b9e2a7f1d44",
"name": "2/10 Net 30",
"days_until_due": 30,
"discount_percent": 2.0,
"discount_days": 10,
"is_default": false,
"is_active": true,
"created_at": "2026-10-14T15:02:11Z",
"updated_at": "2026-10-14T15:02:11Z"
}| Field | Type | Description |
|---|---|---|
name |
string | Display name (required) |
days_until_due |
integer | Days after the issue date until payment is due (required, >= 0; 0 = due on receipt) |
discount_percent |
number | Early-payment discount, 0 to 100 (e.g. 2.0 for 2%). Planning only, see Early-payment discounts |
discount_days |
integer | Days within which the discount applies (>= 0) |
is_default |
boolean | Make this the business default term; clears the previous default (default false) |
List payment terms
curl "https://api.ondayzero.com/api/v1/payment-terms?active_only=true&limit=50" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"active_only defaults to true; pass false to include deactivated terms. Terms are sorted by days_until_due. The list is cursor-paginated: data holds items, has_next and next_cursor; pass next_cursor back as cursor for the next page (see Pagination).
GET /api/v1/payment-terms/{term_id} returns one term.
Get the default term
curl "https://api.ondayzero.com/api/v1/payment-terms/default" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"Returns 404 when no active term is the default.
Seed defaults
Loads the standard set when the business has no terms yet:
| Term | days_until_due |
Discount |
|---|---|---|
| Due on Receipt | 0 | — |
| Net 10 | 10 | — |
| Net 15 | 15 | — |
| Net 30 (default) | 30 | — |
| Net 45 | 45 | — |
| Net 60 | 60 | — |
| Net 90 | 90 | — |
| 2/10 Net 30 | 30 | 2% within 10 days |
curl -X POST "https://api.ondayzero.com/api/v1/payment-terms/seed-defaults" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"If the business already has any terms, active or not, nothing is created and the existing terms are returned, so the call is safe to repeat.
Update a payment term
PUT /api/v1/payment-terms/{term_id}. Every field is optional; send only what changes.
curl -X PUT "https://api.ondayzero.com/api/v1/payment-terms/{term_id}" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID" \
-H "Content-Type: application/json" \
-d '{"days_until_due": 45, "is_default": true}'name,days_until_due,discount_percent,discount_days,is_default,is_activeare accepted.nullforname,days_until_due,is_defaultoris_activeleaves the field as it is.nullfordiscount_percentordiscount_daysclears it."is_active": falseretires the term and also clears its default flag;truebrings it back.- New days only affect documents created afterwards; existing due dates don't move.
Deactivate a payment term
curl -X DELETE "https://api.ondayzero.com/api/v1/payment-terms/{term_id}" \
-H "Authorization: Bearer dz_your_token_here" \
-H "x-business-id: YOUR_BUSINESS_ID"The term is deactivated (is_active: false, is_default: false), not deleted. Customers, vendors and documents that reference it keep it; it drops out of active_only=true lists.
Terms on customers, vendors, invoices and bills
| Where | Field | Behaviour |
|---|---|---|
| Customer, vendor | default_payment_term_id |
Default term for their new documents. Must be a term of this business, otherwise 404. |
Invoice create / update (POST /api/v1/invoices, PUT /api/v1/invoices/{invoice_id}) |
payment_term_id |
The term the invoice was issued under. Recorded for reference; it does not set or move due_date. On update, null clears it. |
Bill create / update (POST /api/v1/bills, POST /api/v1/bills/received, PUT /api/v1/bills/{bill_id}) |
payment_term_id |
The term the vendor billed under. Recorded for reference; it does not set or move due_on. Editable on any bill that isn't canceled, including paid ones. On update, null clears it. |
| Purchase order | payment_term_id |
Defaults to the vendor's default term. |
A payment_term_id must belong to the business, otherwise the request returns 404. A deactivated term is still accepted, so a document keeps the term it was issued under. Invoice and bill responses return payment_term_id.
Send the due date yourself (due_date on invoices, due_on on bills). For example, to issue an invoice under Net 30 dated 2026-10-14:
{
"customer_id": "019a0b2c-1f3e-7b55-9d02-6c4a8e1b7f90",
"due_date": "2026-11-13",
"payment_term_id": "019a0c3e-7d2a-7c41-9a5e-2f6b1d8e4c11",
"line_items": [
{"variant_id": "custom", "description": "October retainer", "unit_price": 250000, "quantity": 1}
]
}Early-payment discounts
discount_percent and discount_days are planning information. A bill recorded under a discount term shows the saving in the Pay plan tab on Bills while the discount window is open and the bill has no payments or credits, and payment suggestions and the reorder cash planner can use it. DayZero never takes the discount off an invoice or bill total, or off what is charged or booked. Record the payment for the amount actually paid.
Errors
| Status | Code | When |
|---|---|---|
404 |
NOT_FOUND_001 |
The term doesn't exist or belongs to another business; no default term (/default); a payment_term_id or default_payment_term_id from another business |
400 |
GEN_002 |
Validation: missing name or days_until_due, days_until_due or discount_days below 0, discount_percent outside 0–100 |
401 / 403 |
— | Missing or invalid token, or the key lacks the permission for the method |