Skip to content
Billzova Developers

API reference · Menu

Get the menu

GET/v1/menu

The live menu exactly as the POS has it: categories, items, sizes, add-on groups, food type, GST and availability.

  • Scope menu:read
  • 600 / minute

Request

curl https://api.billzova.com/v1/menu \
  -H "Authorization: Bearer $BILLZOVA_KEY"

Response

200 · application/json
{
  "object": "menu",
  "currency": "INR",
  "gstApplies": true,
  "categories": [{
    "id": "c1", "name": "Biryani", "description": null, "imageUrl": null, "sortOrder": 0,
    "items": [{
      "id": "grp_7a2…", "name": "Chicken Biryani", "description": "Dum-cooked",
      "foodType": "NON_VEG", "available": true, "prepMinutes": 25,
      "menuItemId": null, "price": null,
      "tax": { "rate": 5, "included": false },
      "variants": [
        { "menuItemId": "m-half", "label": "Half", "price": { "amount": 18000, "currency": "INR", "display": "₹180" }, "isDefault": true, "available": true },
        { "menuItemId": "m-full", "label": "Full", "price": { "amount": 32000, "currency": "INR", "display": "₹320" }, "isDefault": false, "available": true }
      ],
      "addOnGroups": [{
        "id": "g1", "name": "Pick one dip", "min": 0, "max": 1,
        "options": [{ "id": "dip-1", "name": "Mint", "price": { "amount": 1000, "currency": "INR", "display": "₹10" }, "available": true }]
      }]
    }]
  }]
}

Good to know

  • An item with sizes has menuItemId: null and a variants list — order the chosen variant's menuItemId. An item without sizes has its own menuItemId.
  • The response has an ETag. Send it back as If-None-Match and you get 304 Not Modified when nothing changed — cheap to poll.
  • Money is always an integer amount in paise plus a display string (32000 = ₹320.00).

Errors

CodeHTTPMeaning
UNAUTHENTICATED401Missing or malformed API key. Send it as Authorization: Bearer bz_live_sk_….
SCOPE_MISSING403The key is not allowed to do that.
RATE_LIMITED429Too many requests — wait for Retry-After seconds.