Menu changes
Laayo never changes names or prices live from the POS. New dishes and price or name changes go to the owner in the Laayo vendor app, row by row.
#How it works
#Upload your menu
POST /v1/stores/{id}/menu/sync takes up to 2000 items with your ID, name, price in rupees, and optionally a category and availability. The answer is 202: the difference is saved and waits for the owner.
POST /v1/stores/31/menu/sync
{ "items": [
{ "external_item_id": "MOMO-C-10", "name": "Chicken momo", "price": 200, "category": "Momo" },
{ "external_item_id": "PAN-CHL", "name": "Paneer chilli", "price": 320, "category": "Starters" }
] }
202
{
"data": {
"diff_id": 318,
"store_id": 31,
"status": "pending",
"created_at": "2026-11-01T18:02:11+05:45",
"counts": { "new": 1, "changed": 1, "missing": 0, "unchanged": 66 },
"rows": [
{ "row_id": 9, "kind": "changed", "external_item_id": "MOMO-C-10", "laayo_item_id": 47188,
"pos": { "name": "Chicken momo", "price": 200, "category": "Momo" },
"laayo": { "name": "Chicken momo", "price": 180 },
"note": "price", "decision": "pending" }
]
}
}#Rows
| kind | Meaning |
|---|---|
new | In your menu, not on Laayo. |
changed | On both, with a different name or price. note says which. |
missing | On Laayo, not in your menu. |
Each row has its own decision: pending, approved or rejected.
#Follow the review
GET /v1/stores/{id}/menu/sync returns the latest upload for the store and the decision on each row. data is null if you never uploaded.
| status | Meaning |
|---|---|
pending | Waiting for the owner. |
approved | The owner approved it. |
rejected | The owner rejected it. |
superseded | A newer upload replaced it before review. |
#What approval does in v1
Each approved row goes onto the Laayo menu: a new dish is added and mapped to your ID, a name or price changes, a missing item loses its mapping (the dish itself stays). Where Laayo checks new dishes before they go live, the dish waits for that check, already mapped, so your ID works the moment it is approved. Rejected rows change nothing.
#Rules
- Send the full menu each time, not a patch. A new upload replaces a pending one.
- An upload that is no longer pending cannot be changed: 409 diff_closed.
- Over 512 KB returns 413 body_too_large.
- Sold out and back is not a menu change. Use Sold out items; it never waits.