Added

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 + email and reused when it already exists on the account. Sections and line items are added via their own endpoints after creation. The response body matches GET /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 primary and draft flags 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 resolves expired_at if it was left unset. The response body matches GET /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 matches GET /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_interval are tri-state: omit = no change, null = clear, populated = apply. The response body matches GET /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 the filter[field]=operator:value query 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 client field is not accepted on updates — any request containing it is rejected with a 422.

Dates

  • Effective: [2026-07-14]