Changelog
All notable changes to the OlaClick Public API.
[2026-09-12] Orders — create and update orders
🆕 New
Orders
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; the order starts asPENDING. 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-08] Company — list configured payment methods
🆕 New
Company
GET /v1/company/payment-methods— Lists the active payment methods configured for your company: id, code, description, and the order service types that accept it (ONSITE,TABLE,DELIVERY,TAKEAWAY). Only methods enabled for at least one of those service types are returned.
Scopes
payment-methods:read— required by the new endpoint. Existing API keys need it granted before calling it.
[2026-09-07] Logistics — assign your OlaClick riders
✨ Changed
Logistics
PUT /v1/orders/{id}/rider— New optionalproviderfield:api(default, unchanged behaviour) registers an external rider managed by your system;olaclickassigns one of your OlaClick users with theriderrole.
Notes
user_idwas documented as an OlaClick user id. Withprovider: apiit is the id of the rider in your own system, stored as-is. Withprovider: olaclickit is required and must be the id of an active user of your company with theriderrole (seeGET /v1/users?filter[role]=rider&filter[active]=true).- With
provider: olaclickthe order must be a delivery and must not be inPENDINGstatus; otherwise the endpoint answers422 validation_failedwith the failing field undererrors[]. - Existing integrations are unaffected: omitting
providerbehaves exactly as before.
[2026-09-04] Users — list your company staff
🆕 New
Users
GET /v1/users— Paginated list of the users of your company (staff such as admins, managers, waiters, riders, cooks, sales and cashiers).
Scopes
users:read— required by the endpoint. Existing API keys need it granted before calling it.
Notes
- Filter by role with
filter[role], one role or several separated by commas (filter[role]=waiter,rider). Allowed roles:admin,manager,waiter,rider,cook,sales,cashier. - Filter by account status with
filter[active]=true|false. Without it the list includes deactivated users; check theactivefield on each item. - Page through results with
pageandper_page(default 20, max 100). Thepaginationobject tells you whether there are more pages. - Each user carries a single
role.
[2026-09-04] Order management — items, payments, discounts, status and cancellation
🆕 New
Orders
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-09-01] Company profile — language and currency
🆕 New
Company
GET /v1/companynow also returnslanguageandcurrency.
Notes
languageis the company's configured 2-letter ISO 639-1 code (e.g.es,en) — not a full locale likees-PE.nullwhen the company has no language set.currencyis the company's ISO 4217 currency code (e.g.PEN,USD). Always present — defaults toUSDwhen the company never configured one.- Both fields are additive; no existing field changed.
[2026-08-27] Menu write endpoints — product & variant create/update
🆕 New
Menu
POST /v1/menu/products— Create a product, optionally with its variants, in one call.POST /v1/menu/products/:id/variants— Create a variant for an existing product.PATCH /v1/menu/products/:id/variants/:variantId— Update a variant.PATCH /v1/menu/products/:idnow also acceptsvisible,stock_enabled, andmessages_for_customers.GETproduct responses now includestock_enabledandmessages_for_customers.
[2026-08-19] Company profile
🆕 New
Company
GET /v1/company— profile of the company behind the credential: name, description, logo, public URL, location and weekly business hours, pluscurrently_opencomputed in the company timezone.
Scopes
companies:read— required byGET /v1/company(scope already exists since the initial release; existing keys must have it granted).
Notes
descriptioncomes from the connected Google Business Profile and isnullfor companies that never synced one.currently_openis derived frombusiness_hoursin the company timezone and supports multiple blocks per day and overnight ranges.- Existing API keys need the
companies:readscope granted before calling this endpoint.
[2026-08-14] Logistics API — External delivery providers
🆕 New
Orders
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-08-07] Food-app store status
🆕 New
Stores
GET /v1/stores/status— live open/closed state for every food app supported in your country (Rappi, Rappi Turbo, iFood, Didi, PedidosYa, Uber Eats, 99Food). Accepts an optionalprovider_namesfilter (comma-separated); narrowing it reduces the number of live provider lookups and therefore the response time.
Scopes
stores:read— required byGET /v1/stores/status
Notes
store_statusis resolved live against each food app, so this endpoint is slower than a plain read. A provider that has no credentials configured, is not yet supported, or fails to answer is reported asUNKNOWNrather than failing the whole request.- Existing API keys need the new scope granted before they can call this endpoint.
[2026-06-20] Public API — Initial Release
🆕 New
First version of the OlaClick Public API is live.
Authentication
- API Key authentication via
Authorization: Bearer olk_live_...orX-API-Keyheader - Scopes:
menu:read,menu:write,orders:read,clients:read,reports:read,webhooks:read,webhooks:write,companies:read
Menu
GET /v1/menu— Full catalog with categories and productsGET /v1/menu/categories/:id— Single category by idGET /v1/menu/products/:id— Single product with variants and modifiersPUT /v1/menu/products— Bulk upsert up to 500 products (idempotent)PATCH /v1/menu/products/:id— Partial update of a product
Orders
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
Webhooks
POST /v1/webhooks— Create webhook subscriptionGET /v1/webhooks— List webhook subscriptionsGET /v1/webhooks/:id— Get webhook detailsPATCH /v1/webhooks/:id— Update webhook configurationDELETE /v1/webhooks/:id— Delete webhook subscription
Clients
GET /v1/clients— Paginated client list with filtersGET /v1/clients/:id— Get a single client by UUID
Infrastructure
- Rate limiting per API key (tier-based)
- RFC 7807 Problem Details for all errors
- Idempotency support via
Idempotency-Keyheader on write endpoints - Sandbox environment (
olk_test_*keys onapi-sandbox)