BlueSuite API
REST API v1

Quotes

Manage quotes via the REST API

List Quotes

Retrieve a paginated list of quotes.

GET /api/v1/quotes

Required Scope: quotes:read

Query Parameters:

ParameterTypeDefaultDescription
pageinteger1Page number
per_pageinteger25Results per page (1-100)
searchstringSearch filter
sort_bystringField to sort by
sort_directionstringdescSort direction (asc or desc)
contact_idintegerFilter by contact ID
statusstringComma-separated list of statuses to filter by (e.g. draft,accepted). Options: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit
exclude_statusesstringComma-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/quotes

Required Scope: quotes:write

Request Body:

FieldTypeRequiredDescription
namestringNoName or title of the quote
contact_idintegerNoID of the associated contact
property_idintegerNoID of the associated property
request_idintegerNoID of the originating request
salesperson_idstring (UUID)NoID of the assigned salesperson
template_idintegerNoID of the quote template to use
datestringNoQuote date
expire_onstringNoExpiration date
messagestringNoMessage to the customer
payment_instructionsstringNoPayment instructions
line_itemsarrayNoArray of line item objects (see Line Items)
discountnumberNoDiscount amount. Defaults to 0
discount_unitstringNoDiscount unit: % or $. Defaults to %
depositnumberNoRequired deposit amount. Defaults to 0
deposit_unitstringNoDeposit unit: % or $. Defaults to %
tax_ratenumberNoTax rate percentage. Defaults to 0
tax_rate_idintegerNoID of a saved tax rate
totalnumberNoQuote total. Defaults to 0
statusstringNoOne of: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit. Defaults to draft
custom_fieldsanyNoCustom 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/:id

Required 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/:id

Required 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/:id

Required 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/status

Required Scope: quotes:write

Request Body:

FieldTypeRequiredDescription
statusstringYesOne of: draft, awaiting_response, accepted, declined, expired, archived, awaiting_deposit
commentstringNoOptional 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:

FieldTypeRequiredDescription
namestringYesItem name
descriptionstringNoAdditional description
quantitynumberNoQuantity (default: 1)
unitPricenumberYesUnit price
taxablebooleanNoWhether the item is taxable
optionalbooleanNoWhether 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" }
  ]
}

On this page