BlueSuite Developers
REST API v1

Invoices

Invoices in the BlueSuite REST API

Create and manage one-off invoices. New type: "recurring" invoices are rejected; use a recurring job schedule for repeating work. Existing legacy recurring invoices remain editable.

Sending and payment

Setting status: "sent" does not email or text the client. Use Notifications with type: "invoice_to_customer" for delivery. A scheduled invoice uses status: "scheduled" together with send_on.

To mark an invoice paid, record money received using Payments. A bare paid status write returns 409 while a balance remains. Fully covered and zero-total invoices can be marked paid. The payment settlement flow accounts for completed payments and applicable quote deposits; pending payments block settlement.

GET /invoices/:id includes payment/balance information. reminders_enabled controls reminders, and waive_credit_card_fee overrides the workspace's online processing fee. See line items.

Example: record the remaining balance as received

curl 'https://my.bluesuite.app/api/v1/payments' \
  -H "Authorization: Bearer $BLUESUITE_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"object_type":"invoice","object_id":101,"category":"payment","settle_remaining":true}'

This records a manual payment and recalculates status. It does not charge a card or send a customer receipt.

GET /api/v1/invoices

GET /api/v1/invoices

Required scopes: invoices: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.
job_idstringNoFilter by job ID.
exclude_childrenstringNoUse true to exclude child invoices.
exclude_statusesstringNoComma-separated statuses to exclude.
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/invoices

POST /api/v1/invoices

Required scopes: invoices:write.

JSON body

FieldType / accepted valuesRequiredDetails
namestring or nullNo
contact_idinteger or nullNo
property_idinteger or nullNo
job_idinteger or nullNo
quote_idinteger or nullNo
salesperson_idstring or nullNo
datestringNo
due_datestringNo
send_onstring or nullNo
messagestring or nullNo
payment_instructionsstring or nullNo
payment_terms"due_on_receipt", "net_7", "net_14", "net_30", "net_60", "net_90"NoDefault: "due_on_receipt".
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. Default: false.
status"draft", "sent", "paid", "overdue", "cancelled", "partially_paid", "scheduled"NoDefault: "draft".
type"one-off", "recurring"NoDefault: "one-off".
custom_fieldsJSON value or nullNo
event_idsarray of integerNo

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

GET /api/v1/invoices/:id

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

PUT /api/v1/invoices/:id

Required scopes: invoices: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
job_idinteger or nullNo
quote_idinteger or nullNo
salesperson_idstring or nullNo
datestringNo
due_datestringNo
send_onstring or nullNo
messagestring or nullNo
payment_instructionsstring or nullNo
payment_terms"due_on_receipt", "net_7", "net_14", "net_30", "net_60", "net_90"NoDefault: "due_on_receipt".
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. Default: false.
status"draft", "sent", "paid", "overdue", "cancelled", "partially_paid", "scheduled"NoDefault: "draft".
type"one-off", "recurring"NoDefault: "one-off".
custom_fieldsJSON value or nullNo
event_idsarray of integerNo

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

DELETE /api/v1/invoices/:id

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

PUT /api/v1/invoices/:id/status

Required scopes: invoices:write.

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

JSON body

FieldType / accepted valuesRequiredDetails
status"draft", "sent", "paid", "overdue", "cancelled", "partially_paid", "scheduled"Yes

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