Sales

Estimates

Quotes/estimates with line items, totals, and a send + convert flow.

GET/estimates

List estimates

Returns a cursor-paginated list of estimates for the authenticated organization, ordered by document id. Soft-deleted estimates are excluded. Requires scope: estimates:read.

Response 200

No fields.

Errors

400Malformed or missing parameters
401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
429Rate limited
500Unexpected server error
POST/estimates

Create an estimate

Creates a new estimate. The organization and the actor (CreatedBy) are always taken from the API key context, never the request body. Per-line amounts and the subtotal/taxTotal/total are computed server-side from the supplied line items and are not trusted from the body. Requires scope: estimates:write.

Request body

No fields.

Response 201

FieldTypeDescription
idrequired
string
The estimate document id.
objectrequired
string
number
integer
Sequential human-facing estimate number allocated from organization numbering settings.nullable
uuid
string
Short 6-char human code for the estimate.nullable
estimateName
string
A label for the estimate.nullable
subject
string
Optional subject line.nullable
clientId
string
The associated client id, if any.nullable
clientName
string
Display name derived from the estimate's snapshotted client fields.nullable
client
any
Full snapshot of the client. Omitted when no client fields were snapshotted.nullable
statusrequired
enumdraft | sent | accepted | declined | expired | void
sent
boolean
Whether the estimate has been marked as sent.
lineItemsrequired
array of object
entryId
string
Stable identifier for the line row.
itemId
string
Optional reference to a catalog item or service.nullable
namerequired
string
description
string
quantityrequired
number
unitPricerequired
number
unitCost
number
Optional internal cost per unit. Omitted when not set.
taxable
boolean
Whether the line is taxable. Defaults to true on create. Omitted from output when not set.
taxRate
any
Tax rate for the line. May be a fraction (0.1), a whole percent (10), or a display string ("10%"). Omitted from output when not set.
amountrequired
number
Computed line total (quantity * unitPrice).
type
string
Line type. Defaults to "item". Omitted from output when not set.
signatures
array of object
Signatures on the estimate (ids or inline objects).
id
string
The signature document id.
signerType
string
nullable
signerName
string
nullable
signerEmail
string
nullable
signatureTitle
string
nullable
signatureData
string
Base64-encoded signature image data.nullable
signedByUserId
string
nullable
signedAt
string <date-time>
nullable
subtotalrequired
number
Server-computed subtotal. Alias of subTotal.
subTotal
number
Stored subtotal (alias of subtotal).
taxTotalrequired
number
totalrequired
number
Server-computed grand total. Alias of totalAmount.
totalAmount
number
Stored grand total (alias of total).
discountTotal
number
Total discount applied, if stored.
tipTotal
number
Total tip, if stored.
taxableTotal
number
Taxable portion of the subtotal, if stored.
taxRate
any
Estimate-level tax rate, if stored. Fraction, percent, or display string.
itemCostTotal
number
Total item cost, if stored.
laborCostTotal
number
Total labor cost, if stored.
totalsSnapshot
object
A stored snapshot of computed totals, if present.nullable
currencyrequired
string
terms
integer
Payment terms in days.
notes
string
nullable
discountName
string
Label for the applied discount, if any.nullable
organizationCompanyId
string
The issuing company (sub-org) id.nullable
billedFrom
any
Snapshot of the issuing company. Omitted when not snapshotted.nullable
appointmentId
string
Linked appointment number, if any.nullable
appointmentUUID
string
Linked appointment short code, if any.nullable
appointmentDocId
string
Linked appointment document id, if any.nullable
customFields
object
Arbitrary organization-defined custom fields.
convertedToInvoiceId
string
The invoice document id this estimate was converted into, if any.nullable
convertedToInvoiceUuid
string
The short code of the invoice this estimate was converted into, if any.nullable
convertedAt
string <date-time>
When the estimate was converted to an invoice, if it was.nullable
issueDate
string <date-time>
The estimate creation timestamp.nullable
expiryDate
string <date-time>
When the estimate expires, if set. Alias of expiresAt.nullable
expiresAt
string <date-time>
When the estimate expires, if set (alias of expiryDate).nullable
reminderSentAt
string <date-time>
When a reminder was last sent for this estimate (read-only).nullable
createdAt
string <date-time>
nullable
updatedAt
string <date-time>
nullable

Errors

400Malformed or missing parameters
401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
409Idempotency-Key reused with a different body
422Rejected by a business rule
429Rate limited
500Unexpected server error
GET/estimates/{id}

Retrieve an estimate

Returns a single estimate by id. A record belonging to another organization returns 404 rather than 403, so this can never confirm cross-tenant existence. Requires scope: estimates:read.

Parameters

Path

idrequired
string
The estimate id.

Response 200

FieldTypeDescription
idrequired
string
The estimate document id.
objectrequired
string
number
integer
Sequential human-facing estimate number allocated from organization numbering settings.nullable
uuid
string
Short 6-char human code for the estimate.nullable
estimateName
string
A label for the estimate.nullable
subject
string
Optional subject line.nullable
clientId
string
The associated client id, if any.nullable
clientName
string
Display name derived from the estimate's snapshotted client fields.nullable
client
any
Full snapshot of the client. Omitted when no client fields were snapshotted.nullable
statusrequired
enumdraft | sent | accepted | declined | expired | void
sent
boolean
Whether the estimate has been marked as sent.
lineItemsrequired
array of object
entryId
string
Stable identifier for the line row.
itemId
string
Optional reference to a catalog item or service.nullable
namerequired
string
description
string
quantityrequired
number
unitPricerequired
number
unitCost
number
Optional internal cost per unit. Omitted when not set.
taxable
boolean
Whether the line is taxable. Defaults to true on create. Omitted from output when not set.
taxRate
any
Tax rate for the line. May be a fraction (0.1), a whole percent (10), or a display string ("10%"). Omitted from output when not set.
amountrequired
number
Computed line total (quantity * unitPrice).
type
string
Line type. Defaults to "item". Omitted from output when not set.
signatures
array of object
Signatures on the estimate (ids or inline objects).
id
string
The signature document id.
signerType
string
nullable
signerName
string
nullable
signerEmail
string
nullable
signatureTitle
string
nullable
signatureData
string
Base64-encoded signature image data.nullable
signedByUserId
string
nullable
signedAt
string <date-time>
nullable
subtotalrequired
number
Server-computed subtotal. Alias of subTotal.
subTotal
number
Stored subtotal (alias of subtotal).
taxTotalrequired
number
totalrequired
number
Server-computed grand total. Alias of totalAmount.
totalAmount
number
Stored grand total (alias of total).
discountTotal
number
Total discount applied, if stored.
tipTotal
number
Total tip, if stored.
taxableTotal
number
Taxable portion of the subtotal, if stored.
taxRate
any
Estimate-level tax rate, if stored. Fraction, percent, or display string.
itemCostTotal
number
Total item cost, if stored.
laborCostTotal
number
Total labor cost, if stored.
totalsSnapshot
object
A stored snapshot of computed totals, if present.nullable
currencyrequired
string
terms
integer
Payment terms in days.
notes
string
nullable
discountName
string
Label for the applied discount, if any.nullable
organizationCompanyId
string
The issuing company (sub-org) id.nullable
billedFrom
any
Snapshot of the issuing company. Omitted when not snapshotted.nullable
appointmentId
string
Linked appointment number, if any.nullable
appointmentUUID
string
Linked appointment short code, if any.nullable
appointmentDocId
string
Linked appointment document id, if any.nullable
customFields
object
Arbitrary organization-defined custom fields.
convertedToInvoiceId
string
The invoice document id this estimate was converted into, if any.nullable
convertedToInvoiceUuid
string
The short code of the invoice this estimate was converted into, if any.nullable
convertedAt
string <date-time>
When the estimate was converted to an invoice, if it was.nullable
issueDate
string <date-time>
The estimate creation timestamp.nullable
expiryDate
string <date-time>
When the estimate expires, if set. Alias of expiresAt.nullable
expiresAt
string <date-time>
When the estimate expires, if set (alias of expiryDate).nullable
reminderSentAt
string <date-time>
When a reminder was last sent for this estimate (read-only).nullable
createdAt
string <date-time>
nullable
updatedAt
string <date-time>
nullable

Errors

401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
404No such resource in this organization
429Rate limited
500Unexpected server error
PATCH/estimates/{id}

Update an estimate

Updates an existing estimate. Only the supplied fields are changed. When lineItems are supplied, the subtotal/taxTotal/total are recomputed server-side and never trusted from the body. Setting status to "sent" stamps sentAt; setting it to "draft" clears the sent flag. Requires scope: estimates:write.

Parameters

Path

idrequired
string
The estimate document id.

Request body

No fields.

Response 200

FieldTypeDescription
idrequired
string
The estimate document id.
objectrequired
string
number
integer
Sequential human-facing estimate number allocated from organization numbering settings.nullable
uuid
string
Short 6-char human code for the estimate.nullable
estimateName
string
A label for the estimate.nullable
subject
string
Optional subject line.nullable
clientId
string
The associated client id, if any.nullable
clientName
string
Display name derived from the estimate's snapshotted client fields.nullable
client
any
Full snapshot of the client. Omitted when no client fields were snapshotted.nullable
statusrequired
enumdraft | sent | accepted | declined | expired | void
sent
boolean
Whether the estimate has been marked as sent.
lineItemsrequired
array of object
entryId
string
Stable identifier for the line row.
itemId
string
Optional reference to a catalog item or service.nullable
namerequired
string
description
string
quantityrequired
number
unitPricerequired
number
unitCost
number
Optional internal cost per unit. Omitted when not set.
taxable
boolean
Whether the line is taxable. Defaults to true on create. Omitted from output when not set.
taxRate
any
Tax rate for the line. May be a fraction (0.1), a whole percent (10), or a display string ("10%"). Omitted from output when not set.
amountrequired
number
Computed line total (quantity * unitPrice).
type
string
Line type. Defaults to "item". Omitted from output when not set.
signatures
array of object
Signatures on the estimate (ids or inline objects).
id
string
The signature document id.
signerType
string
nullable
signerName
string
nullable
signerEmail
string
nullable
signatureTitle
string
nullable
signatureData
string
Base64-encoded signature image data.nullable
signedByUserId
string
nullable
signedAt
string <date-time>
nullable
subtotalrequired
number
Server-computed subtotal. Alias of subTotal.
subTotal
number
Stored subtotal (alias of subtotal).
taxTotalrequired
number
totalrequired
number
Server-computed grand total. Alias of totalAmount.
totalAmount
number
Stored grand total (alias of total).
discountTotal
number
Total discount applied, if stored.
tipTotal
number
Total tip, if stored.
taxableTotal
number
Taxable portion of the subtotal, if stored.
taxRate
any
Estimate-level tax rate, if stored. Fraction, percent, or display string.
itemCostTotal
number
Total item cost, if stored.
laborCostTotal
number
Total labor cost, if stored.
totalsSnapshot
object
A stored snapshot of computed totals, if present.nullable
currencyrequired
string
terms
integer
Payment terms in days.
notes
string
nullable
discountName
string
Label for the applied discount, if any.nullable
organizationCompanyId
string
The issuing company (sub-org) id.nullable
billedFrom
any
Snapshot of the issuing company. Omitted when not snapshotted.nullable
appointmentId
string
Linked appointment number, if any.nullable
appointmentUUID
string
Linked appointment short code, if any.nullable
appointmentDocId
string
Linked appointment document id, if any.nullable
customFields
object
Arbitrary organization-defined custom fields.
convertedToInvoiceId
string
The invoice document id this estimate was converted into, if any.nullable
convertedToInvoiceUuid
string
The short code of the invoice this estimate was converted into, if any.nullable
convertedAt
string <date-time>
When the estimate was converted to an invoice, if it was.nullable
issueDate
string <date-time>
The estimate creation timestamp.nullable
expiryDate
string <date-time>
When the estimate expires, if set. Alias of expiresAt.nullable
expiresAt
string <date-time>
When the estimate expires, if set (alias of expiryDate).nullable
reminderSentAt
string <date-time>
When a reminder was last sent for this estimate (read-only).nullable
createdAt
string <date-time>
nullable
updatedAt
string <date-time>
nullable

Errors

400Malformed or missing parameters
401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
404No such resource in this organization
422Rejected by a business rule
429Rate limited
500Unexpected server error
DELETE/estimates/{id}

Delete an estimate

Soft-deletes an estimate (sets softDeleted, deletedAt). There is no hard delete for estimates. Returns a deletion confirmation object. Requires scope: estimates:write.

Parameters

Path

idrequired
string
The estimate document id.

Response 200

FieldTypeDescription
idrequired
string
objectrequired
string
deletedrequired
boolean

Errors

401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
404No such resource in this organization
429Rate limited
500Unexpected server error
POST/estimates/{id}/send

Mark an estimate as sent

Records the estimate as sent (sets sent, stamps sentAt; transitions a draft to "sent"). Already-resolved statuses (accepted, declined, expired, void) keep their status. This does NOT email the estimate - the caller drives their own delivery. Requires scope: estimates:write.

Parameters

Path

idrequired
string
The estimate document id.

Response 200

FieldTypeDescription
idrequired
string
The estimate document id.
objectrequired
string
number
integer
Sequential human-facing estimate number allocated from organization numbering settings.nullable
uuid
string
Short 6-char human code for the estimate.nullable
estimateName
string
A label for the estimate.nullable
subject
string
Optional subject line.nullable
clientId
string
The associated client id, if any.nullable
clientName
string
Display name derived from the estimate's snapshotted client fields.nullable
client
any
Full snapshot of the client. Omitted when no client fields were snapshotted.nullable
statusrequired
enumdraft | sent | accepted | declined | expired | void
sent
boolean
Whether the estimate has been marked as sent.
lineItemsrequired
array of object
entryId
string
Stable identifier for the line row.
itemId
string
Optional reference to a catalog item or service.nullable
namerequired
string
description
string
quantityrequired
number
unitPricerequired
number
unitCost
number
Optional internal cost per unit. Omitted when not set.
taxable
boolean
Whether the line is taxable. Defaults to true on create. Omitted from output when not set.
taxRate
any
Tax rate for the line. May be a fraction (0.1), a whole percent (10), or a display string ("10%"). Omitted from output when not set.
amountrequired
number
Computed line total (quantity * unitPrice).
type
string
Line type. Defaults to "item". Omitted from output when not set.
signatures
array of object
Signatures on the estimate (ids or inline objects).
id
string
The signature document id.
signerType
string
nullable
signerName
string
nullable
signerEmail
string
nullable
signatureTitle
string
nullable
signatureData
string
Base64-encoded signature image data.nullable
signedByUserId
string
nullable
signedAt
string <date-time>
nullable
subtotalrequired
number
Server-computed subtotal. Alias of subTotal.
subTotal
number
Stored subtotal (alias of subtotal).
taxTotalrequired
number
totalrequired
number
Server-computed grand total. Alias of totalAmount.
totalAmount
number
Stored grand total (alias of total).
discountTotal
number
Total discount applied, if stored.
tipTotal
number
Total tip, if stored.
taxableTotal
number
Taxable portion of the subtotal, if stored.
taxRate
any
Estimate-level tax rate, if stored. Fraction, percent, or display string.
itemCostTotal
number
Total item cost, if stored.
laborCostTotal
number
Total labor cost, if stored.
totalsSnapshot
object
A stored snapshot of computed totals, if present.nullable
currencyrequired
string
terms
integer
Payment terms in days.
notes
string
nullable
discountName
string
Label for the applied discount, if any.nullable
organizationCompanyId
string
The issuing company (sub-org) id.nullable
billedFrom
any
Snapshot of the issuing company. Omitted when not snapshotted.nullable
appointmentId
string
Linked appointment number, if any.nullable
appointmentUUID
string
Linked appointment short code, if any.nullable
appointmentDocId
string
Linked appointment document id, if any.nullable
customFields
object
Arbitrary organization-defined custom fields.
convertedToInvoiceId
string
The invoice document id this estimate was converted into, if any.nullable
convertedToInvoiceUuid
string
The short code of the invoice this estimate was converted into, if any.nullable
convertedAt
string <date-time>
When the estimate was converted to an invoice, if it was.nullable
issueDate
string <date-time>
The estimate creation timestamp.nullable
expiryDate
string <date-time>
When the estimate expires, if set. Alias of expiresAt.nullable
expiresAt
string <date-time>
When the estimate expires, if set (alias of expiryDate).nullable
reminderSentAt
string <date-time>
When a reminder was last sent for this estimate (read-only).nullable
createdAt
string <date-time>
nullable
updatedAt
string <date-time>
nullable

Errors

401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
404No such resource in this organization
429Rate limited
500Unexpected server error
POST/estimates/{id}/convert-to-invoice

Convert an estimate to an invoice

Creates a new invoice from the estimate, copying its line items, client fields, and billed-from fields. The new invoice starts as status "draft" with balance equal to its total and amountPaid 0. The estimate is stamped with the resulting invoice id. Guards against double-conversion: if the estimate was already converted, returns 422. Requires both scopes: estimates:write and invoices:write.

Parameters

Path

idrequired
string
The estimate document id.

Response 201

FieldTypeDescription
idrequired
string
objectrequired
string
number
integer
nullable
clientId
string
nullable
statusrequired
string
lineItemsrequired
array of object
entryId
string
Stable identifier for the line row.
itemId
string
Optional reference to a catalog item or service.nullable
namerequired
string
description
string
quantityrequired
number
unitPricerequired
number
unitCost
number
Optional internal cost per unit. Omitted when not set.
taxable
boolean
Whether the line is taxable. Defaults to true on create. Omitted from output when not set.
taxRate
any
Tax rate for the line. May be a fraction (0.1), a whole percent (10), or a display string ("10%"). Omitted from output when not set.
amountrequired
number
Computed line total (quantity * unitPrice).
type
string
Line type. Defaults to "item". Omitted from output when not set.
subtotalrequired
number
taxTotalrequired
number
totalrequired
number
balancerequired
number
amountPaidrequired
number
currencyrequired
string
convertedFromEstimateId
string
nullable
createdAt
string <date-time>
nullable
updatedAt
string <date-time>
nullable

Errors

401Bad, missing, or revoked key
402The prepaid balance has nothing left for API requests past the included pool, or the trial requests are used up
403Lacks scope, plan without API access, live key on a trial, test key writing, or feature switched off
404No such resource in this organization
422Rejected by a business rule
429Rate limited
500Unexpected server error