Authentication
API keys, scopes, test mode and rate limits.
Eight endpoints cover the catalogue, stock and orders. Orders are booked as sales the moment they arrive.
Applies to every endpoint.
/api/public/v1. Examples here use https://app.simplebks.com/api/public/v1.success.Authorization: Bearer sbk_live_.... See Authentication.?page=1&limit=25, with a maximum limit of 100. List responses include a pagination object.Idempotency-Key header on POST and PATCH orders. A retry with the same key never creates or settles twice.| Method and path | Scope | What it does |
|---|---|---|
GET /products | catalogue:read | Sellable products. Query: search, sku, updated_since (ISO date), parent_id |
GET /products/:sku | catalogue:read | One product by SKU. 404 if unknown |
PUT /products/:sku/image | images:write | Set the product picture from a public image URL (8 MB limit) |
GET /categories | catalogue:read | Product tags, for mapping to your site categories |
GET /stock | stock:read | Quantity per SKU, plus the online location quantity when one is set. Query: sku |
POST /orders | orders:write | Create an order, booked as a sale |
GET /orders/:orderNumber | orders:read | Status, payment state and totals |
PATCH /orders/:orderNumber | orders:write | Report payment.confirmed, fulfilled or cancelled |
Every sellable item is one row, so one SKU maps to one variation on your site.
curl "https://app.simplebks.com/api/public/v1/products?updated_since=2026-10-01&limit=2" \
-H "Authorization: Bearer sbk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
Each product has id, sku, name, description, barcode, tags, color, size, measurement, sellingPrice, image, isVariant, parentId, stock, orderRule, createdAt and updatedAt. orderRule is read-only (minimum order quantity and multiple) or null.
If the business has set an online stock location in Settings, Developer API, each stock row also carries that location's quantity. Sell from onlineLocation.quantity when it is present, otherwise quantity. Raw materials, archived products and products excluded from the online location are never returned.
The order is recorded as a sale straight away. Repeat customers are matched by phone or email, so no duplicates are made.
{
"reference": "SHOP-1042",
"customer": { "name": "Ada Obi", "phone": "08030000000", "email": "[email protected]" },
"items": [ { "sku": "CQ-001", "quantity": 2, "price": 5000 } ],
"shippingFee": 1500,
"paymentStatus": "paid",
"paymentMethod": "paystack",
"gatewayReference": "YOUR-GATEWAY-REFERENCE",
"shippingAddress": "12 Example Street, Lagos",
"notes": "Gift wrap"
}
curl -X POST "https://app.simplebks.com/api/public/v1/orders" \
-H "Authorization: Bearer sbk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Idempotency-Key: SHOP-1042" \
-H "Content-Type: application/json" \
-d @order.json
customer.name and at least one item. Each item needs sku and a quantity of 1 or more. price is optional and defaults to the catalogue price. A negative price is rejected.errors.paymentMethod is one of paystack, card, transfer, cod, cash. paymentStatus: "paid" settles it at once.reference again returns the existing order with duplicate: true.quantityAdjustments. If the rounded quantity is more than you hold, the order is refused with 422 ORDER_QUANTITY_RULE.orderNumber (for example WEB-00012), status, paymentStatus, items, subtotal, shippingFee, total, saleReference, needsAttention, quantityAdjustments and createdAt.Simplebks does the bookkeeping. Send one event per call.
curl -X PATCH "https://app.simplebks.com/api/public/v1/orders/WEB-00012" \
-H "Authorization: Bearer sbk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{"event":"payment.confirmed","method":"paystack","reference":"YOUR-GATEWAY-REFERENCE"}'
payment.confirmed settles the customer's balance. paystack and card go to the gateway clearing account, cod and cash to Cash, transfer to the transfers clearing account. Repeat calls are safe.fulfilled marks the order delivered or collected.cancelled reverses the sale and restores stock. An order that is already paid is refused with 409: handle that as a refund inside Simplebks.Your site owns the pictures. Send the newest one and Simplebks adopts it.
curl -X PUT "https://app.simplebks.com/api/public/v1/products/SK-0012/image" \
-H "Authorization: Bearer sbk_live_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
-H "Content-Type: application/json" \
-d '{"url":"https://yoursite.example/img/tee.jpg"}'
The URL must be publicly reachable and return real image bytes up to 8 MB. Sending the same picture again returns unchanged: true. An unknown SKU is 404; a bad or unreachable URL is 422. This needs the images:write scope.
Yes. The order is recorded as a sale at once, so revenue, the customer balance and stock all update.
Send an Idempotency-Key header, and use a stable reference. The same reference returns the existing order.
Use updated_since on the products endpoint, or subscribe to webhooks for order and stock changes.
A public API key is strict: the order is refused with 422 and each problem listed. WooCommerce orders are handled differently, see the WooCommerce page.
The product serves one at /api/public/v1/openapi.json on your API host.
Start free and send your first test order.