API Reference
Built for Engineers. Designed for Scale.
RESTful API with predictable resource-oriented URLs, JSON responses, and standard HTTP response codes.
Base URL
https://console.tallyhubgh.com/apiAuthentication
Authenticate requests using Bearer tokens in the Authorization header.
Header
Authorization: Bearer <your_access_token>Tokens come from POST /api/auth/login and are refreshed with POST /api/auth/refresh. Every request is scoped to the organisation the token belongs to.
/api/catalog/productsProducts
Retrieve a list of all products with pagination.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max items per page (default: 20, max: 100) |
| offset | integer | Number of items to skip |
| category | string | Filter by category ID |
Response
{
"success": true,
"data": {
"products": [
{
"id": "prd_8f21c",
"name": "Rice 5kg — Perfumed",
"sku": "RCE-5K",
"sellPrice": 96.00,
"costPrice": 78.00,
"categoryId": "cat_provisions"
}
],
"total": 612
}
}/api/catalog/productsProducts
Create a new product in your inventory.
Request Body
{
"name": "Milo Tin 400g",
"sku": "MLO-400",
"costPrice": 31.00,
"sellPrice": 38.50,
"categoryId": "cat_drinks",
"barcode": "6001234567890"
}Response
{
"success": true,
"message": "Product created",
"data": { "id": "prd_9a03e" }
}/api/sales/ordersOrders
Retrieve all orders with optional filters.
Response
{
"success": true,
"data": {
"orders": [
{
"id": "ord_4c18b",
"reference": "POS-2026-004813",
"customerName": "Mensah Stores",
"total": 412.50,
"paymentStatus": "PAID",
"createdAt": "2026-08-10T14:22:03.000Z"
}
],
"total": 1846
}
}Rate Limits
| Plan | Requests/min | Burst |
|---|---|---|
| Starter | 60 | 100 |
| Professional | 300 | 500 |
| Enterprise | 1,000 | 2,000 |
Rate Limit Headers
Check response headers for your current rate limit status.
Errors
Standard HTTP codes. The body always carries a readable message.
| 400 | The request body or query failed validation. |
| 401 | Missing, expired or invalid access token. |
| 403 | Authenticated, but your role lacks the permission. |
| 404 | No such record in your organisation. |
| 409 | Conflicts with existing data, such as a duplicate SKU. |
| 429 | Rate limited. Check the rate limit headers. |
| 500 | Something broke on our side. Please report it. |
{
"error": true,
"statusCode": 403,
"statusMessage": "Forbidden",
"message": "Your role does not allow products.update"
}Webhooks
Paystack payment events are received at /api/billing/paystack/webhook and verified against your secret. Outbound webhooks for business events are not published yet — tell us what you need and we will prioritise it.