See it live — no signup
Partner API · v1 · JSON over HTTPS

Send orders into any Online eMenu restaurant from your own software.

The Partner API lets your software read a restaurant's live menu, place orders that land in the same queue as every other channel, and read back orders from POS, WhatsApp, QR and aggregators. Accept, reject and move orders through to completion, all over one JSON API secured with a per-restaurant key.

Restaurant prices every order Per-restaurant keys, revocable instantly Versioned v1, additive only
Developer at a two-monitor desk integrating a restaurant ordering API while the kitchen pass works behind the glass
4 calls
For a working integration
600/min
Requests per key
Integer
Minor units — no floating-point money
v1
Additive versioning
What it does

What can I do with the Partner API?

One key, one restaurant, six things your software can do against its live order flow.

Read the live menu

Categories, items, prices and add-ons, with stock and meal-window flags so you only ever offer what the kitchen can actually serve right now.

Place an order

A new order from your system lands in the restaurant's live queue and rings the alarm exactly like an order from any other channel.

Read every channel's orders

One feed covering POS, the QR diner menu, WhatsApp, Zomato, Swiggy and your own API orders — filter by channel or status.

Accept or reject, with a prep time

Confirm an order to the kitchen and the customer with an optional prep-time estimate, or turn it down with a reason for the audit trail.

Move an order through its stages

Preparing, ready, dispatched, completed — post the status change your system already knows about and it reflects on every screen.

Aggregator decisions, passed through

Decide on a Zomato or Swiggy order through the same call, and the decision is queued for that platform until it confirms (awaitingPortal).

How does the API keep money safe?

The restaurant prices every order, not your integration. You send item ids and quantities; the restaurant's own menu and tax settings compute the subtotal, add-ons, service charge, packaging and tax, and return the total to you. No integration can book an order at a price the restaurant never agreed to.

You send ids and quantities

Never a price. The restaurant's menu and settings decide what everything costs.

expectedTotalMinor is checked

Send the total your system showed the customer. A mismatch refuses the order with TOTAL_MISMATCH rather than creating it at the wrong price.

Integer minor units, always

Paise, cents, fils — never decimals, so nothing is lost to floating-point rounding.

Per-restaurant keys

Revocable instantly from the restaurant's panel, and meant to be called from your server only, never from a browser or app.

Who it's for

Who builds on it?

Anyone whose software needs to read a restaurant's menu or put an order into its kitchen.

Delivery and aggregator platforms

Sync your own ordering flow into the restaurant's live queue alongside its other channels.

Kiosk and tablet vendors

Read the live menu for display and send the order straight into the kitchen queue.

Loyalty and CRM apps

Read completed orders to build spend history, segments and win-back campaigns.

Agencies building a branded app

Put your client's own website or app in front of customers while orders still land in their queue.

Hotel PMS and ERP teams

Pull completed orders for accounting, reconciliation and reporting outside the restaurant panel.

A minimal integration in four calls

Prove the connection, then build the loop. This is the same shape as the four-part loop in the API docs.

Try it — confirms the key and returns currency, tax and timezone
curl https://api.onlineemenu.com/api/v1/outlet \
  -H "Authorization: Bearer emk_live_YOUR_KEY"
Place an order — externalRef makes the call safe to retry
POST /api/v1/orders
Authorization: Bearer emk_live_...
Content-Type: application/json

{
  "externalRef": "INV-2026-0912",
  "type":        "DELIVERY",
  "customer":    { "name": "Vinod", "phone": "9876500123" },
  "deliveryAddress": {
    "addressLine1": "12 MG Road",
    "city":         "Indore"
  },
  "items": [
    { "menuItemId": "cmtwzpw6b000wvnai89aldj73", "qty": 2 }
  ],
  "note": "less spicy"
}
1

Outlet and menu, on start-up

Call GET /outlet for currency and minorPerUnit, call GET /menu and cache it, then refresh the menu every few minutes so sold-out items and price changes reach you.

2

POST /orders with your own externalRef

Store the order id we return against your record. If the call fails or times out, retry the identical payload — the reference makes that safe.

3

Poll ?status=NEW every 5-10 seconds

Catch orders that need a decision, show them to your staff, then post the answer back to /accept or /reject.

4

Cursor sync with ?since=

Keep a cursor, ask for what has changed since it, apply the results oldest-first, then move the cursor to the last updatedAt you saw.

How do I get an API key?

The restaurant creates your key inside its own eMenu panel, under Settings → API access. It is named at creation and shown once, so it needs to be pasted to you over something private — it is a password for that restaurant's orders. A restaurant can run up to 10 active keys at a time, one per integration, and revoke any of them instantly without disturbing the others.

If you are a developer or platform without a restaurant client yet, ask us on WhatsApp about getting a test restaurant to build against before you go live with a real one.

Limits, versioning and support

LimitValue
Requests per key600 per minute
Lines per order200
Quantity per line999
Add-on choices per line40
Kitchen note500 characters
Orders per page200
Active keys per restaurant10

Going over the request ceiling returns 429 RATE_LIMITED. Back off for a few seconds and retry — nothing is lost, and a polling loop simply catches up on its next pass.

The version sits in the path. Within v1, fields get added to responses and optional fields get added to requests, but nothing existing is removed, renamed or changed in meaning — ignore fields you do not recognise and your integration keeps working. A breaking change gets its own version path, and v1 keeps running.

For support, quote the order's code and timestamp — both are visible in the restaurant's panel and make a single order traceable end to end.

Frequently asked

Partner API questions.

Is the API free? +

The API is part of the restaurant's Ordering Suite subscription — ₹199/month in India, $9/month elsewhere. There is no separate API fee listed. If you are integrating for a partner platform across many restaurants, ask us on WhatsApp and we will confirm volume terms.

Can I read Zomato and Swiggy orders? +

Yes. GET /orders returns orders from every channel, including ZOMATO and SWIGGY, and you can filter with ?channel=ZOMATO,SWIGGY. If you accept or reject one of those orders through the API, the decision is queued for that platform and the order's status only changes once the platform itself confirms.

Does it work with the Desktop POS? +

Yes. Orders placed through this API land in the same live queue as orders rung up on the Desktop POS, and POS-channel orders are visible back to you through GET /orders with ?channel=POS. There is one queue behind both.

Can I set my own prices? +

No. The restaurant prices every order from its own menu and tax settings. You send item ids and quantities; the subtotal, add-ons, service charge, packaging and tax come back computed. You can send expectedTotalMinor to confirm your total agrees before the order is created.

What happens if my request times out? +

Retry the identical payload using the same externalRef. The API recognises the repeated reference and returns the original order with "duplicate": true instead of creating a second one. Accept, reject and status calls are also safe to repeat and return "unchanged": true on a repeat.

Is there a webhook? +

No webhook is documented. The API is built around polling: GET /orders?status=NEW every 5 to 10 seconds to catch orders needing a decision, and a cursor sync with ?since= to keep everything else in step.

Which currencies? +

Whichever currency the restaurant's outlet is configured in. GET /outlet returns the ISO currency code and minorPerUnit, so you can convert the integer minor-unit amounts to a display price without hard-coding a multiplier.

Can one key see multiple restaurants? +

No. One key belongs to one restaurant and can never see or touch another restaurant's menu or orders. An integration covering several restaurants holds one key per restaurant.

Partner API

Get your restaurant's first order into your system.

Read the full docs for every endpoint and error code, or message us on WhatsApp and we will point you at the right starting call.