BlueSuite Developers
REST API v1

Quotes

Quotes in the BlueSuite REST API

Create drafts, edit pricing, and track quote status. Creating a quote or setting its status does not deliver it to the customer. Use Notifications with type: "quote_to_customer" and the quote ID to send it using the workspace's email/SMS settings.

reminders_enabled controls reminders. waive_credit_card_fee overrides the workspace's online processing fee for this record. Record deposits through Payments. See line items for the shared pricing structure.

List filters status and exclude_statuses accept comma-separated values; tag_ids matches any selected tag.

Example: create a draft

curl 'https://my.bluesuite.app/api/v1/quotes' \
  -H "Authorization: Bearer $BLUESUITE_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"contact_id":42,"name":"Window cleaning","status":"draft","line_items":[{"name":"Window cleaning","quantity":1,"unitPrice":150}],"total":150}'

GET /api/v1/quotes

GET /api/v1/quotes

Required scopes: quotes:read.

Query parameters

FieldType / accepted valuesRequiredDetails
pageintegerNoPage number, starting at 1. Default: 1.
per_pageintegerNoRecords per page, from 1 to 100. Default: 25. minimum: 1. maximum: 100.
searchstringNoSearch text. maxLength: 100.
sort_bystringNoSort column. See the supported columns below when listed.
sort_direction"asc", "desc"NoSort direction. Default: "desc".
contact_idstringNoFilter by contact ID.
exclude_statusesstringNoComma-separated statuses to exclude.
statusstringNoFilter by status.
tag_idsstringNoComma-separated tag IDs. Tags must match this resource type.

Response

200 with { "success": true, "data": [...], "pagination": { "page": 1, "per_page": 25, "total_pages": 1 } }.

See response conventions and errors.

POST /api/v1/quotes

POST /api/v1/quotes

Required scopes: quotes:write.

JSON body

FieldType / accepted valuesRequiredDetails
namestring or nullNo
contact_idinteger or nullNo
property_idinteger or nullNo
request_idinteger or nullNo
salesperson_idstring or nullNo
template_idinteger or nullNo
datestringNo
expire_onstring or string or nullNo
messagestring or nullNo
payment_instructionsstring or nullNo
line_itemsarray of object or objectNomaxItems: 500.
line_items[]._type"lineItem"NoFor lineItem rows. Defaults to lineItem when omitted.
line_items[].namestringFor this variantFor lineItem rows. Item name
line_items[].descriptionstring or nullNoFor lineItem rows. Additional description
line_items[].quantitynumberNoFor lineItem rows. Quantity Default: 1.
line_items[].unitPricenumberFor this variantFor lineItem rows. Unit price
line_items[].unitCostnumberNoFor lineItem rows. What this costs the business, per unit. Only used when cost tracking is enabled. minimum: 0.
line_items[].taxablebooleanNoFor lineItem rows. Whether the item is taxable
line_items[].optionalbooleanNoFor lineItem rows. Whether the item is optional
line_items[]._type"image"For this variantFor image rows.
line_items[].image_pathstringFor this variantFor image rows. Storage path returned by /uploads minLength: 1.
line_items[].image_idinteger or nullNoFor image rows. Upload link ID returned by /uploads
line_items[].descriptionstring or nullNoFor image rows. Caption shown beneath the image
discountnumberNoDefault: 0.
discount_unit"%", "$"NoDefault: "%".
depositnumberNoDefault: 0.
deposit_unit"%", "$"NoDefault: "%".
tax_ratenumberNoDefault: 0.
tax_rate_idinteger or nullNo
totalnumberNoDefault: 0.
reminders_enabledbooleanNoDefault: true.
waive_credit_card_feebooleanNoSkip the workspace's online processing fee for this record. Carries over to jobs and invoices created from it. Default: false.
status"draft", "awaiting_response", "accepted", "declined", "expired", "archived", "awaiting_deposit"NoDefault: "draft".
custom_fieldsJSON value or nullNo

Unknown body fields are rejected. Conditional requirements are explained above.

Response

201 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

GET /api/v1/quotes/:id

GET /api/v1/quotes/:id

Required scopes: quotes:read.

Path parameters: id. Use positive integer record IDs from this workspace.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

PUT /api/v1/quotes/:id

PUT /api/v1/quotes/:id

Required scopes: quotes:write.

Path parameters: id. Use positive integer record IDs from this workspace.

JSON body

FieldType / accepted valuesRequiredDetails
namestring or nullNo
contact_idinteger or nullNo
property_idinteger or nullNo
request_idinteger or nullNo
salesperson_idstring or nullNo
template_idinteger or nullNo
datestringNo
expire_onstring or string or nullNo
messagestring or nullNo
payment_instructionsstring or nullNo
line_itemsarray of object or objectNomaxItems: 500.
line_items[]._type"lineItem"NoFor lineItem rows. Defaults to lineItem when omitted.
line_items[].namestringFor this variantFor lineItem rows. Item name
line_items[].descriptionstring or nullNoFor lineItem rows. Additional description
line_items[].quantitynumberNoFor lineItem rows. Quantity Default: 1.
line_items[].unitPricenumberFor this variantFor lineItem rows. Unit price
line_items[].unitCostnumberNoFor lineItem rows. What this costs the business, per unit. Only used when cost tracking is enabled. minimum: 0.
line_items[].taxablebooleanNoFor lineItem rows. Whether the item is taxable
line_items[].optionalbooleanNoFor lineItem rows. Whether the item is optional
line_items[]._type"image"For this variantFor image rows.
line_items[].image_pathstringFor this variantFor image rows. Storage path returned by /uploads minLength: 1.
line_items[].image_idinteger or nullNoFor image rows. Upload link ID returned by /uploads
line_items[].descriptionstring or nullNoFor image rows. Caption shown beneath the image
discountnumberNoDefault: 0.
discount_unit"%", "$"NoDefault: "%".
depositnumberNoDefault: 0.
deposit_unit"%", "$"NoDefault: "%".
tax_ratenumberNoDefault: 0.
tax_rate_idinteger or nullNo
totalnumberNoDefault: 0.
reminders_enabledbooleanNoDefault: true.
waive_credit_card_feebooleanNoSkip the workspace's online processing fee for this record. Carries over to jobs and invoices created from it. Default: false.
status"draft", "awaiting_response", "accepted", "declined", "expired", "archived", "awaiting_deposit"NoDefault: "draft".
custom_fieldsJSON value or nullNo

Unknown body fields are rejected. Conditional requirements are explained above.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

DELETE /api/v1/quotes/:id

DELETE /api/v1/quotes/:id

Required scopes: quotes:write.

Path parameters: id. Use positive integer record IDs from this workspace.

No request body.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

PUT /api/v1/quotes/:id/status

PUT /api/v1/quotes/:id/status

Required scopes: quotes:write.

Path parameters: id. Use positive integer record IDs from this workspace.

JSON body

FieldType / accepted valuesRequiredDetails
status"draft", "awaiting_response", "accepted", "declined", "expired", "archived", "awaiting_deposit"Yes
commentstringNo

Unknown body fields are rejected. Conditional requirements are explained above.

Response

200 with { "success": true, "data": ... }. The data contains the result of the operation.

See response conventions and errors.

On this page