BSimple API Documentation
This is the current developer reference for the BSimple REST API. The API uses JSON responses and a versioned base path:
https://<your-bsimple-domain>/api/v1
For the business overview, see BSimple API. For a guided first request, see Getting started.
Authentication
Every request requires an API key created by an administrator in Settings → API Keys. The recommended method is the X-API-Key header:
curl --fail --silent \
--header 'X-API-Key: YOUR_API_KEY' \
'https://<your-bsimple-domain>/api/v1/customers/list'
The key secret is shown once at creation. BSimple stores a SHA-256 hash rather than the original secret. If a key is lost, revoke it and create a replacement. Do not put a key in browser JavaScript, source control, screenshots or support tickets.
Scopes
leads:read leads:writeRead or manage leads and lead tagscustomers:read customers:writeRead or manage customers and customer tagsinventory:read inventory:writeRead inventory and quantities, or add inventory itemssuppliers:readRead supplierslocations:readRead inventory locationsreorder:readRead reorder recommendations and PAR datastocktakes:readRead stocktakes, progress, expected items and variancespurchase_orders:readRead purchase orders and linestransfers:readRead stock transfers and linesinvoices:read invoices:writeRead invoices or create draft invoicesA request whose key lacks the required scope returns 403 with an insufficient_scope error. Grant each integration only the scopes it needs.
Response format
Successful requests use a data value and a meta object. List responses include pagination metadata:
{
"data": [],
"meta": {
"page": 1,
"per_page": 20,
"total": 137,
"total_pages": 7
}
}
Errors use an error object and an appropriate HTTP status:
{
"error": {
"code": "CUSTOMER_NOT_FOUND",
"message": "Customer was not found"
}
}
Common statuses are 400 bad request, 401 missing or invalid key, 403 insufficient scope, 404 not found, 409 conflict and 422 validation failure.
List parameters
List endpoints support these common parameters where applicable:
page1-based page number; default 1per_pageRows per page; default 20, maximum 100qFree-text search across searchable fieldssort orderWhitelisted sort column and asc or descinclude_archivedUse 1 to include archived records where supportedstatus, customer_id or supplier_idAlways follow meta.total_pages rather than assuming that one request returns every row.
Leads
/leads/listleads:read/leads/get/<id>leads:read/leads/addleads:write/leads/edit/<id>leads:write/leads/archive/<id>leads:write/leads/tags/list/<id>leads:read/leads/tags/addleads:write/leads/tags/removeleads:writeCustomers
/customers/listcustomers:read/customers/get/<id>customers:read/customers/addcustomers:write/customers/edit/<id>customers:write/customers/archive/<id>customers:write/customers/tags/list/<id>customers:read/customers/tags/addcustomers:write/customers/tags/removecustomers:write/customers/invoices/list/<id>customers:read + invoices:readInventory and suppliers
/inventory/listinventory:read/inventory/get/<code-or-id>inventory:read/inventory/addinventory:write/suppliers/listsuppliers:read/suppliers/get/<id>suppliers:readLocations, PAR and reorder
/locations/listlocations:read/locations/get/<id>locations:read/par/listreorder:read/par/get/<location_id>/<product_id>reorder:read/reorder/listreorder:readStocktakes
/stocktakes/liststocktakes:read/stocktakes/get/<id>stocktakes:read/stocktakes/activestocktakes:read/stocktakes/expected/<id>stocktakes:read/stocktakes/progress/<id>stocktakes:read/stocktakes/not-counted/<id>stocktakes:read/stocktakes/variance/<id>stocktakes:readPurchase orders and transfers
/purchase_orders/listpurchase_orders:read/purchase_orders/get/<id>purchase_orders:read/transfers/listtransfers:read/transfers/get/<id>transfers:readInvoices
/invoices/listinvoices:read/invoices/get/<id>invoices:read/invoices/createinvoices:writeInvoice creation accepts inventory-backed lines with item_code and free-form service lines with description and unit_price. A request can mix both line types. See Create a draft invoice for the complete body and response semantics.
Current limitations
The current public API does not provide webhooks, bulk operations, file attachments, payments, invoice approval or sending, invoice editing or deletion, stocktake-count writes, purchase-order writes, transfer writes or general stock adjustments. Use the polling and reconciliation guide for current integration patterns.
This reference was reviewed on 9 September 2026. See the API changelog for documented changes.