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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Query parameters

NameTypeDescription
archivedstring

Response 200

FieldTypeDescription
customersarray of object
customers[].idinteger
customers[].company_idinteger
customers[].namestring
customers[].emailstring, or null
customers[].phonestring, or null
customers[].addressstring, or null
customers[].cis_ratenumber, or null
customers[].terms_daysinteger, or null
customers[].notesstring, or null
customers[].created_atstring (date-time)
customers[].updated_atstring (date-time)
customers[].archived_atstring (date-time), or null
customers[].invoicesboolean
customers[].owedany
customers[].last_invoiceboolean
customers[].contactsarray 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Request body JSON

NameTypeDescription
contactsarray of any

Response 201

FieldTypeDescription
idinteger
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequirednumber

Request body JSON

NameTypeDescription
namestring
emailstring
phonestring
addressstring
notesstring
cis_rateanyCIS deduction rate for construction customers.
terms_daysstringPayment terms in days.
archivedany
contactsarray of any

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
404Customer 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Response 200

FieldTypeDescription
settingsarray of any
email_enabledboolean
email_fromstring, 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Request body JSON

NameTypeDescription
invoice_prefixany
next_invoice_nonumber
default_terms_daysnumber
bank_account_namestring
bank_sort_codeany
bank_account_noany
invoice_footerstring

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
400The prefix can only use letters, numbers, - _ /
400The next invoice number must be 1 or more
400Payment terms must be 0–365 days
400A sort code is 6 digits
400An 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Query parameters

NameTypeDescription
statusstring
customer_idnumber
tax_yearstring
qstring
limitnumber
offsetnumber

Response 200

FieldTypeDescription
invoicesarray of any
moreboolean
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Query parameters

NameTypeDescription
tax_yearany

Response 200

FieldTypeDescription
owedobject
owed.invoicesinteger
owed.amountany
owed.overdue_invoicesnumber
owed.overdueany
draftsinteger
tax_yearany
yearobject
year.invoicesinteger
year.invoicedany
year.invoiced_netany
year.vatany
year.cisany
year.receivedany
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger

Response 201

FieldTypeDescription
idinteger
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Response 200

FieldTypeDescription
invoiceany
editableboolean
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
409Imported invoices can't be edited
409This 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Response 201

FieldTypeDescription
idinteger
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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
409Only 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
409Delete 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/send

Channel '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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Request body JSON

NameTypeDescription
channelstringemail (Bramble emails it) or share (you sent it yourself; just records it).
toanyRecipient, with email.
ccanyCopy recipients.
messagestringThe email's message.

Response 200

FieldTypeDescription
okboolean
numberany
Example response
JSON
{
  "ok": true,
  "number": null
}

Errors

StatusMessage
400Choose who to send it to
400"…" isn't a valid email address
409This invoice is void
409Email sending isn't set up yet — use Share, or ask an admin to set it up in Admin → SimpleBooks → Email.
502The 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Query parameters

NameTypeDescription
downloadstring

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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger

Request body JSON

NameTypeDescription
paid_onanyThe date.
amountanyHow much.
methodstringHow it was paid.
notestring

Response 201

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
400Enter the date it was paid (not in the future)
400Enter the amount received
409Send 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_id cookies from Bramble sign-in).
Licence: SimpleBooks.

Path parameters

NameTypeDescription
companyIdrequiredinteger
idrequiredinteger
paymentIdrequirednumber

Response 200

FieldTypeDescription
okboolean
Example response
JSON
{
  "ok": true
}

Errors

StatusMessage
404Payment 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();