List contract clauses
Lists the org's reusable contract clauses, keyset-paginated newest first. Archived clauses are excluded unless include_archived is set: this list is what the quote clause picker reads. Each clause carries its per-locale bodies, the ids of the products, plans and quote presets it is attached to, and a read-only body resolved for the org's default locale.
query Parameters
limitPage size. Values above the server-side cap are clamped (standard default 50, cap 200; a few document-heavy lists use larger windows). Invalid values fall back to the default.
cursorOpaque continuation token from the previous response's pagination.cursor. Omit for the first page. Cursors are stateless and do not expire, but are only valid for the list and filters that produced them.
include_archivedInclude archived clauses. Off by default: this list is the quote picker's source.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List contract clauses › Responses
OK
Create a contract clause
Adds a reusable clause to the library. A clause is ONE record with a body per locale, not one record per language: quotes snapshot the body for the org's contract language on insert.
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Create a contract clause › Request Body
Clause text keyed by locale ("en", "de", "fr", "es", "it", "pt", "nl", "ja"). At least one required.
nameClause name.
countryISO 3166-1 alpha-2 country scope; null means global.
Create a contract clause › Responses
Created
Get a contract clause
Returns a single contract clause.
path Parameters
idClause UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Get a contract clause › Responses
OK
Update a contract clause
Patches a library clause; omitted fields stay untouched, and a present bodies replaces the whole per-locale set. Existing quote snapshots are unaffected — the body a quote froze is the document, and no library edit reaches it.
path Parameters
idClause UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Update a contract clause › Request Body
Replaces the whole per-locale body set. Omit to leave it untouched.
countrynameUpdate a contract clause › Responses
OK
Archive a contract clause
Retires a library clause: it leaves the picker and stops auto-attaching from any product, plan or preset it hangs off. Reversible via unarchive. Quote snapshots and their headings are untouched — archiving retires a clause from the catalog, it never rewrites a document that already quoted it.
path Parameters
idClause UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Archive a contract clause › Responses
OK
Restore an archived contract clause
Returns an archived clause to the picker; it resumes auto-attaching wherever it is still attached.
path Parameters
idClause UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Restore an archived contract clause › Responses
OK
List the contract clauses attached to a plan
Returns the library clauses attached to this plan, which a quote containing it picks up automatically. Archived clauses are included so an attachment to a retired clause stays visible and removable.
path Parameters
idProduct, plan or quote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List the contract clauses attached to a plan › Responses
OK
Attach contract clauses to a plan (additive)
Attaches the given clause IDs without removing existing ones, and returns the resulting set. Idempotent: re-sending an already-attached id is a no-op. Attachment is to the plan ROOT, not to a version — a clause is a policy about the thing you sell, not about a revision of its price, and the freeze that matters happens when a quote snapshots the text.
path Parameters
idProduct, plan or quote preset UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Attach contract clauses to a plan (additive) › Request Body
clause_idsLibrary clause IDs.
Attach contract clauses to a plan (additive) › Responses
OK
Detach contract clauses from a plan
Removes the clause IDs given in clause_ids from this plan and returns what is left. Already-absent ids are ignored. Quotes already created keep their snapshots.
path Parameters
idProduct, plan or quote preset UUID
query Parameters
clause_idsLibrary clause IDs to detach. Repeatable or comma-separated.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Detach contract clauses from a plan › Responses
OK
List the contract clauses attached to a product
Returns the library clauses attached to this product, which a quote containing it picks up automatically. Archived clauses are included so an attachment to a retired clause stays visible and removable.
path Parameters
idProduct, plan or quote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List the contract clauses attached to a product › Responses
OK
Attach contract clauses to a product (additive)
Attaches the given clause IDs without removing existing ones, and returns the resulting set. Idempotent: re-sending an already-attached id is a no-op. Attachment is to the product ROOT, not to a version — a clause is a policy about the thing you sell, not about a revision of its price, and the freeze that matters happens when a quote snapshots the text.
path Parameters
idProduct, plan or quote preset UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Attach contract clauses to a product (additive) › Request Body
clause_idsLibrary clause IDs.
Attach contract clauses to a product (additive) › Responses
OK
Detach contract clauses from a product
Removes the clause IDs given in clause_ids from this product and returns what is left. Already-absent ids are ignored. Quotes already created keep their snapshots.
path Parameters
idProduct, plan or quote preset UUID
query Parameters
clause_idsLibrary clause IDs to detach. Repeatable or comma-separated.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Detach contract clauses from a product › Responses
OK
List quote presets
Lists the org's reusable quote presets, keyset-paginated newest first.
query Parameters
limitPage size. Values above the server-side cap are clamped (standard default 50, cap 200; a few document-heavy lists use larger windows). Invalid values fall back to the default.
cursorOpaque continuation token from the previous response's pagination.cursor. Omit for the first page. Cursors are stateless and do not expire, but are only valid for the list and filters that produced them.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List quote presets › Responses
OK
Create a quote preset
Creates a reusable quote preset (expiry default, intake gates, note/terms, plan pin).
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Create a quote preset › Request Body
namePreset name.
activeDefaults to true when omitted.
auto_renewWhether those subscriptions renew at period end. Omit to inherit the organization default.
billing_anchor_dayDay of month (1-28) those subscriptions anchor their billing period to. 0 or omitted inherits the organization default.
contract_termsdefault_expiry_daysPublic-link lifetime in days for quotes created from this preset.
descriptiondocument_template_idDocument template to render quotes from this preset with. Omit to use the organization's quote default.
note_for_customerplan_idplan_versionWhat quotes from this preset demand of the buyer before signing, destinations included.
require_payment_methodrequire_shippingrequire_vat_idversion_change_strategyMoney policy when a latest-tracking subscription moves version. Required when version_track_mode is latest; omit to inherit the organization default.
version_track_modeHow subscriptions provisioned from this preset's quotes follow plan/product versions. Omit to inherit the organization default.
Create a quote preset › Responses
Created
Get a quote preset
Returns a single quote preset.
path Parameters
idQuote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Get a quote preset › Responses
OK
Delete a quote preset
Hard-deletes a quote preset. Existing quotes keep their snapshot (their preset_id nulls out).
path Parameters
idQuote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Delete a quote preset › Responses
No Content
Update a quote preset
Patches a quote preset; omitted fields stay untouched.
path Parameters
idQuote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Update a quote preset › Request Body
activeauto_renewWhether those subscriptions renew at period end. Send clear_auto_renew to go back to inheriting.
billing_anchor_dayDay of month (1-28) those subscriptions anchor their billing period to. Send 0 to go back to inheriting.
clear_auto_renewDrop the preset's auto-renew default so its quotes inherit the organization default.
clear_document_templateUnpin the document template so quotes fall back to the organization's quote default.
contract_termsdefault_expiry_daysdescriptiondocument_template_idPin a document template. Omitted leaves the current pin; send clear_document_template to remove it.
namenote_for_customerplan_idplan_versionReplace what quotes from this preset demand of the buyer, destinations included. Send [] to require none.
require_payment_methodrequire_shippingrequire_vat_idversion_change_strategyMoney policy when a latest-tracking subscription moves version. Send "" to go back to inheriting. Required whenever version_track_mode is latest.
version_track_modeHow subscriptions provisioned from this preset's quotes follow plan/product versions (pinned|latest). Send "" to go back to inheriting the organization default.
Update a quote preset › Responses
OK
List the contract clauses attached to a quote preset
Returns the library clauses attached to this quote preset, which a quote containing it picks up automatically. Archived clauses are included so an attachment to a retired clause stays visible and removable.
path Parameters
idProduct, plan or quote preset UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List the contract clauses attached to a quote preset › Responses
OK
Attach contract clauses to a quote preset (additive)
Attaches the given clause IDs without removing existing ones, and returns the resulting set. Idempotent: re-sending an already-attached id is a no-op. Attachment is to the quote preset ROOT, not to a version — a clause is a policy about the thing you sell, not about a revision of its price, and the freeze that matters happens when a quote snapshots the text.
path Parameters
idProduct, plan or quote preset UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Attach contract clauses to a quote preset (additive) › Request Body
clause_idsLibrary clause IDs.
Attach contract clauses to a quote preset (additive) › Responses
OK
Detach contract clauses from a quote preset
Removes the clause IDs given in clause_ids from this quote preset and returns what is left. Already-absent ids are ignored. Quotes already created keep their snapshots.
path Parameters
idProduct, plan or quote preset UUID
query Parameters
clause_idsLibrary clause IDs to detach. Repeatable or comma-separated.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Detach contract clauses from a quote preset › Responses
OK
List quotes
Lists quotes with cursor-based pagination, per-status facet counts, a quote_number/title search, and the unified field.op=value filter grammar (customer_id, kind, owner_user_id, status, expires_at, value_amount).
query Parameters
customer_idFilter on customer_id (uuid). Operators: eq — dot grammar, e.g. customer_id.eq=value; a bare customer_id=value means eq.
expires_atFilter on expires_at (date-time). Operators: gte, lte — dot grammar, e.g. expires_at.gte=value; a bare expires_at=value means eq.
kindFilter on kind (enum). Operators: eq, in — dot grammar, e.g. kind.in=value; a bare kind=value means eq. A bare comma-separated value is in-sugar: kind=a,b means kind.in=a,b. Legal values: NEW_SUBSCRIPTION, SUBSCRIPTION_UPDATE, ONE_OFF.
orchestration_statusFilter on orchestration_status (enum). Operators: eq, in — dot grammar, e.g. orchestration_status.in=value; a bare orchestration_status=value means eq. A bare comma-separated value is in-sugar: orchestration_status=a,b means orchestration_status.in=a,b. Legal values: NOT_APPLICABLE, PENDING, MANUAL, RETRYING, FAILED, SUCCEEDED.
owner_user_idFilter on owner_user_id (uuid). Operators: eq — dot grammar, e.g. owner_user_id.eq=value; a bare owner_user_id=value means eq.
value_amountFilter on value_amount (number). Operators: gte, lte — dot grammar, e.g. value_amount.gte=value; a bare value_amount=value means eq.
limitPage size. Values above the server-side cap are clamped (standard default 50, cap 200; a few document-heavy lists use larger windows). Invalid values fall back to the default.
cursorOpaque continuation token from the previous response's pagination.cursor. Omit for the first page. Cursors are stateless and do not expire, but are only valid for the list and filters that produced them.
searchCase-insensitive match over quote_number and title; relevance-ranked (exact > prefix > substring) unless an explicit sort is given
statusFilter by quote status. Filterable fields (customer_id, kind, owner_user_id, status, expires_at, value_amount) accept apifilter operator suffixes in the dot grammar, e.g. status.in=SENT,VIEWED
sortOrdering: created_at, quote_number, title, kind, status, value_amount, sent_at or expires_at, each with an optional :asc/:desc suffix (default created_at:desc). value_amount orders by currency first and the amount within it - an amount across currencies is not a comparable quantity. Quotes with no sent_at/expires_at group together at one end. An unknown value is rejected. Cursors are bound to the ordering that issued them, so changing sort mid-walk needs a fresh first page. Sorting suppresses relevance ranking when search is also given.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List quotes › Responses
OK
Create a quote
Creates a DRAFT quote. A preset prefills unset fields (the operator body wins); plan-backed quotes build their lines from the pinned plan-version snapshot; ONE_OFF quotes take manual lines. SUBSCRIPTION_UPDATE quotes require source_subscription_id and update_effective.
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Create a quote › Request Body
customer_idkindaction_at_term_endWhat happens when the agreed term runs out. Omit for CONTINUE_WITHOUT_TERM: the negotiated rates lapse on their own windows and the subscription carries on at catalogue prices. Requires negotiated_term_unit/count.
auto_renewWhether the provisioned subscription renews at period end. Omit to inherit the preset, then the organization default.
billing_anchor_dayDay of month (1-28) the provisioned subscription anchors its billing period to. 0 or omitted inherits the preset, then the organization default, then derivation from the start date.
billing_intervalInterval unit (week|month|year) used to price plan-backed items; defaults to month.
Library clauses to snapshot onto the quote; body is an optional override of the library text.
co_terminate_with_subscription_idEnd this deal on the same date as that subscription's deal. Requires negotiated_term_unit/count, and the term must match the group's. The new agreement takes the group's end date, which can make its first window shorter than the agreed term.
contract_termscoupon_codecreated_bycurrencycustom_fieldsWhat the offer says happens later, in order. Each entry gives an offset from the deal's start and the plan, quantities and agreed prices in force from then.
document_template_idDocument template this quote renders through. Omit to inherit the preset's pinned layout, then the organization's quote default.
What the customer owes for ending the subscription before the agreed term is up. A policy, not an amount: kind picks the formula (NONE, FLAT, PERCENT_OF_REMAINING, REMAINING_VALUE, REMAINING_PERIODS, DISCOUNT_RECAPTURE) and carries the one input that formula needs, plus an optional cap. Omit for an offer that says nothing, which charges nothing; send {"kind":"NONE"} to record that leaving was agreed to be free. Requires negotiated_term_unit/count.
early_termination_gateWhat happens when a governed operation is attempted inside the term: NONE allows it silently, WARN records it, BLOCK refuses it with a 409 naming the date the term ends. Omit for WARN.
excluded_clause_idsAuto-attached clause ids to leave off this quote. Each id must be one the catalog attaches to this offer, and must not also appear in clauses.
expires_atfree_trial_daysDays of free trial this offer sells before billing starts; 0 or omitted means billing starts on activation.
governed_operationsWhich operations the early-termination gate applies to. Omit to govern cancel, which is what every agreement does today. Send an explicit empty array for a term that governs nothing.
localeLanguage the offer is for (en, de, fr, es, it, pt, nl, ja). Drives the PDF, the buyer mail and the language a clause body is snapshotted in. Omit to inherit the customer's locale, then the organization default.
negotiated_term_countNumber of negotiated_term_unit periods the agreed rates hold for, measured from the subscription start. Send with negotiated_term_unit; omit both for open-ended.
negotiated_term_unitUnit of the term the negotiated rates hold for. Send with negotiated_term_count; omit both for open-ended.
note_for_customernotice_countHow many notice_units a cancellation asked for inside the term waits before it takes effect. Omit both fields for a cancellation that takes effect at once.
notice_unitUnit of the notice a cancellation requires: week or month. NOT the same mechanism as term_end_reminder_days, which announces that the term is ENDING — this one defers a cancellation the customer ASKS FOR, to notice_count units later or the end of the term, whichever is sooner. Send with notice_count or not at all.
orchestration_modeowner_user_idplan_idplan_versionpreset_idproration_snapshotrenegotiates_agreement_idThe agreement this offer renegotiates. Only meaningful on a SUBSCRIPTION_UPDATE quote for the subscription that agreement governs; the agreement page lists the offer as its pending renewal.
What the buyer must answer before signing, each entry naming a custom-field key, WHERE the answer goes after signature (target) and what happens when the destination already holds a value (on_conflict). Omit to inherit the preset's list.
require_payment_methodrequire_shippingrequire_vat_idInvoicing overrides for the provisioned subscription: line grouping, price resolution, default proration mode and payment terms. Omit any field to inherit the customer's, then the organization's, setting.
signature_modesourcesource_subscription_idstarts_atWhen the offer begins. Prices resolve as of this date and the provisioned subscription starts on it. Omit to price at now and start on signature.
successor_plan_idPlan the subscription moves onto when the term ends. Required when action_at_term_end is SWITCH_PLAN, refused otherwise, and the plan must already have a published version.
term_end_reminder_daysHow many days before the term ends the customer is given notice. Required (and at least 1) for RENEGOTIATE, which drafts the renewal quote on that day. Omit for no notice.
titleChange set for SUBSCRIPTION_UPDATE quotes (add/remove/quantity/plan/version), priced into proration_snapshot at create.
update_effectiveupdate_effective_dateversion_change_strategyMoney policy when a latest-tracking subscription moves version. Required whenever version_track_mode resolves to latest on this quote. Omit to inherit the preset, then the organization default.
version_track_modeHow the PROVISIONED SUBSCRIPTION follows plan/product versions: pinned or latest. Omit to inherit the preset, then the organization default. Unrelated to plan_version, which pins what this offer was priced against.
Create a quote › Responses
Created
Render a preview PDF of a quote that does not exist yet
Takes the same body as create-quote and streams the proposal PDF the operator is authoring, without creating anything: no quote row, no quote number, no public token, no event. The document renders through the layout the quote would actually be sent under (its pin, else the organization's quote default, else the built-in), and states PREVIEW where an issued quote states its number. A body create-quote would refuse is refused here with the same error.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Render a preview PDF of a quote that does not exist yet › Request Body
customer_idkindaction_at_term_endWhat happens when the agreed term runs out. Omit for CONTINUE_WITHOUT_TERM: the negotiated rates lapse on their own windows and the subscription carries on at catalogue prices. Requires negotiated_term_unit/count.
auto_renewWhether the provisioned subscription renews at period end. Omit to inherit the preset, then the organization default.
billing_anchor_dayDay of month (1-28) the provisioned subscription anchors its billing period to. 0 or omitted inherits the preset, then the organization default, then derivation from the start date.
billing_intervalInterval unit (week|month|year) used to price plan-backed items; defaults to month.
Library clauses to snapshot onto the quote; body is an optional override of the library text.
co_terminate_with_subscription_idEnd this deal on the same date as that subscription's deal. Requires negotiated_term_unit/count, and the term must match the group's. The new agreement takes the group's end date, which can make its first window shorter than the agreed term.
contract_termscoupon_codecreated_bycurrencycustom_fieldsWhat the offer says happens later, in order. Each entry gives an offset from the deal's start and the plan, quantities and agreed prices in force from then.
document_template_idDocument template this quote renders through. Omit to inherit the preset's pinned layout, then the organization's quote default.
What the customer owes for ending the subscription before the agreed term is up. A policy, not an amount: kind picks the formula (NONE, FLAT, PERCENT_OF_REMAINING, REMAINING_VALUE, REMAINING_PERIODS, DISCOUNT_RECAPTURE) and carries the one input that formula needs, plus an optional cap. Omit for an offer that says nothing, which charges nothing; send {"kind":"NONE"} to record that leaving was agreed to be free. Requires negotiated_term_unit/count.
early_termination_gateWhat happens when a governed operation is attempted inside the term: NONE allows it silently, WARN records it, BLOCK refuses it with a 409 naming the date the term ends. Omit for WARN.
excluded_clause_idsAuto-attached clause ids to leave off this quote. Each id must be one the catalog attaches to this offer, and must not also appear in clauses.
expires_atfree_trial_daysDays of free trial this offer sells before billing starts; 0 or omitted means billing starts on activation.
governed_operationsWhich operations the early-termination gate applies to. Omit to govern cancel, which is what every agreement does today. Send an explicit empty array for a term that governs nothing.
localeLanguage the offer is for (en, de, fr, es, it, pt, nl, ja). Drives the PDF, the buyer mail and the language a clause body is snapshotted in. Omit to inherit the customer's locale, then the organization default.
negotiated_term_countNumber of negotiated_term_unit periods the agreed rates hold for, measured from the subscription start. Send with negotiated_term_unit; omit both for open-ended.
negotiated_term_unitUnit of the term the negotiated rates hold for. Send with negotiated_term_count; omit both for open-ended.
note_for_customernotice_countHow many notice_units a cancellation asked for inside the term waits before it takes effect. Omit both fields for a cancellation that takes effect at once.
notice_unitUnit of the notice a cancellation requires: week or month. NOT the same mechanism as term_end_reminder_days, which announces that the term is ENDING — this one defers a cancellation the customer ASKS FOR, to notice_count units later or the end of the term, whichever is sooner. Send with notice_count or not at all.
orchestration_modeowner_user_idplan_idplan_versionpreset_idproration_snapshotrenegotiates_agreement_idThe agreement this offer renegotiates. Only meaningful on a SUBSCRIPTION_UPDATE quote for the subscription that agreement governs; the agreement page lists the offer as its pending renewal.
What the buyer must answer before signing, each entry naming a custom-field key, WHERE the answer goes after signature (target) and what happens when the destination already holds a value (on_conflict). Omit to inherit the preset's list.
require_payment_methodrequire_shippingrequire_vat_idInvoicing overrides for the provisioned subscription: line grouping, price resolution, default proration mode and payment terms. Omit any field to inherit the customer's, then the organization's, setting.
signature_modesourcesource_subscription_idstarts_atWhen the offer begins. Prices resolve as of this date and the provisioned subscription starts on it. Omit to price at now and start on signature.
successor_plan_idPlan the subscription moves onto when the term ends. Required when action_at_term_end is SWITCH_PLAN, refused otherwise, and the plan must already have a published version.
term_end_reminder_daysHow many days before the term ends the customer is given notice. Required (and at least 1) for RENEGOTIATE, which drafts the renewal quote on that day. Omit for no notice.
titleChange set for SUBSCRIPTION_UPDATE quotes (add/remove/quantity/plan/version), priced into proration_snapshot at create.
update_effectiveupdate_effective_dateversion_change_strategyMoney policy when a latest-tracking subscription moves version. Required whenever version_track_mode resolves to latest on this quote. Omit to inherit the preset, then the organization default.
version_track_modeHow the PROVISIONED SUBSCRIPTION follows plan/product versions: pinned or latest. Omit to inherit the preset, then the organization default. Unrelated to plan_version, which pins what this offer was priced against.
Render a preview PDF of a quote that does not exist yet › Responses
The proposal PDF, rendered from the unsaved body.
Get a quote
Retrieves a single quote by ID, including its priced lines, the signature summary when one exists, and the portal-relative public link path.
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Get a quote › Responses
OK
Update a quote
Edits the mutable quote fields. An expires_at-only edit keeps a live quote's status and public token; a content edit on a SENT/VIEWED quote pulls it back to DRAFT with a rotated token. SIGNED/VOIDED quotes are immutable.
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Update a quote › Request Body
action_at_term_endWhat happens when the agreed term runs out. Naming any end-of-term field replaces the whole block, so send the ones you want kept.
auto_renewWhether the provisioned subscription renews at period end. Send clear_auto_renew to go back to inheriting.
billing_anchor_dayDay of month (1-28) the provisioned subscription anchors its billing period to. Send 0 to go back to inheriting.
Replace the quote's clause snapshots. Send [] to carry none. Omit to leave them untouched.
clear_auto_renewDrop the per-quote auto-renew override so the subscription inherits the organization default.
clear_coterminationStop co-terminating: this deal goes back to ending on its own term.
clear_coupon_codeclear_deal_stepsDrop every later step so the offer does one thing for its whole term.
clear_document_templateUnpin the document template so the quote falls back to the organization's quote default.
clear_end_of_termDrop everything the offer said about the end of the term, so the agreement it mints goes back to CONTINUE_WITHOUT_TERM with the default gate.
clear_expires_atclear_negotiated_termDrop the agreed term so the negotiated rates go back to open-ended.
clear_starts_atDrop the start date so the offer starts on signature and prices at now.
clear_value_overrideUnpin the quote's value so it tracks the sum of its lines again.
co_terminate_with_subscription_idEnd this deal on the same date as that subscription's deal. The term must match the group's.
contract_termscoupon_codecustom_fieldsReplace the offer's later configurations, in order. Omit to leave them alone; send clear_deal_steps to drop them.
document_template_idPin the document template this quote renders through. Omitted leaves the current pin; send clear_document_template to fall back to the organization's quote default.
What ending the subscription early costs. Naming any end-of-term field replaces the whole block, so send this again if it should be kept.
early_termination_gateWhat happens when a governed operation is attempted inside the term.
excluded_clause_idsAuto-attached clause ids to leave off this quote. Each id must be one the catalog attaches to this offer, and must not also appear in clauses.
expires_atfree_trial_daysDays of free trial this offer sells before billing starts; 0 means billing starts on activation.
governed_operationsWhich operations the gate applies to. An explicit empty array is a term that governs nothing; omitting it while naming another end-of-term field clears it back to the default.
localeLanguage the offer is for (en, de, fr, es, it, pt, nl, ja). Send "" to inherit the customer's locale, then the organization default.
negotiated_term_countNumber of negotiated_term_unit periods the agreed rates hold for; send with negotiated_term_unit.
negotiated_term_unitUnit of the term the negotiated rates hold for; send with negotiated_term_count.
note_for_customernotice_countHow many notice_units a cancellation waits before it takes effect.
notice_unitUnit of the notice a cancellation requires. Not term_end_reminder_days, which announces the end of the term; this defers a cancellation the customer asks for.
orchestration_modeowner_user_idQuantity restatements on the quote's existing lines, keyed by quote item id.
Replace what the buyer must answer before signing, destinations included. Send [] to require none.
require_payment_methodrequire_shippingrequire_vat_idInvoicing overrides for the provisioned subscription. Replaces the whole block: a field left out goes back to inheriting. Omit to leave the stored block alone.
signature_modestarts_atMove the offer's start date; the quote is re-priced as of the new date.
successor_plan_idPlan the subscription moves onto when the term ends. Required by SWITCH_PLAN and refused by every other action.
term_end_reminder_daysDays of notice before the term ends. Required (at least 1) for RENEGOTIATE.
titleupdate_effectiveupdate_effective_datevalue_overridePin the quote's headline value to this major-unit decimal. The lines are what get provisioned; a pin only changes what the document states. Send clear_value_override to go back to tracking the line sum.
version_change_strategyMoney policy when a latest-tracking subscription moves version (immediate_prorate|next_period|at_phase_change). Send "" to go back to inheriting. Required whenever version_track_mode is latest.
version_track_modeHow the provisioned subscription follows plan/product versions (pinned|latest). Send "" to go back to inheriting the organization default. Unrelated to the offer's pinned plan_version.
Update a quote › Responses
OK
List quote tracking events
Returns the quote's append-only tracking timeline (created, submitted, approved, sent, viewed, signed, ...), keyset-paginated newest first.
path Parameters
idQuote UUID
query Parameters
limitPage size. Values above the server-side cap are clamped (standard default 50, cap 200; a few document-heavy lists use larger windows). Invalid values fall back to the default.
cursorOpaque continuation token from the previous response's pagination.cursor. Omit for the first page. Cursors are stateless and do not expire, but are only valid for the list and filters that produced them.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List quote tracking events › Responses
OK
List the documents on a quote
Returns the quote's documents. Uploads that were never confirmed are not listed; pass status=quarantined to see the uploads that were refused.
path Parameters
idThe owning record's UUID
query Parameters
statusWhich documents to list. Defaults to the accepted ones; quarantined lists the uploads that were refused.
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
List the documents on a quote › Responses
OK
Record a signature made outside the portal
Records a wet-ink or externally signed quote: the operator vouches for a signature that happened on paper. The uploaded signed copy is REQUIRED — POST it to /v1/files with owner_kind=quote and category=uploaded_signed_copy first — and becomes the completed envelope's executed document, because for a paper signature the document presented and the document executed are the same piece of paper. Any live signature request is superseded first, so the buyer cannot also accept in the portal. The result reports operator provenance rather than rendering identically to an OTP-verified signature.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Record a signature made outside the portal › Request Body
executed_file_idThe uploaded signed copy, from POST /v1/files with owner_kind=quote and category=uploaded_signed_copy.
signer_nameWho signed the paper copy.
signer_emailTheir email, if known. Defaults to the customer's.
Record a signature made outside the portal › Responses
OK
Re-run a signed quote's provisioning
Re-arms provisioning for a signed quote whose orchestration failed or never landed, after the operator has fixed the cause (orchestration_error says what it was). Answers 202: the run is queued on the durable rail, not performed inline — poll orchestration_status for the outcome. Safe to call twice; it can never provision twice. Refused 409 QUOTE_ORCHESTRATION_NOT_RETRYABLE when the quote is not signed, is set to MANUAL orchestration (a human provisions those), is already orchestrated, or has a run still in flight.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Re-run a signed quote's provisioning › Responses
Accepted
Download the quote proposal PDF
Renders the quote proposal PDF on demand (org header, customer block, priced lines, totals, note, contract terms and clause snapshots, validity line and signature block; labels follow the customer's locale, de/en) and streams it as quote-
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Download the quote proposal PDF › Responses
OK
Preview a quote reprice
Recomputes the quote's line amounts and total from requested quantities (adjustable lines clamp into [min_quantity, max_quantity]), persisting nothing.
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Preview a quote reprice › Request Body
Requested quantities per quote line, keyed by quote item id.
starts_atPrice the quote as if it started on this date, without saving it. Omit to use the quote's own start date.
Preview a quote reprice › Responses
OK
Resend (remind) a sent quote
Records a reminder nudge on a live buyer-facing quote (SENT/VIEWED); no status change.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Resend (remind) a sent quote › Responses
OK
Revise a declined or expired quote
Reopens a DECLINED/EXPIRED quote: back to DRAFT, version+1, and a fresh public token (the old link dies with the revision).
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Revise a declined or expired quote › Responses
OK
Reissue the buyer's signing link
Withdraws the live signature request (CANCELLED, reason SUPERSEDED, every signer's link dead) and issues a replacement over a freshly frozen document, without touching the quote's lifecycle. Use it after a leak: the leaked link stops working the instant the cancel commits, and the intended recipient is re-notified with a working one. Refused once anybody has signed, and on terminal quotes.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Reissue the buyer's signing link › Responses
OK
Send a quote to the buyer
Releases the quote to the buyer (DRAFT or APPROVED → SENT). A quote that can still enter approval passes the quote.send checkpoint first: when it gates, the quote lands in PENDING_APPROVAL, nothing is sent, and the call answers 202 with the approval request id — the same ApprovalPending body every other gated operation answers with. An APPROVED quote is already past the checkpoint and sends without raising a second request. With the checkpoint enabled, an API-key caller is refused 409 APPROVAL_REQUIRED_HUMAN rather than parked.
The body is OPTIONAL and every field in it is an override rather than a setting: an empty body behaves exactly as no body did, sending where the customer's Quotes & contracts contacts say, on the offer's own expiry, with no automatic nudges. Naming recipients replaces that resolved list for this request only - the first signs, the rest are copied, at most three - and every named address is recorded as operator-entered, because that is what it is: the evidence record must never report an address a human typed as if it had come off the customer record. An expiry can only NARROW the window; a signing link that outlived the offer it presents would invite a signature on a document that can no longer be accepted, so a later date is clamped to the offer's own validity rather than refused.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Send a quote to the buyer › Request Body
countersignWhat your organisation does once the counterparty has signed. SEAL marks the signed copy in the organisation's name automatically. PERSON waits for the person named in countersigner. NONE finishes on the counterparty's signature. Omit to use the organisation's setting.
The person who signs for your organisation. Required when countersign is PERSON; ignored otherwise.
expires_atWhen the signing link should stop working. Clamped to the offer's own validity — it cannot outlive the offer it presents. Omit to use the offer's expiry.
Who to send to. The first entry signs; the others are copied. Omit to use the customer's Quotes & contracts contacts. At most three, matching the contact lists themselves.
reminder_every_daysNudge an unsigned request every N days. Omit for no automatic nudges.
reminder_maxHow many nudges at most. Omit for the provider's own cap.
Send a quote to the buyer › Responses
OK
Outcome-dependent: the QuoteDTO (status SENT) on 200, when the quote.send checkpoint did not gate; the ApprovalPendingDTO on 202, when it did and the quote is parked in PENDING_APPROVAL awaiting a decision.
Sign for your organisation
Records your organisation's own signature on an offer the counterparty has already signed, when the request was released with a named person countersigning. No code is sent: you are signed in, and the session is the identity the record carries, alongside your user id. Refused with 409 SIGNING_COUNTERSIGN_NOT_READY before every party has signed, and with 403 SIGNING_NOT_COUNTERSIGNER when the request names somebody else — the signed copy states who signed for the organisation, so the named person is a fact of the request rather than a role anybody with the permission may fill. Signing a second time is a no-op that answers with the request as it stands. A company seal is never countersigned here: it is applied automatically in the same instant as the counterparty's signature.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Sign for your organisation › Request Body
consentAcceptance of the signing wording shown before the action. Must be true.
localeBCP-47 locale of the wording that was displayed. Defaults to the organisation's.
nameThe name signed under. Defaults to the name on the request.
Sign for your organisation › Responses
OK
Download the signed record
Streams the signature request's own artefact: the evidence record — who signed, when, from where, having accepted what wording — or, when none was produced, the executed document. Unlike /quotes/{id}/pdf (which renders the quote's CURRENT state on every call) these are fixed bytes, stored once. 404 while the quote has no completed signature request. Two digests travel on the response and they are not the same number: X-Document-Hash is the SHA-256 of the bytes in THIS body, which is what to compare a saved copy of the download against; X-Presented-Document-Hash is the SHA-256 the envelope froze over the document it PRESENTED at send, which is what to compare a copy of the offer against. Either header is omitted when the digest is not on record.
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Download the signed record › Responses
The archived signed record.
Withdraw the offer's signature request
Takes the offer off the table without killing it: the live signature request is cancelled with the stated reason, every signing link stops working immediately, and the quote returns to APPROVED - ready to be sent again once whatever prompted the withdrawal is fixed. It is deliberately neither Void (which ends the offer) nor a demotion to DRAFT (which would discard an approval the quote already earned over a mistake about the send). Refused with 409 SIGNING_CANCEL_AFTER_SIGNATURE once anybody has signed: a request holding a signature is still live, and withdrawing one to record another signature over the top is precisely what that refusal exists to prevent. 404 when the offer has no live request.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Withdraw the offer's signature request › Request Body
reasonWhy the request is being withdrawn. Recorded on the request's chronology; not sent to the buyer.
Withdraw the offer's signature request › Responses
OK
The offer's signature request, in full
Everything the Signing surface shows: the request itself (its parties, how each one's identity is being established, where each stands, and the digest of the document they were shown), its chronology oldest first, and what may be done to it now. A quote that has never been sent for signature answers 200 with no request, an empty chronology and the capabilities of an unsent offer - not 404, because the surface is reachable in every state and has to say something in all of them. The capabilities are computed from the same rules the write paths enforce, so a control this read offers is a control the server will accept: can_withdraw in particular is false once anybody has signed, which no status value on its own reveals.
path Parameters
idQuote UUID
Headers
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
The offer's signature request, in full › Responses
OK
Submit a quote for approval
Runs the quote.send approval checkpoint explicitly. When the checkpoint is enabled for this workspace and the quote clears its threshold, the quote lands in PENDING_APPROVAL and the call answers 202 with the approval request id; otherwise the operator's own authority approves outright (DRAFT → APPROVED) and the call answers 200 with the approved quote. With the checkpoint enabled, an API-key caller is refused 409 APPROVAL_REQUIRED_HUMAN rather than parked.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Submit a quote for approval › Responses
OK
Outcome-dependent: the QuoteDTO (status APPROVED) on 200, when the quote.send checkpoint did not gate; the ApprovalPendingDTO on 202, when it did and the quote is parked in PENDING_APPROVAL awaiting a decision.
Void a quote
Voids any non-terminal quote. VOIDED is terminal.
path Parameters
idQuote UUID
Headers
Idempotency-KeyUnique key that makes this POST safe to retry: repeats with the same key replay the first response instead of re-executing. Replays are scoped to the retrying principal (same API key / user) and kept for 24 hours. Required on every POST.
Client-generated idempotency key (e.g. a UUID).
X-Workspace-IdSelects the workspace this request operates in, by workspace UUID or slug (e.g. a sandbox workspace for test integrations). Omitted: the organization's default live workspace. Unknown workspace: 404; workspace outside your organization: 403. Discover workspaces via GET /workspaces.
Workspace UUID or slug.
Void a quote › Responses
OK