Read your restaurant's data with an API key
A restaurant owner makes a read-only key under Settings > API keys and ticks what it may read. Your tool sends the key, and gets JSON back. Nothing can be changed through the API.
Quick start
curl https://appzetsbilling.com/api/partner/v1/menu \ -H "Authorization: Bearer azk_live_your_key_here"
- The key is shown once, when the owner makes it. We keep only a scrambled copy, so a lost key is replaced, never recovered.
- Each key sees only its own restaurant, and only what its ticks allow: Menu and prices, Bills, items, payments and refunds, Stock levels, Payment types, Customers .
- At most 60 calls a minute per key. Over the limit you get 429.
- Errors are JSON:
{"error": {"code": "scope", "message": "..."}}with 401 (key problem), 403 (not allowed) or 404. - Money is in rupees as numbers, dates are ISO 8601, lists are paged with
pageandper_page(up to 100). - The machine-readable file is
https://appzetsbilling.com/api/partner/v1/openapi.json.
GET /me
About this key. Returns the key's name, the shop, what the key may read and when it expires. A quick way to test a new key.
{
"data": {
"name": "Accountant tool",
"shop": "Bamboo Kitchen",
"scopes": [
"bills",
"payments"
],
"expires_at": null
}
}
GET /menu
The menu and prices. Every item that is on the menu with its category, price (or sizes) and whether it can be sold right now (serving hours, out of stock today and combo parts are considered). Needs the "menu" tick.
{
"data": [
{
"id": 12,
"name": "Chicken biryani",
"category": "Main course",
"menu": "Lunch",
"price": 280,
"price_type": "single",
"sold_by": "piece",
"is_combo": false,
"sizes": [],
"available": true
}
]
}
GET /bills
Bills. Finished bills with items, payments and refunds, oldest first. At most 93 days at a time; the last 30 days when no dates are given. customer_id is included only when the key may also read customers. Needs the "bills" tick.
| from | query date | First day, YYYY-MM-DD. |
| to | query date | Last day, YYYY-MM-DD. |
| status | query string | completed (default), void or all. |
| page | query integer | Page number, from 1. |
| per_page | query integer | Rows per page, 1 to 100 (default 50). |
{
"data": [
{
"id": 1043,
"invoice_number": "BK/26-27/1043",
"date": "2026-10-30T13:05:00+05:30",
"type": "dine_in",
"status": "completed",
"total": 420,
"paid": 420,
"due": 0,
"gst": 20,
"discount": 0,
"items": [
{
"product_id": 12,
"name": "Chicken biryani",
"quantity": 1,
"unit_price": 280
}
],
"payments": [
{
"method": "UPI",
"amount": 420
}
],
"refunds": []
}
],
"meta": {
"page": 1,
"per_page": 50,
"total": 1,
"pages": 1
}
}
GET /bills/{id}
One bill. One bill by its id, with the same fields as the list. 404 when it is not this shop's. Needs the "bills" tick.
| id | path integer | The bill id. |
{
"data": {
"id": 1043,
"invoice_number": "BK/26-27/1043",
"total": 420
}
}
GET /stock
Stock levels. Ready items (cakes, packs, bottles) with their counts, and ingredients with their quantities and alert levels. Needs the "stock" tick.
{
"data": {
"ready_items": [
{
"id": 31,
"name": "Cola 500ml",
"quantity": 24,
"alert_at": 6
}
],
"ingredients": [
{
"id": 5,
"name": "Basmati rice",
"quantity": 18.5,
"alert_at": 5,
"unit": "kg"
}
]
}
}
GET /payment-types
Payment types. The ways a customer can pay: cash, UPI, card and your own. Needs the "payments" tick.
{
"data": [
{
"id": 1,
"name": "Cash",
"active": true
}
]
}
GET /customers
Customers. Customers with their offers consent. Customers who asked to be erased never appear. Needs the "customers" tick.
| page | query integer | Page number, from 1. |
| per_page | query integer | Rows per page, 1 to 100 (default 50). |
{
"data": [
{
"id": 7,
"name": "Priya Nair",
"phone": "9876511201",
"email": null,
"offers_consent": "agreed",
"created_at": "2026-09-02T10:11:00+05:30"
}
],
"meta": {
"page": 1,
"per_page": 50,
"total": 1,
"pages": 1
}
}