Quotes
Manage quotes via the REST API
List Quotes
Retrieve a paginated list of quotes.
GET /api/v1/quotesRequired Scope: quotes:read
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
per_page | integer | 25 | Results per page (1-100) |
search | string | Search filter | |
sort_by | string | Field to sort by | |
sort_direction | string | desc | Sort direction (asc or desc) |
contact_id | integer | Filter by contact ID | |
status | string | Comma-separated list of statuses to filter by (e.g. draft,accepted). Options: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit | |
exclude_statuses | string | Comma-separated list of statuses to exclude (e.g. archived,expired). Options: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit |
curl https://app.bluesuite.com/api/v1/quotes?page=1&per_page=10&contact_id=42&status=draft,awaiting_response \
-H "Authorization: Bearer wk_YOUR_API_KEY"{
"success": true,
"data": [
{
"id": 1,
"number": 2001,
"name": "Window cleaning quote",
"status": "draft",
"contact_id": 42,
"total": 350.00,
"date": "2025-03-12",
"expire_on": "2025-04-12",
"created_at": "2025-03-12T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total_pages": 2
}
}Create Quote
Create a new quote. The number is auto-generated.
POST /api/v1/quotesRequired Scope: quotes:write
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | Name or title of the quote |
contact_id | integer | No | ID of the associated contact |
property_id | integer | No | ID of the associated property |
request_id | integer | No | ID of the originating request |
salesperson_id | string (UUID) | No | ID of the assigned salesperson |
template_id | integer | No | ID of the quote template to use |
date | string | No | Quote date |
expire_on | string | No | Expiration date |
message | string | No | Message to the customer |
payment_instructions | string | No | Payment instructions |
line_items | array | No | Array of line item objects (see Line Items) |
discount | number | No | Discount amount. Defaults to 0 |
discount_unit | string | No | Discount unit: % or $. Defaults to % |
deposit | number | No | Required deposit amount. Defaults to 0 |
deposit_unit | string | No | Deposit unit: % or $. Defaults to % |
tax_rate | number | No | Tax rate percentage. Defaults to 0 |
tax_rate_id | integer | No | ID of a saved tax rate |
total | number | No | Quote total. Defaults to 0 |
status | string | No | One of: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit. Defaults to draft |
custom_fields | any | No | Custom field values |
curl -X POST https://app.bluesuite.com/api/v1/quotes \
-H "Authorization: Bearer wk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Window cleaning quote",
"contact_id": 42,
"request_id": 1,
"date": "2025-03-12",
"expire_on": "2025-04-12",
"message": "Thank you for your inquiry. Please find our quote below.",
"line_items": [
{ "name": "Exterior window cleaning", "quantity": 12, "unitPrice": 25.00 },
{ "name": "Interior window cleaning", "quantity": 12, "unitPrice": 15.00 }
],
"tax_rate": 10,
"total": 528.00
}'{
"success": true,
"data": {
"id": 1,
"number": 2001,
"name": "Window cleaning quote",
"contact_id": 42,
"request_id": 1,
"status": "draft",
"date": "2025-03-12",
"expire_on": "2025-04-12",
"message": "Thank you for your inquiry. Please find our quote below.",
"line_items": [
{ "_type": "lineItem", "id": "a1b2c3d4-...", "name": "Exterior window cleaning", "description": null, "quantity": 12, "unitPrice": 25.00 },
{ "_type": "lineItem", "id": "e5f6a7b8-...", "name": "Interior window cleaning", "description": null, "quantity": 12, "unitPrice": 15.00 }
],
"tax_rate": 10,
"total": 528.00,
"workspace_id": 123,
"created_at": "2025-03-12T10:00:00.000Z"
}
}Get Quote
Retrieve a single quote by ID. Returns the expanded quote with related data.
GET /api/v1/quotes/:idRequired Scope: quotes:read
curl https://app.bluesuite.com/api/v1/quotes/1 \
-H "Authorization: Bearer wk_YOUR_API_KEY"{
"success": true,
"data": {
"id": 1,
"number": 2001,
"name": "Window cleaning quote",
"status": "awaiting_response",
"contact_id": 42,
"property_id": 7,
"request_id": 1,
"salesperson_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"date": "2025-03-12",
"expire_on": "2025-04-12",
"message": "Thank you for your inquiry. Please find our quote below.",
"payment_instructions": null,
"line_items": [
{ "_type": "lineItem", "id": "a1b2c3d4-...", "name": "Exterior window cleaning", "description": null, "quantity": 12, "unitPrice": 25.00 },
{ "_type": "lineItem", "id": "e5f6a7b8-...", "name": "Interior window cleaning", "description": null, "quantity": 12, "unitPrice": 15.00 }
],
"discount": 0,
"discount_unit": "%",
"deposit": 0,
"deposit_unit": "%",
"tax_rate": 10,
"total": 528.00,
"workspace_id": 123,
"created_at": "2025-03-12T10:00:00.000Z"
}
}Update Quote
Update an existing quote. All fields are optional -- only include the fields you want to change.
PUT /api/v1/quotes/:idRequired Scope: quotes:write
Request Body:
All fields from Create Quote are accepted. Only provided fields will be updated.
curl -X PUT https://app.bluesuite.com/api/v1/quotes/1 \
-H "Authorization: Bearer wk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"discount": 10,
"discount_unit": "%",
"total": 475.20
}'{
"success": true,
"data": {
"id": 1,
"number": 2001,
"name": "Window cleaning quote",
"status": "draft",
"discount": 10,
"discount_unit": "%",
"total": 475.20,
"workspace_id": 123,
"created_at": "2025-03-12T10:00:00.000Z"
}
}Delete Quote
Delete a quote by ID.
DELETE /api/v1/quotes/:idRequired Scope: quotes:write
curl -X DELETE https://app.bluesuite.com/api/v1/quotes/1 \
-H "Authorization: Bearer wk_YOUR_API_KEY"{
"success": true,
"data": {
"deleted": true
}
}Update Quote Status
Update only the status of a quote. When the status is set to accepted, a Job is automatically created from the quote.
PUT /api/v1/quotes/:id/statusRequired Scope: quotes:write
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
status | string | Yes | One of: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit |
comment | string | No | Optional comment for the status change |
curl -X PUT https://app.bluesuite.com/api/v1/quotes/1/status \
-H "Authorization: Bearer wk_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "accepted",
"comment": "Customer accepted via phone"
}'{
"success": true,
"data": {
"id": 1,
"number": 2001,
"name": "Window cleaning quote",
"status": "accepted",
"workspace_id": 123
}
}Line Items
Line items represent individual services or products on a quote. When creating or updating a quote, provide line items in this format:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Item name |
description | string | No | Additional description |
quantity | number | No | Quantity (default: 1) |
unitPrice | number | Yes | Unit price |
taxable | boolean | No | Whether the item is taxable |
optional | boolean | No | Whether the item is optional |
The API automatically assigns each line item a unique id and _type field. Response objects will include these generated fields.
{
"line_items": [
{ "name": "Exterior window cleaning", "quantity": 12, "unitPrice": 25.00 },
{ "name": "Interior window cleaning", "quantity": 12, "unitPrice": 15.00, "description": "Includes screens" }
]
}