REST endpoints for quotes in ServFlo: 13 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
Quotes (Q-n) newest first, filtered by text, status, customer or request; paged with a total. totalCents is the approved total, else the lowest option's total. Sent quotes past validUntil read as EXPIRED. Read-only.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
items[].taxRate
number
Tax rate in percent.
items[].depositPercent
number or null
Deposit asked, as a percent of the total.
items[].depositCents
integer or null
Deposit asked, as a fixed amount in cents.
items[].internalNotes
string or null
items[].publicToken
string
The customer link token: the quote page is /q/{publicToken}.
items[].sentAt
string (date-time) or null
items[].approvedAt
string (date-time) or null
items[].approvedOptionId
string or null
items[].approvedLineIds
array of string
The optional lines the customer kept.
items[].approvedTotalCents
integer or null
Approved total in cents, with tax.
items[].approvedDepositCents
integer or null
Approved deposit in cents.
items[].signatureName
string or null
items[].approvedByStaff
boolean
Staff recorded the approval for the customer.
items[].changesRequestedAt
string (date-time) or null
items[].changesRequestedNote
string or null
items[].declinedAt
string (date-time) or null
items[].declineReason
string or null
items[].jobId
string or null
The job it was converted to.
items[].invoiceId
string or null
The invoice it was converted to.
items[].convertedAt
string (date-time) or null
items[].memberPricingRemoved
boolean
items[].soldByUserId
string or null
items[].soldByTechnicianId
string or null
items[].financingDisabled
boolean
items[].businessUnitId
string or null
items[].customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
items[].createdAt
string (date-time)
items[].updatedAt
string (date-time)
items[].customer
object
items[].customer.id
string
items[].customer.name
string
items[].businessUnit
object or null
The business unit.
items[].businessUnit.id
string
items[].businessUnit.name
string
items[].property
object or null
items[].property.id
string
Property id.
items[].property.name
string or null
items[].property.address
string or null
items[].property.city
string or null
items[].optionCount
integer
items[].totalCents
integer
The approved total, else the lowest option's total (with tax), in integer cents.
Creates a DRAFT quote (Q-n) for a customer with options and lines. Tax is 0 for tax-exempt customers, else taxRate, else the property's rate. Without options, one empty option is made. Nothing is sent: POST /quotes/{quoteId}/send marks it sent and the customer opens /q/{token}.
Quote custom field values (GET /custom-fields?entity=QUOTE); those marked visibleToCustomer print on the quote. Required ones are checked when the quote is created here.
propertyId
string or null
No
requestId
string or null
No
title
string or null
No
Up to 500 characters.
message
string or null
No
validUntil
empty string or string or null
No
taxRate
number
No
-1000–1000.
depositPercent
number or null
No
0–100.
depositCents
integer or null
No
0–100000000.
internalNotes
string or null
No
options
array of object
No
Up to 10 items.
options[].name
string or null
No
Up to 200 characters.
options[].description
string or null
No
Up to 5000 characters.
options[].imageUrl
string or null
No
In-home presenter: a picture of this option; else its first pricebook item's image. Up to 2000 characters.
options[].highlights
array of string
No
In-home presenter: feature bullets compared side by side across options. Up to 12 items.
options[].warranty
string or null
No
In-home presenter: the warranty shown with this option. Up to 500 characters.
options[].recommended
boolean
No
In-home presenter: mark as the recommended option.
options[].lines
array of object
Yes
Up to 200 items.
options[].lines[].description
string
Yes
options[].lines[].quantity
number
Yes
-1000000–1000000.
options[].lines[].unitPriceCents
integer
Yes
Money in integer cents; negative for a discount or credit line. -100000000–100000000.
options[].lines[].optional
boolean
No
options[].lines[].defaultSelected
boolean
No
options[].lines[].serviceTypeId
string or null
No
options[].lines[].materialId
string or null
No
options[].lines[].kind
enum or null
No
For member pricing: SERVICE (labour, the default) or MATERIAL get the member discount for their kind; MEMBERSHIP (a plan fee) is never discounted. Discount lines are added by the server. One of SERVICE, MATERIAL, MEMBERSHIP.
options[].lines[].pricebookItemId
string or null
No
The pricebook item the line was picked from (GET /pricebook/items): the server snapshots its cost; later pricebook edits never change this quote.
options[].lines[].memberPriceApplied
boolean or null
No
The line is priced at the item's member price (memberPriceCents); the plan's member discount then skips it. Kept only for items that have a member price.
memberPricing
boolean
No
Member pricing: a member customer's quote gets the plan's discount lines automatically; false removes them from this quote, true restores them.
soldByTechnicianId
string or null
No
The technician who sold it, for commissions (GET /technicians/options). Defaults to the creator's linked technician; set on approval when still empty.
financingDisabled
boolean
No
Exposes to customers: true hides Affirm and Klarna ("or about $X/mo", pay the deposit over time) on this quote even when the business offers financing.
businessUnitId
string or null
No
Business unit (GET /business-units): its branding shows on the quote. Omitted on create: the request's unit, the first service line's default, then the seller's home unit. Up to 100 characters.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAt
string (date-time)
updatedAt
string (date-time)
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
customer.address
string or null
customer.city
string or null
customer.state
string or null
customer.zip
string or null
customer.taxExempt
boolean
property
object or null
property.id
string
Property id.
property.name
string or null
property.address
string or null
property.city
string or null
property.state
string or null
property.zip
string or null
property.taxRate
number or null
request
object or null
request.id
string
request.identifier
string
REQ-n
request.status
enum
NEW → ASSESSMENT_SCHEDULED / QUOTED → CONVERTED (a job was booked), or ARCHIVED. One of NEW, ASSESSMENT_SCHEDULED, QUOTED, CONVERTED, ARCHIVED.
job
object or null
job.id
string
job.identifier
string
JOB-n
job.status
enum
SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED or CANCELLED. A job's status is its next open visit's. One of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
invoice
object or null
invoice.id
string
invoice.identifier
string
INV-n
invoice.status
enum
DRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
invoice.totalCents
integer
options
array of object
options[].id
string
Quote option id (for optionId).
options[].quoteId
string
options[].name
string
options[].description
string or null
options[].sortOrder
integer
options[].imageUrl
string or null
options[].highlights
array of string
options[].warranty
string or null
options[].recommended
boolean
options[].lines
array of object
options[].lines[].id
string
Quote line id (for selectedLineIds).
options[].lines[].optionId
string
options[].lines[].description
string
options[].lines[].quantity
number
options[].lines[].unitPriceCents
integer
Unit price, in integer cents.
options[].lines[].optional
boolean
The customer may leave it out.
options[].lines[].defaultSelected
boolean
An optional line's default.
options[].lines[].serviceTypeId
string or null
options[].lines[].materialId
string or null
options[].lines[].sortOrder
integer
options[].lines[].kind
enum or null
SERVICE or MATERIAL (member discount by kind), MEMBER_DISCOUNT (the automatic member pricing line) or MEMBERSHIP (a plan fee). One of SERVICE, MATERIAL, MEMBER_DISCOUNT, MEMBERSHIP.
options[].lines[].pricebookItemId
string or null
options[].lines[].costCents
integer or null
Our unit cost in cents (costing.read only).
options[].lines[].memberPriceApplied
boolean
options[].totals
object
The option's totals in cents with its default lines.
options[].totals.lineTotals
array of integer
options[].totals.included
array of boolean
options[].totals.subtotalCents
integer
options[].totals.taxCents
integer
options[].totals.totalCents
integer
options[].totals.depositCents
integer
memberPricing
object
memberPricing.applied
boolean
Member discount lines are on the document.
memberPricing.removed
boolean
Staff removed the member pricing from this document.
memberPricing.membership
object or null
The customer's active membership that would apply; null when not a member.
memberPricing.membership.membershipId
string
memberPricing.membership.identifier
string
MEM-n
memberPricing.membership.planName
string
memberPricing.membership.serviceDiscountPercent
number
memberPricing.membership.materialDiscountPercent
number
memberPricing.membership.priority
boolean
approvalSnapshot
any
What the customer approved (option, lines, totals), frozen at approval; null before.
Changes the fields sent, until the customer decides. options replaces every option and line (send them all). Moving an expired quote's date forward re-opens it.
Quote custom field values (GET /custom-fields?entity=QUOTE); those marked visibleToCustomer print on the quote. Required ones are checked when the quote is created here.
propertyId
string or null
No
requestId
string or null
No
title
string or null
No
Up to 500 characters.
message
string or null
No
validUntil
empty string or string or null
No
taxRate
number
No
-1000–1000.
depositPercent
number or null
No
0–100.
depositCents
integer or null
No
0–100000000.
internalNotes
string or null
No
options
array of object
No
Up to 10 items.
options[].name
string or null
No
Up to 200 characters.
options[].description
string or null
No
Up to 5000 characters.
options[].imageUrl
string or null
No
In-home presenter: a picture of this option; else its first pricebook item's image. Up to 2000 characters.
options[].highlights
array of string
No
In-home presenter: feature bullets compared side by side across options. Up to 12 items.
options[].warranty
string or null
No
In-home presenter: the warranty shown with this option. Up to 500 characters.
options[].recommended
boolean
No
In-home presenter: mark as the recommended option.
options[].lines
array of object
Yes
Up to 200 items.
options[].lines[].description
string
Yes
options[].lines[].quantity
number
Yes
-1000000–1000000.
options[].lines[].unitPriceCents
integer
Yes
Money in integer cents; negative for a discount or credit line. -100000000–100000000.
options[].lines[].optional
boolean
No
options[].lines[].defaultSelected
boolean
No
options[].lines[].serviceTypeId
string or null
No
options[].lines[].materialId
string or null
No
options[].lines[].kind
enum or null
No
For member pricing: SERVICE (labour, the default) or MATERIAL get the member discount for their kind; MEMBERSHIP (a plan fee) is never discounted. Discount lines are added by the server. One of SERVICE, MATERIAL, MEMBERSHIP.
options[].lines[].pricebookItemId
string or null
No
The pricebook item the line was picked from (GET /pricebook/items): the server snapshots its cost; later pricebook edits never change this quote.
options[].lines[].memberPriceApplied
boolean or null
No
The line is priced at the item's member price (memberPriceCents); the plan's member discount then skips it. Kept only for items that have a member price.
memberPricing
boolean
No
Member pricing: a member customer's quote gets the plan's discount lines automatically; false removes them from this quote, true restores them.
soldByTechnicianId
string or null
No
The technician who sold it, for commissions (GET /technicians/options). Defaults to the creator's linked technician; set on approval when still empty.
financingDisabled
boolean
No
Exposes to customers: true hides Affirm and Klarna ("or about $X/mo", pay the deposit over time) on this quote even when the business offers financing.
businessUnitId
string or null
No
Business unit (GET /business-units): its branding shows on the quote. Omitted on create: the request's unit, the first service line's default, then the seller's home unit. Up to 100 characters.
today
string
No
A calendar date in the business's own calendar, YYYY-MM-DD.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
Destructive: deletes the quote with its options and lines; its customer link stops working. Deposits taken on it stay as payments, no longer linked to a quote. Prefer archiving (POST /quotes/{quoteId}/archive).
Permission
quotes.delete (Owner, Admin)
Risk
sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.
MCP tool
quotes_delete (toolset sales)
Approval
Over MCP, this tool always waits for your approval in ServFlo. See Approvals.
POST /organizations/{organizationId}/quotes/{quoteId}/send
Sends to the customer: marks the quote SENT (records sentAt), which opens its customer page /q/{token} for approval. Nothing is emailed; share the link from GET /quotes/{quoteId}.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
POST /organizations/{organizationId}/quotes/{quoteId}/approve
Acts for the customer: records the customer's approval (e.g. given by phone) of one option; the quote becomes APPROVED and can be converted to a job or invoice and take deposits. selectedLineIds are the optional lines kept; omitted means their defaults. Stores the terms the customer was shown (terms, else the business's current quote terms) and, when they signed on the device, signatureDataUrl. Get option and line ids from GET /quotes/{quoteId}.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
POST /organizations/{organizationId}/quotes/{quoteId}/member-pricing
Member pricing: a member customer's quote gets the plan's discount as separate negative lines per option (services and materials apart, required lines only). applied: false removes them for this quote; applied: true restores them (409 when the customer has no active membership covering the quote's property). Only while the quote can still change (DRAFT, SENT, CHANGES_REQUESTED, EXPIRED; 409 otherwise). Returns the quote with memberPricing.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
createdAt
string (date-time)
updatedAt
string (date-time)
customer
object
customer.id
string
customer.name
string
customer.email
string or null
customer.phone
string or null
customer.address
string or null
customer.city
string or null
customer.state
string or null
customer.zip
string or null
customer.taxExempt
boolean
property
object or null
property.id
string
Property id.
property.name
string or null
property.address
string or null
property.city
string or null
property.state
string or null
property.zip
string or null
property.taxRate
number or null
request
object or null
request.id
string
request.identifier
string
REQ-n
request.status
enum
NEW → ASSESSMENT_SCHEDULED / QUOTED → CONVERTED (a job was booked), or ARCHIVED. One of NEW, ASSESSMENT_SCHEDULED, QUOTED, CONVERTED, ARCHIVED.
job
object or null
job.id
string
job.identifier
string
JOB-n
job.status
enum
SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED or CANCELLED. A job's status is its next open visit's. One of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
invoice
object or null
invoice.id
string
invoice.identifier
string
INV-n
invoice.status
enum
DRAFT (not issued), SENT (issued, money due), PAID, OVERDUE (past dueDate) or CANCELLED. One of DRAFT, SENT, PAID, OVERDUE, CANCELLED.
invoice.totalCents
integer
options
array of object
options[].id
string
Quote option id (for optionId).
options[].quoteId
string
options[].name
string
options[].description
string or null
options[].sortOrder
integer
options[].imageUrl
string or null
options[].highlights
array of string
options[].warranty
string or null
options[].recommended
boolean
options[].lines
array of object
options[].lines[].id
string
Quote line id (for selectedLineIds).
options[].lines[].optionId
string
options[].lines[].description
string
options[].lines[].quantity
number
options[].lines[].unitPriceCents
integer
Unit price, in integer cents.
options[].lines[].optional
boolean
The customer may leave it out.
options[].lines[].defaultSelected
boolean
An optional line's default.
options[].lines[].serviceTypeId
string or null
options[].lines[].materialId
string or null
options[].lines[].sortOrder
integer
options[].lines[].kind
enum or null
SERVICE or MATERIAL (member discount by kind), MEMBER_DISCOUNT (the automatic member pricing line) or MEMBERSHIP (a plan fee). One of SERVICE, MATERIAL, MEMBER_DISCOUNT, MEMBERSHIP.
options[].lines[].pricebookItemId
string or null
options[].lines[].costCents
integer or null
Our unit cost in cents (costing.read only).
options[].lines[].memberPriceApplied
boolean
options[].totals
object
The option's totals in cents with its default lines.
options[].totals.lineTotals
array of integer
options[].totals.included
array of boolean
options[].totals.subtotalCents
integer
options[].totals.taxCents
integer
options[].totals.totalCents
integer
options[].totals.depositCents
integer
memberPricing
object
memberPricing.applied
boolean
Member discount lines are on the document.
memberPricing.removed
boolean
Staff removed the member pricing from this document.
memberPricing.membership
object or null
The customer's active membership that would apply; null when not a member.
memberPricing.membership.membershipId
string
memberPricing.membership.identifier
string
MEM-n
memberPricing.membership.planName
string
memberPricing.membership.serviceDiscountPercent
number
memberPricing.membership.materialDiscountPercent
number
memberPricing.membership.priority
boolean
approvalSnapshot
any
What the customer approved (option, lines, totals), frozen at approval; null before.
DRAFT → SENT (customer can answer at /q/{publicToken}) → APPROVED / CHANGES_REQUESTED / DECLINED; APPROVED → CONVERTED (job or invoice made). SENT past validUntil becomes EXPIRED. One of DRAFT, SENT, APPROVED, CHANGES_REQUESTED, DECLINED, CONVERTED, EXPIRED, ARCHIVED.
taxRate
number
Tax rate in percent.
depositPercent
number or null
Deposit asked, as a percent of the total.
depositCents
integer or null
Deposit asked, as a fixed amount in cents.
internalNotes
string or null
publicToken
string
The customer link token: the quote page is /q/{publicToken}.
sentAt
string (date-time) or null
approvedAt
string (date-time) or null
approvedOptionId
string or null
approvedLineIds
array of string
The optional lines the customer kept.
approvedTotalCents
integer or null
Approved total in cents, with tax.
approvedDepositCents
integer or null
Approved deposit in cents.
signatureName
string or null
approvedByStaff
boolean
Staff recorded the approval for the customer.
changesRequestedAt
string (date-time) or null
changesRequestedNote
string or null
declinedAt
string (date-time) or null
declineReason
string or null
jobId
string or null
The job it was converted to.
invoiceId
string or null
The invoice it was converted to.
convertedAt
string (date-time) or null
memberPricingRemoved
boolean
soldByUserId
string or null
soldByTechnicianId
string or null
financingDisabled
boolean
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=QUOTE).
POST /organizations/{organizationId}/quotes/{quoteId}/job
Books a job (JOB-n) from an APPROVED quote; the quote becomes CONVERTED. Price is the approved total before tax; the approved lines go into the job's notes. Returns the job.
SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED or CANCELLED. A job's status is its next open visit's. One of SCHEDULED, CONFIRMED, IN_PROGRESS, COMPLETED, CANCELLED.
priority
enum
One of LOW, NORMAL, HIGH, URGENT.
scheduledDate
string
The next open visit's day, YYYY-MM-DD.
scheduledTime
string or null
Hh: MM
durationMinutes
integer
priceCents
integer
Job price before tax, in integer cents.
address
string or null
notes
string or null
completionNotes
string or null
What was done.
recurrenceInterval
enum or null
One of WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, YEARLY.
recurrenceParentId
string or null
onMyWayAt
string (date-time) or null
arrivedAt
string (date-time) or null
startedAt
string (date-time) or null
completedAt
string (date-time) or null
signedBy
string or null
Who signed the work off on site.
signedAt
string (date-time) or null
businessUnitId
string or null
customFields
any
Custom field values by key (definitions: GET /custom-fields?entity=JOB).
weatherSensitive
boolean or null
Plans around the weather: overrides the service type; null follows it.
createdAt
string (date-time)
updatedAt
string (date-time)
customer
object
customer.id
string
Customer id.
customer.name
string
customer.phone
string or null
technician
object or null
technician.id
string
Technician id (GET /technicians).
technician.name
string
technician.color
string
Calendar colour, #rrggbb.
serviceType
object or null
serviceType.id
string
serviceType.name
string
serviceType.color
string
businessUnit
object or null
The business unit.
businessUnit.id
string
businessUnit.name
string
asset
object or null
asset.id
string
asset.name
string
asset.serialNumber
string
property
object or null
property.id
string
Property id.
property.name
string or null
property.address
string or null
property.city
string or null
property.taxRate
number or null
nextJobId
string or null
After an update: the next occurrence booked when a recurring job completed.
POST /organizations/{organizationId}/quotes/{quoteId}/invoice
Creates a DRAFT invoice with the approved lines, through the normal invoice rules; deposits paid on the quote move onto it and count as paid. Nothing is sent. Returns the invoice.