Invoices & customers
Customers, invoice settings, invoices, sending them, PDFs, and payments.
#List customers
GET
/api/companies/:companyId/customers- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/customers- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Query parameters
| Name | Type | Description |
|---|---|---|
archived | string |
Response 200
| Field | Type | Description |
|---|---|---|
customers | array of object | |
customers[].id | integer | |
customers[].company_id | integer | |
customers[].name | string | |
customers[].email | string, or null | |
customers[].phone | string, or null | |
customers[].address | string, or null | |
customers[].cis_rate | number, or null | |
customers[].terms_days | integer, or null | |
customers[].notes | string, or null | |
customers[].created_at | string (date-time) | |
customers[].updated_at | string (date-time) | |
customers[].archived_at | string (date-time), or null | |
customers[].invoices | boolean | |
customers[].owed | any | |
customers[].last_invoice | boolean | |
customers[].contacts | array of any |
Example response
JSON
{
"customers": [
{
"id": 42,
"company_id": 7,
"name": "Example name",
"email": "alex@example.com",
"phone": "string",
"address": "string",
"cis_rate": 12.5,
"terms_days": 1,
"notes": "string",
"created_at": "2026-11-12T09:30:00.000Z",
"updated_at": "2026-11-12T09:30:00.000Z",
"archived_at": "2026-11-12T09:30:00.000Z",
"invoices": false,
"owed": null,
"last_invoice": false,
"contacts": []
}
]
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/customers', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Add a customer
POST
/api/companies/:companyId/customers- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/customers- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
contacts | array of any |
Response 201
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/customers', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"contacts":[]}),
});
const data = await res.json();#Update a customer
PUT
/api/companies/:companyId/customers/:id- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/customers/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | number |
Request body JSON
| Name | Type | Description |
|---|---|---|
name | string | |
email | string | |
phone | string | |
address | string | |
notes | string | |
cis_rate | any | CIS deduction rate for construction customers. |
terms_days | string | Payment terms in days. |
archived | any | |
contacts | array of any |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Customer not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/customers/12.5', {
method: 'PUT',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"name":"Example name","email":"alex@example.com","phone":"string","address":"string","notes":"string","cis_rate":"…","terms_days":"string","archived":"…","contacts":[]}),
});
const data = await res.json();#Invoice settings
GET
/api/companies/:companyId/invoice-settings- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoice-settings- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
settings | array of any | |
email_enabled | boolean | |
email_from | string, or null |
Example response
JSON
{
"settings": [],
"email_enabled": true,
"email_from": "alex@example.com"
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoice-settings', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Update invoice settings
PUT
/api/companies/:companyId/invoice-settings- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoice-settings- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
invoice_prefix | any | |
next_invoice_no | number | |
default_terms_days | number | |
bank_account_name | string | |
bank_sort_code | any | |
bank_account_no | any | |
invoice_footer | string |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 400 | The prefix can only use letters, numbers, - _ / |
| 400 | The next invoice number must be 1 or more |
| 400 | Payment terms must be 0–365 days |
| 400 | A sort code is 6 digits |
| 400 | An account number is 8 digits |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoice-settings', {
method: 'PUT',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"invoice_prefix":"…","next_invoice_no":12.5,"default_terms_days":12.5,"bank_account_name":"Example bank account name","bank_sort_code":"…","bank_account_no":"…","invoice_footer":"string"}),
});
const data = await res.json();#List invoices
GET
/api/companies/:companyId/invoices- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Query parameters
| Name | Type | Description |
|---|---|---|
status | string | |
customer_id | number | |
tax_year | string | |
q | string | |
limit | number | |
offset | number |
Response 200
| Field | Type | Description |
|---|---|---|
invoices | array of any | |
more | boolean |
Example response
JSON
{
"invoices": [],
"more": false
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Money owed right now, plus this tax year's invoicing — for Home and Tax year
GET
/api/companies/:companyId/invoices/summary- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/summary- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Query parameters
| Name | Type | Description |
|---|---|---|
tax_year | any |
Response 200
| Field | Type | Description |
|---|---|---|
owed | object | |
owed.invoices | integer | |
owed.amount | any | |
owed.overdue_invoices | number | |
owed.overdue | any | |
drafts | integer | |
tax_year | any | |
year | object | |
year.invoices | integer | |
year.invoiced | any | |
year.invoiced_net | any | |
year.vat | any | |
year.cis | any | |
year.received | any |
Example response
JSON
{
"owed": {
"invoices": 1,
"amount": null,
"overdue_invoices": 12.5,
"overdue": null
},
"drafts": 1,
"tax_year": null,
"year": {
"invoices": 1,
"invoiced": null,
"invoiced_net": null,
"vat": null,
"cis": null,
"received": null
}
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/summary', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Create an invoice
POST
/api/companies/:companyId/invoices- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer |
Response 201
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Get an invoice
GET
/api/companies/:companyId/invoices/:id- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
invoice | any | |
editable | boolean |
Example response
JSON
{
"invoice": null,
"editable": false
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Update an invoice
PUT
/api/companies/:companyId/invoices/:id- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 409 | Imported invoices can't be edited |
| 409 | This invoice has payments or is closed, so it can no longer be changed |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42', {
method: 'PUT',
credentials: 'include',
});
const data = await res.json();#Copy an invoice
POST
/api/companies/:companyId/invoices/:id/duplicate- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/duplicate- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Response 201
| Field | Type | Description |
|---|---|---|
id | integer |
Example response
JSON
{
"id": 42
}Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/duplicate', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Delete a draft invoice
DELETE
/api/companies/:companyId/invoices/:id- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 409 | Only drafts can be deleted — void a sent invoice instead |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42', {
method: 'DELETE',
credentials: 'include',
});
const data = await res.json();#Void an invoice
POST
/api/companies/:companyId/invoices/:id/void- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/void- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 409 | Delete the draft instead |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/void', {
method: 'POST',
credentials: 'include',
});
const data = await res.json();#Send an invoice
POST
/api/companies/:companyId/invoices/:id/sendChannel 'share' (phone share / download — just records it) or 'email' (sent from here with the PDF attached): { to: [], cc: [], message }
- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/send- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
channel | string | email (Bramble emails it) or share (you sent it yourself; just records it). |
to | any | Recipient, with email. |
cc | any | Copy recipients. |
message | string | The email's message. |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean | |
number | any |
Example response
JSON
{
"ok": true,
"number": null
}Errors
| Status | Message |
|---|---|
| 400 | Choose who to send it to |
| 400 | "…" isn't a valid email address |
| 409 | This invoice is void |
| 409 | Email sending isn't set up yet — use Share, or ask an admin to set it up in Admin → SimpleBooks → Email. |
| 502 | The email couldn't be sent: …. The invoice is saved as … — try again or use Share. |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/send', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"channel":"string","to":"…","cc":"…","message":"Saved"}),
});
const data = await res.json();#An invoice as PDF
GET
/api/companies/:companyId/invoices/:id/pdf- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/pdf- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Query parameters
| Name | Type | Description |
|---|---|---|
download | string |
Response
A body.
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/pdf', {
method: 'GET',
credentials: 'include',
});
const data = await res.json();#Record a payment
POST
/api/companies/:companyId/invoices/:id/payments- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/payments- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
paid_on | any | The date. |
amount | any | How much. |
method | string | How it was paid. |
note | string |
Response 201
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 400 | Enter the date it was paid (not in the future) |
| 400 | Enter the amount received |
| 409 | Send the invoice before recording a payment |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/payments', {
method: 'POST',
credentials: 'include',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({"paid_on":"…","amount":"…","method":"string","note":"string"}),
});
const data = await res.json();#Remove a payment
DELETE
/api/companies/:companyId/invoices/:id/payments/:paymentId- Address
https://<your-org>.brambleit.cloud/simplebooks/api/companies/:companyId/invoices/:id/payments/:paymentId- Requires
- Signed-in browser session (the
sso_session/session_idcookies from Bramble sign-in).
Licence: SimpleBooks.
Path parameters
| Name | Type | Description |
|---|---|---|
companyIdrequired | integer | |
idrequired | integer | |
paymentIdrequired | number |
Response 200
| Field | Type | Description |
|---|---|---|
ok | boolean |
Example response
JSON
{
"ok": true
}Errors
| Status | Message |
|---|---|
| 404 | Payment not found |
Example request
JavaScript
// From a page served by Bramble (uses the signed-in session)
const res = await fetch('/simplebooks/api/companies/1/invoices/42/payments/12.5', {
method: 'DELETE',
credentials: 'include',
});
const data = await res.json();Was this page helpful?
Thanks for your feedback.