Skip to content
Partner API

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 page and per_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.

fromquery dateFirst day, YYYY-MM-DD.
toquery dateLast day, YYYY-MM-DD.
statusquery stringcompleted (default), void or all.
pagequery integerPage number, from 1.
per_pagequery integerRows 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.

idpath integerThe 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.

pagequery integerPage number, from 1.
per_pagequery integerRows 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
    }
}