Orders
2026-09-18 — Promotions — create, read, update and delete a promotion; apply a coupon to an order
🆕 New
POST /v1/orders/{id}/coupon— Redeems a coupon code on an order and returns it with the totals recalculated. Only orders created through the API can be changed here (422 order_not_modifiableotherwise). A coupon that exists but is not eligible for this order — service type, usage limit reached, once per customer, or new customers only — answers422 coupon_not_applicable; a coupon already applied to the order answers422 validation_failed. To remove a coupon, use the existingDELETE /v1/orders/{id}/discounts/{discountId}with the discount id the coupon created.
Scopes
orders:write— also required byPOST /v1/orders/{id}/coupon(existing scope, no new grant needed for keys that already write orders).
2026-09-16 — Orders — payments on storefront and POS orders
✨ Changed
POST /v1/orders/:id/paymentsandDELETE /v1/orders/:id/payments/:paymentIdnow also work on orders placed by the customer on the storefront (INBOUND) or taken by the merchant on the POS (OUTBOUND), not only on orders created through the API. Orders from food apps still answer422 order_not_modifiable. Every other write endpoint keeps accepting only orders created through the API.
2026-09-12 — Orders — create and update orders
🆕 New
POST /v1/orders— Creates an order. Sendservice_typeand, optionally,client_id(an existing client of your company).table_idis only accepted for TABLE orders;address_idanddelivery_priceonly for DELIVERY orders.source,country_code,timezoneandcurrencyare always taken from your credential. By default the order starts asINITIATED, a draft the merchant does not see: add its items, payments and discounts, then confirm it withPATCH /v1/orders/{id}/statusandstatus: PENDING(orPREPARING), which assigns its daily number and shows it to the merchant. Sendstatus: PENDINGon creation to skip the draft. Drafts are never returned byGET /v1/orders: keep theidfrom the create response and read them withGET /v1/orders/{id}. Requires anIdempotency-Keyheader, which is stored as the order's reference and must be unique per order.PATCH /v1/orders/{id}— Edits an order you created through the API. Send at least one ofcomment,order_title,delivery_comment,delivery_price,packaging_priceorscheduled_delivery_date;delivery_commentanddelivery_priceare only accepted on DELIVERY orders.commentis appended to what the order already has rather than replacing it;currencyis always taken from your credential. Orders from other channels cannot be edited here.
2026-09-04 — Order management — items, payments, discounts, status and cancellation
🆕 New
PATCH /v1/orders/:id/status— Move an order along its lifecycle.POST /v1/orders/:id/cancel— Cancel an order, with a reason.POST /v1/orders/:id/combos— Add items to an existing order.DELETE /v1/orders/:id/combos/:comboId— Remove one item from an order.POST /v1/orders/:id/payments— Register a payment against an order.DELETE /v1/orders/:id/payments/:paymentId— Cancel one payment.POST /v1/orders/:id/discounts— Apply a manual discount.DELETE /v1/orders/:id/discounts/:discountId— Remove a discount.
All eight return the order in its new state, the same shape as GET /v1/orders/:id.
Scopes
orders:write— required by all eight endpoints. Existing API keys need it granted before calling them. The rider endpoints keep usinglogistics:write.
Notes
- Only orders created through the API can be edited.
- Changing the status is the exception: it works for orders from any channel. Advancing an order the merchant is already fulfilling is an operational action, whoever took it.
- Statuses only move forward through
PENDING,PREPARING,READY,DELIVEREDandFINALIZED. Sending a status earlier than the current one leaves the order unchanged and returns it as-is; skipping ahead applies the statuses in between.CANCELLEDis not accepted here — use the cancel endpoint. - An order with active payments cannot be cancelled. Cancel its payments
first with
DELETE /v1/orders/:id/payments/:paymentId. - Removing an item or a payment cancels it: the row stays on the order with
canceled_atset, so the change remains auditable and keeps showing in the merchant reports. Removing a discount deletes it. - Items do not have to exist in your menu. Sent without
product_idthey are added as free-form lines; askuthat matches a product in your menu links the line to it automatically. - Payments can be several per order, one per method the customer used. The order is marked as paid once they add up to its total, and amounts above the total are accepted and reported as an overpayment.
- Discounts are manual, by
AMOUNTorPERCENTAGE, and they add up. A percentage above 100 is rejected; an amount above 100 is not. - The currency and the timezone are taken from the company that owns your API key, so you never send them.
Prices: you send unit prices, you read back line totals
The item fields carry the same names in the request and in the response, but they do not mean the same thing. You send what one unit costs; the order stores what the whole line adds up to:
variant_price = unit price x item quantity
variant_original_price = unit list price x item quantity
per modifier:
price = unit price x modifier quantity x item quantity
quantity = modifier quantity x item quantity
modifiers_price = sum of the modifier prices
combo_price = variant_price + modifiers_price
combo_original_price = variant_original_price + sum of original prices
A modifier's quantity is per unit of the item. Asking for one large side
on an item with quantity: 2 records two large sides.
For example, sending an item with quantity: 2 at variant_price: 25 and
variant_original_price: 30, plus one modifier at price: 4 and another at
price: 6, stores variant_price: 50, the modifiers at 8 and 12,
modifiers_price: 20 and combo_price: 70.
variant_original_price and a modifier's original_price are optional: they
default to the price you charge, so send them only when you want the order to
show the discount you granted.
2026-08-14 — Logistics API — External delivery providers
🆕 New
PUT /v1/orders/:id/rider— Assign or update a delivery rider (name, phone number).DELETE /v1/orders/:id/rider— Unassign the rider from an order.PATCH /v1/orders/:id/delivery-status— Update the delivery status. Automatically setsdelivered_bytoAPI.
Scopes
logistics:write— required by all three new endpoints.
Notes
- These endpoints allow external delivery providers (e.g. PickNGo) to report rider assignment and delivery progress on existing orders.
- They do NOT create orders — they only operate on orders already created in OlaClick.
delivered_byis set toAPIautomatically so reports can distinguish provider-driven deliveries.- Existing API keys need the
logistics:writescope granted before calling these endpoints.
2026-06-20 — Public API — Initial Release
🆕 New
First version of the OlaClick Public API is live.
GET /v1/orders— Paginated order list with filtersGET /v1/orders/:id— Single order by UUID or public IDGET /v1/orders/by-payment-methods— Orders aggregated by payment methodGET /v1/orders/by-tips— Orders aggregated by tipsGET /v1/orders/products-sold— Products sold statistics