Quoter API – Quote Authoring & Contacts
Summary
This release adds full quote-authoring support to the Quoter API. Building on the existing read/list endpoints, you can now create a draft quote from a template, add sections and line items to it, patch individual line items, fetch a quote's full display payload, and publish a draft. It also introduces a new Contacts resource for creating, listing, fetching, and updating the contacts attached to quotes.
All changes are additive and backward compatible — no existing endpoints, fields, or schemas were changed or removed, and the regional server list is unchanged.
Changes
Quotes
-
POST
/v1/quotes- N/A → Available
- Type: addition
- Notes: Creates a new draft quote from a template. The contact is identified by
client_id+emailand reused when it already exists on the account. Sections and line items are added via their own endpoints after creation. The response body matchesGET /v1/quotes/{quote_id}.
-
GET
/v1/quotes/{quote_id}- N/A → Available
- Type: addition
- Notes: Retrieves a quote revision with the full display payload — sections, line items, totals, contacts, content blocks, custom fields, and taxes. Both primary and draft revisions are returned; callers inspect the
primaryanddraftflags to determine state.
-
POST
/v1/quotes/{quote_id}/publish- N/A → Available
- Type: addition
- Notes: Transitions a draft quote into the published state. Runs strict validation, assigns a
quote_number, and resolvesexpired_atif it was left unset. The response body matchesGET /v1/quotes/{quote_id}.
Quote Sections
- POST
/v1/quotes/{quote_id}/sections- N/A → Available
- Type: addition
- Notes: Adds one or more sections to a draft quote. Sections group line items on the quote layout, and multiple sections can be added in a single call. The response body matches
GET /v1/quotes/{quote_id}.
Quote Section Line Items
-
POST
/v1/quotes/{quote_id}/sections/{section_id}/line-items- N/A → Available
- Type: addition
- Notes: Adds one or more line items to a section on a draft quote. Line, section, and quote-level totals are recomputed and persisted as part of the call. Validation accumulates: every failing rule across every item in the batch comes back in a single 422 response with located error paths (
line_items[i].field). The response body matchesGET /v1/quotes/{quote_id}.
-
PATCH
/v1/quotes/{quote_id}/sections/{section_id}/line-items/{line_item_id}- N/A → Available
- Type: addition
- Notes: Partially updates a line item on a draft quote. Absent fields preserve the row. Nested objects and
recurring_intervalare tri-state: omit = no change,null= clear, populated = apply. The response body matchesGET /v1/quotes/{quote_id}.
Contacts
-
POST
/v1/contacts- N/A → Available
- Type: addition
- Notes: Creates a new contact with billing and optional shipping details.
-
GET
/v1/contacts- N/A → Available
- Type: addition
- Notes: Retrieves a list of contacts. Supports filtering by canonical fields (
id,client.id,billing_email,first_name,last_name,phone,organization,address,city,country,region,postal_code,record_created_at,record_updated_at) using thefilter[field]=operator:valuequery syntax.
-
GET
/v1/contacts/{id}- N/A → Available
- Type: addition
- Notes: Retrieves a contact by its id. If the contact is not yet linked locally, a remote lookup is performed and the local record is backfilled with the resolved id. Returns 404 if no match is found.
-
PATCH
/v1/contacts/{id}- N/A → Available
- Type: addition
- Notes: Updates a specific contact's information by its id. All fields are optional (PATCH semantics). The
clientfield is not accepted on updates — any request containing it is rejected with a 422.
Dates
- Effective: [2026-07-14]
