The Dinlr Online Order API allows authorization using the OAuth 2.0 standard. Currently, we only support the Authorization Code Grant.
2. Restaurant Settings
This should be the first request that you issue to the Dinlr server which provide information about the restaurant configuration.
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/get-settings
Header
Authorization: Bearer {access_token}
Response
{ "data": { "locations": [ { "id": "{location_id}", "name": "Chinatown" }, { "id": "{location_id}", "name": "New York" } ], "dining_options": [ { "id": "{dining_option_id}", "name": "Dine-in", "sort": 0 }, { "id": "{dining_option_id}", "name": "Takeaway", "sort": 1 }, { "id": "{dining_option_id}", "name": "Delivery", "sort": 2 } ], "payments": [ { "id": "{payment_id}", "name": "Cash", "sort": 0 }, { "id": "{payment_id}", "name": "Visa", "sort": 1 }, { "id": "{payment_id}", "name": "Mastercard", "sort": 2 } ], "categories": [ { "id": "{category_id}", "name": "Food", "sub_categories": [ { "id": "{category_id}", "name": "Burger" }, { "id": "{category_id}", "name": "Sides" } ] }, { "id": "{category_id}", "name": "Drinks", "sub_categories": [ ] } ], "modifiers": [ { "id": "{modifier_id}", "name": "Ice Level", "min_selection": 0, - null represents optional "max_selection": 1, - null represents unlimited "sort": 0, "modifier_options": [ { "id": "{modifier_option_id}", "name": "No Ice", "price": 1, "max_qty": 1, "default_selected": false, "show_in_menu": true, "sort": 0 }, { "id": "{modifier_option_id}", "name": "Less Ice", "price": 0.5, "max_qty": 1, "default_selected": false, "show_in_menu": true, "sort": 1 }, { "id": "{modifier_option_id}", "name": "More Ice", "price": 0, "max_qty": 1, "default_selected": false, "show_in_menu": true, "sort": 2 } ] }, { "id": "{modifier_id}", "name": "Steak Doneness", "min_selection": 1, - null represents optional "max_selection": 1, - null represents unlimited "sort": 1, "modifier_options": [ { "id": "{modifier_option_id}", "name": "Medium Rare", "price": 0, "max_qty": 1, "default_selected": true, "show_in_menu": true, "sort": 0 }, { "id": "{modifier_option_id}", "name": "Medium", "price": 0, "max_qty": 1, "default_selected": false, "show_in_menu": true, "sort": 1 }, { "id": "{modifier_option_id}", "name": "Well Done", "price": 0, "max_qty": 1, "default_selected": false, "show_in_menu": true, "sort": 2 } ] } ], "charges": [ { "id": "{charge_id}", "name": "Service Charge", "dining_options": [ - list of dining options that apply this charge "{dining_option_id}", "{dining_option_id}" ] }, { "id": "{charge_id}", "name": "Takeaway Charge", "dining_options": [ - list of dining options that apply this charge "{dining_option_id}" ] }, { "id": "{charge_id}", "name": "Delivery Fee", "dining_options": [ - list of dining options that apply this charge "{dining_option_id}" ] } ], "customer_groups": [ { "id": "{customer_group_id}", "name": "Bronze Member" }, { "id": "{customer_group_id}", "name": "Gold Member" }, { "id": "{customer_group_id}", "name": "VVIP" } ] } }
4. Items & Discounts
4.1 Retrieve all Items
Unlike the online menu option which only return the online menu and the items contained within each menu, this option return every items in the database.
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/items?location_id={location_id}
URL Parameters
- location_id
- limit - Return up to this many results per page (default: 50) (max: 250)
- page - Return a specific page of results (default: 1)
- update_at_min - Show items last updated after date (Remember to escape + sign with %2B, because + is not allowed to be used in URL)
Header
Authorization: Bearer {access_token}
Response
{ "data": [ { "id": "{item_id}", "item_no": "A1", "name": "Chargrilled Chicken Burger", "description": "Grilled chicken with BBQ sauce", - optional "image": "https://cdn.dinlr.com/......jpg", - optional "category": "{category_id}", "updated_at": "2018-03-08T13:00:00+08:00", "variants": [ { "id": "{variant_id}", "name": "Regular", "sku": "CKREG", "price": 9.5, "show_in_menu": true, "sort": 0 }, { "id": "{variant_id}", "name": "Large", "sku": "CKLAR", "price": 12.5, "show_in_menu": true, "sort": 1 }, { "id": "{variant_id}", "name": "Open Price", "sku": null, "show_in_menu": false, "sort": 2 } ], "modifiers": [ { "id": "{modifier_id}","name": "Sides",(Depreciated) (Modifier data moved to Restaurant Settings)"min_selection": 2, - null represents optional(Depreciated)"max_selection": 2, - null represents unlimited(Depreciated)"sort": 0,(Depreciated)"modifier_options": [(Depreciated) {"id": "{modifier_option_id}",(Depreciated)"name": "French Fries",(Depreciated)"price": 0,(Depreciated)"sort": 0(Depreciated) }, {"id": "{modifier_option_id}",(Depreciated)"name": "Onion Rings",(Depreciated)"price": 0.5,(Depreciated)"sort": 1(Depreciated) } ] } ] }, { "id": "{item_id}", "item_no": null, "name": "Cheesecake", "description": null, "image": null, "category": "{category_id}", "updated_at": "2018-03-08T13:00:00+08:00", "variants": [ { "id": "{variant_id}", "name": "Blueberry", "sku": "CCBLUE", "price": 3.5, "show_in_menu": true, "sort": 0 }, { "id": "{variant_id}", "name": Oreo, "sku": "CCOREO", "price": 4.5, "show_in_menu": true, "sort": 1 } ], "modifiers": [ ] } ] }
4.2 Retrieve all Discounts
Retrieve every discounts in the database.
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/discounts?location_id={location_id}
URL Parameters
- location_id
- limit - Return up to this many results per page (default: 50) (max: 250)
- page - Return a specific page of results (default: 1)
- update_at_min - Show discounts last updated after date (Remember to escape + sign with %2B, because + is not allowed to be used in URL)
Header
Authorization: Bearer {access_token}
Response
{ "data": [ { "id": "{discount_id}", "name": "Staff Discount", "type": "percent", - Can be either "percent" or "price" discount "manufacturer_discount": true, - Manufacturer discount will be applied after charges and taxes "value": 10, - Since discount type is percent, it is 10% discount. If value is null, it means it is an open discount and value can be custom defined. "updated_at": "2018-03-08T13:00:00+08:00" }, { "id": "{discount_id}", "name": "First-Timer Discount", "type": "price", "manufacturer_discount": true, "value": 15, - Since discount type is price, it is a $15 discount "updated_at": "2018-03-08T13:00:00+08:00" }, { "id": "{discount_id}", "name": "Open Discount", "type": "price", "manufacturer_discount": false, "value": null, - Open discount, value can be defined later during 6.1 Cart Summary, 6.2 Place Order or 7.3 Update Order "updated_at": "2018-03-08T13:00:00+08:00" } ] }
5. Customers
5.1 Retrieve all Customers
Retrieve all customer profiles.
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/customers
URL Parameters
- limit - Return up to this many results per page (default: 50) (max: 250)
- page - Return a specific page of results (default: 1)
- update_at_min - Show items last updated after date (Remember to escape + sign with %2B, because + is not allowed to be used in URL)
Header
Authorization: Bearer {access_token}
Response
{ "data": [ { "id": "{customer_id}", "reference": "A144516982", - optional, max 50 characters "first_name": "Mark", - optional, max 50 characters "last_name": "Clinton", - optional, max 50 characters "company_name": "Dinlr", - optional, max 50 characters "email": "[email protected]", - optional, max 50 characters "phone": "+6511221122", - optional, max 50 characters "dob": "1960-06-22T00:00:00+00:00", - optional "gender": "M", - optional "address1": "10 Kaki Bukit Ave 4", - optional, max 100 characters "address2": "#05-73", - optional, max 100 characters "city": "Singapore", - optional, max 100 characters "country": "SG", - optional, Alpha-2 country code "postal": "415874", - optional, max 50 characters "notes": "Allergic to peanuts", - optional, max 200 characters "customer_group": "{customer_group_id}", "updated_at": "2018-03-08T13:00:00+08:00" }, { "id": "{customer_id}", "reference": null, "first_name": "Jamie", "last_name": null, "company_name": null, "email": "[email protected]", "phone": null, "dob": null, "gender": "F", "address1": null, "address2": null, "city": null, "country": null, "postal": null, "notes": null, "customer_group": "{customer_group_id}", "updated_at": "2018-03-08T13:00:00+08:00" } ] }
5.2 View Customer
View a customer profile identified by id
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/customers/{customer_id}
Header
Authorization: Bearer {access_token}
Response
{ "data": { "id": "{customer_id}", "reference": "A144516982", - optional, max 50 characters "first_name": "Mark", - optional, max 50 characters "last_name": "Clinton", - optional, max 50 characters "company_name": "Dinlr", - optional, max 50 characters "email": "[email protected]", - optional, max 50 characters "phone": "+6511221122", - optional, max 50 characters "dob": "1960-06-22T00:00:00+00:00", - optional "gender": "M", - optional "address1": "10 Kaki Bukit Ave 4", - optional, max 100 characters "address2": "#05-73", - optional, max 100 characters "city": "Singapore", - optional, max 100 characters "country": "SG", - optional, Alpha-2 country code "postal": "415874", - optional, max 50 characters "notes": "Allergic to peanuts", - optional, max 200 characters "customer_group": "{customer_group_id}", "updated_at": "2018-03-08T13:00:00+08:00" } }
6. Place Order
6.1 Cart Summary
Calculate the total order cost by inputting an array of order items (products, modifier options and discounts identified by id) with their quantities and order information (dining option, order no, order ticket, pax and notes).
POST Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/cart/calculate
Header
Authorization: Bearer {access_token}
Parameters
{ "location": "{location_id}", "items": [ { "item": "{item_id}", "qty": 2, "notes": "Add Jalapeno", - optional, max 200 characters "variant": "{variant_id}", "price": "99.99", - optional, only include this variable for open price variant, only works on variant with no defined value "modifier_options": [ { "modifier_option": "{modifier_option_id}", "qty": 2 - optional, default 1 }, { "modifier_option": "{modifier_option_id}" } ], "discounts": [ - Item-based discount { "discount": "{discount_id}", "value": 10 - optional, only include this variable for open discount, only works on discount with no defined value }, { "discount": "{discount_id}" } ] }, { "item": "{item_id}", "qty": 1, "variant": "{variant_id}" } ], "charges": [ - optional, only include this variable to set custom charge amount { "charge": "{charge_id}", - please make sure that this charge is applicable for the selected dining option "amount": 8 } ], "discounts": [ - Order wide discount { "discount": "{discount_id}", "value": 10, - optional, only include this variable for open discount, only works on discount with no defined value }, { "discount": "{discount_id}" } ], "payments": [ { "payment": "{payment_id}", "receipt_no": "BC928K", - optional, alphanumeric, no spaces, max 10 characters, unique but can use current order no "amount": 25.55 } ], "objects": [ { "object": "{object_id}", "pax": 3 } ], "loyalty_program_rewards": [ { "loyalty_program_reward": "{loyalty_program_reward_id}" } ], "order_info": { "dining_option": "{dining_option_id}", - optional "order_no": "BC928K", - optional, alphanumeric, no spaces, max 10 characters, unique "order_ticket": "C23", - optional, max 50 characters "pax": 3, - optional, default 1 "status": "pending", - optional, default "pending", can be either "pending" or "pending_payment" "notes": "Self-collect at 3.30pm later", - optional, max 200 characters "customer": "{customer_id}", - optional "first_name": "Mark", - optional, max 50 characters "last_name": "Clinton", - optional, max 50 characters "email": "[email protected]", - optional, max 50 characters "phone": "+6511221122", - optional, max 50 characters "timeslot": "{timeslot_id}", - optional, for pre-orders "timeslot_start": "2020-07-10T06:00:00+00:00", - optional, ISO 8601 date, for pre-orders "timeslot_end": "2020-07-10T06:30:00+00:00", - optional, ISO 8601 date, for pre-orders "delivery_zone": "{delivery_zone_id}", - optional, for delivery orders "address1": "10 Kaki Bukit Ave 4", - optional, max 100 characters, delivery address "address2": "#05-73", - optional, max 100 characters, delivery address "city": "Singapore", - optional, max 100 characters, delivery address "country": "SG", - optional, Alpha-2 country code, delivery address "postal": "415874", - optional, max 50 characters, delivery address "address_lat": 1.3383981, - optional, delivery address latitute "address_lng": 103.9059644, - optional, delivery address longitude "order_at": "2020-07-10T05:00:00+00:00" - optional, ISO 8601 date, for pre-orders, the date which this order will show up in kitchen printer and KDS } }
Response
{ "data": { "subtotal": 15.54, "total": 10.54, "financial_status": "paid", - Can be either "pending", "partially_paid", "paid", "partially_refunded", "refunded" or "voided" "items": [ { "item": "{item_id}", "price_per": 10.3, "qty": 2, "price": 20.6, "variant": "{variant_id}", "variant_price": 9.5, "sort": 0, "modifier_options": [ { "modifier_option": "{modifier_option_id}", "price_per": 0.5, "qty": 1, "price": 0.5 }, { "modifier_option": "{modifier_option_id}", "price_per": 0.15, "qty": 2, "price": 0.3 } ], "discounts": [ { "discount": "{discount_id}", "amount": 2.06 }, { "discount": "{discount_id}", "amount": 1 } ] }, { "item": "{item_id}", "price_per": 10, "qty": 1, "price": 10, "variant": "{variant_id}", "variant_price": 10, "sort": 1, "modifier_options": [ ], "discounts": [ ] } ], "discounts": [ { "discount": "{discount_id}", "amount": 10, }, { "discount": "{discount_id}", "amount": 2, } ], "charges": [ { "charge": "{charge_id}", "amount": 8, "name": "Delivery Fee" } ], "taxes": [ { "tax": "{tax_id}", "amount": 2, "name": "Government Tax", "inclusive": false } ], "manufacturer_discounts": [ { "discount": "{discount_id}", "amount": 5, }, { "discount": "{discount_id}", "amount": 10, } ], "payments": [ { "payment": "{payment_id}", "receipt_no": "BC928K", "amount": 10.55 } ], "objects": [ { "object": "{object_id}", "pax": 4 } ] } }
6.2 Place Order
The parameters is similar to cart summary, but this option will place an order to the database. Once order has been placed, the default order status will be "pending". When the front-line staff accepts the order, the status will change to either "open" or "closed", or when they reject the order, the status will change to "cancelled" and all payment & refund for the order will be removed.
POST Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/cart/submit
Header
Authorization: Bearer {access_token}
Parameters
Same parameters as 6.1 Cart Summary
Response
Same response as 7.2 View Order
7. Manage Order
7.1 List Order
Retrieve orders placed by the restaurant.
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders?location_id={location_id}
Header
Authorization: Bearer {access_token}
URL Parameters
- location_id
- app_id - Show orders placed by a certain app. Set as current to show orders placed by the app currently calling the API (default: null)
- order_no - Show orders with specific order no only
- limit - Return up to this many results per page (default: 50) (max: 250)
- page - Return a specific page of results (default: 1)
- update_at_min - Show orders last updated after date (Remember to escape + sign with %2B, because + is not allowed to be used in URL)
Response
{ "data": [ { "id": "{order_id}", "customer": "{customer_id}", "order_no": "BC928K", "order_ticket": "C23", "updated_at": "2018-03-08T13:00:00+08:00", "created_at": "2018-03-08T13:00:00+08:00", "total": "79.06", "subtotal": "71.42", "status": "open", - Can be either "pending", "open", "closed", "cancelled", "pending_payment" or "cancelled_payment" "financial_status": "paid", - Can be either "pending", "partially_paid", "paid", "partially_refunded", "refunded" or "voided" "kitchen_status": null, - Can be either null, "fulfilled" or "partial" "expedite_status": null, - Can be either null, "expedited" or "partial" }, { "id": "{order_id}", "customer": "{customer_id}", "order_no": "AF920F", "order_ticket": "C22", "updated_at": "2018-03-08T13:00:00+08:00", "created_at": "2018-03-08T13:00:00+08:00", "total": "89.99", "subtotal": "87.99", "status": "closed", "financial_status": "pending", "kitchen_status": "fulfilled", "expedite_status": "partial" } ] }
7.2 View Order
View an order details (Items, discounts, taxes, charges and summary) identified by id
GET Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders/{order_id}
Header
Authorization: Bearer {access_token}
Response
{ "data": { "id": "{order_id}", "customer": "{customer_id}", "order_no": "BC928K", "order_ticket": "C23", "dining_option": "{dining_option_id}", "pax":4, "subtotal": 6.42, "total": 2.55, "status": "open", - Can be either "pending", "open", "closed", "cancelled", "pending_payment" or "cancelled_payment" "financial_status": "partially_refunded", - Can be either "pending", "partially_paid", "paid", "partially_refunded", "refunded" or "voided" "kitchen_status": null, - Can be either null, "fulfilled" or "partial" "expedite_status": null, - Can be either null, "expedited" or "partial" "notes": null, - optional, max 200 characters "updated_at": "2018-03-08T13:00:00+08:00", "created_at": "2018-03-08T13:00:00+08:00", "items": [ { "id": "{order_item_id}", "item": "{item_id}", "price_per": 10.3, "qty": 2, "price": 20.6, "notes": null, - optional, max 200 characters "variant": "{variant_id}", "variant_price": 9.5, "sort": 0, "modifier_options": [ { "modifier_option": "{modifier_option_id}", "price_per": 0.5, "qty": 1, "price": 0.5 }, { "modifier_option": "{modifier_option_id}", "price_per": 0.15, "qty": 2, "price": 0.3 } ], "discounts": [ { "discount": "{discount_id}", "amount": 6.18 } ] } ], "discounts": [ { "discount": "{discount_id}", "amount": 8 } ], "charges": [ { "charge": "{charge_id}", "amount": 0.64, "name": "Service Charge" } ], "taxes": [ { "tax": "{tax_id}", "amount": 0.49, "name": "GST", "inclusive": false } ], "manufacturer_discounts": [ { "discount": "{discount_id}", "amount": 5 } ], "payments": [ { "id": "{receipt_id}", "payment": "{payment_id}", "receipt_no": "BC928K", "amount": 2.55, "created_at": "2018-03-08T13:00:00+08:00" } ], "refunds": [ { "id": "{refund_id}", "refund_no": "RFN069A", "amount": 0.55, "created_at": "2018-03-08T13:00:00+08:00", "refund_payments": [ { "payment": "{payment_id}", "amount": 0.30 }, { "payment": "{payment_id}", "amount": 0.25 } ] } ] } }
7.3 Update Order
Update existing order items, discounts and payments.
PUT Request
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders/{order_id}
Header
Authorization: Bearer {access_token}
Parameters
{ "items": [ { "id": "{order_item_id}", - *NOTE* Use order item id to retain the item’s kitchen and expedite status, or it will act as a new item "item": "{item_id}", "qty": 2, "notes": "Add Jalapeno", - optional, max 200 characters "variant": "{variant_id}", "price": "99.99", - optional, only include this variable for open price variant, only works on variant with no defined value "modifier_options": [ { "modifier_option": "{modifier_option_id}", "qty": 2 - optional, default 1 }, { "modifier_option": "{modifier_option_id}" } ], "discounts": [ - Item-based discount { "discount": "{discount_id}", "value": 10 - optional, only include this variable for open discount, only works on discount with no defined value }, { "discount": "{discount_id}" } ] }, { "id": "{order_item_id}", "item": "{item_id}", "qty": 1, "variant": "{variant_id}" }, { - Item with no id variable will act as a new item "item": "{item_id}", "qty": 1, "variant": "{variant_id}" } ], "charges": [ - optional, only include this variable to set custom charge amount { "charge": "{charge_id}", - please make sure that this charge is applicable for the selected dining option "amount": 8 } ], "discounts": [ - Order wide discount { "discount": "{discount _id}", "value": 10, - optional, only include this variable for open discount, only works on discount with no defined value }, { "discount": "{discount _id}" } ], "payments": [ - *NOTE* ONLY include new payment, DO NOT INCLUDE existing/previous payments, leave empty if there is no new payment (Reason: Dinlr does not allow amendment of payment once it is recorded) { "payment": "{payment_id}", "receipt_no": "BC928K", - optional, alphanumeric, no spaces, max 10 characters, unique but can use current order no "amount": 25.55 } ], "objects": [ { "object": "{object_id}", "pax": 3 } ], "loyalty_program_rewards": [ { "loyalty_program_reward": "{loyalty_program_reward_id}" } ], "order_info": { "dining_option": "{dining_option_id}", - optional "order_no": "BC928K", - optional, alphanumeric, no spaces, max 10 characters, unique, leave empty to use previous order_no "order_ticket": "C23", - optional, max 50 characters, leave empty to use previous order_ticket "pax": 3, - optional, leave empty to use previous pax "status": "pending", - optional, leave empty to use previous status "notes": "Self-collect at 3.30pm later", - optional, max 200 characters "customer": "{customer_id}", - optional "first_name": "Mark", - optional, max 50 characters "last_name": "Clinton", - optional, max 50 characters "email": "[email protected]", - optional, max 50 characters "phone": "+6511221122", - optional, max 50 characters "timeslot": "{timeslot_id}", - optional, for pre-orders "timeslot_start": "2020-07-10T06:00:00+00:00", - optional, ISO 8601 date, for pre-orders "timeslot_end": "2020-07-10T06:30:00+00:00", - optional, ISO 8601 date, for pre-orders "delivery_zone": "{delivery_zone_id}", - optional, for delivery orders "address1": "10 Kaki Bukit Ave 4", - optional, max 100 characters, delivery address "address2": "#05-73", - optional, max 100 characters, delivery address "city": "Singapore", - optional, max 100 characters, delivery address "country": "SG", - optional, Alpha-2 country code, delivery address "postal": "415874", - optional, max 50 characters, delivery address "address_lat": 1.3383981, - optional, delivery address latitute "address_lng": 103.9059644, - optional, delivery address longitude "order_at": "2020-07-10T05:00:00+00:00" - optional, ISO 8601 date, for pre-orders, the date which this order will show up in kitchen printer and KDS, leave empty to use previous order_at } }
Response
Same response as 7.2 View Order
7.4 Change Order Status
Update existing order status.
POST Request
Closes an order. Cannot be performed on cancelled orders.
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders/{order_id}/close
Re-opens an order. Cannot be performed on cancelled orders.
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders/{order_id}/open
Cancels an order. Cannot be performed on orders with transactions (payments or refunds).
https://api.dinlr.com/v1/{restaurant_id}/onlineorder/orders/{order_id}/cancel
Header
Authorization: Bearer {access_token}
Response
Same response as 7.2 View Order