Atlas Open API
  1. Outgoing
Atlas Open API
  • Introduction
  • Authentication
  • Date and Time
  • Errors
  • Webhooks
    • Incoming
      • Reservations (BETA)
    • Outgoing
      • Menus, Stocks, Orders, Outlets, Users
  • Menus
    • Menu List
      GET
    • Menu Details
      GET
  • Orders
    • Create Order
      POST
    • Order Details
      GET
    • Update Order
      PATCH
  • Stocks
    • Outlet Stocks
      GET
  • Users
    • User Sync
      GET
  1. Outgoing

Menus, Stocks, Orders, Outlets, Users

🚧
This feature is still under active development. Expect changes from the specifications.
Webhooks can be used to subscribe to events as they happen within Atlas. Contact us for assistance in setting up the events for your application.

Receiving events#

Atlas Open API delivers the webhooks by sending a POST request to the endpoint of your choosing. Your application must read event details from the request body as JSON.
The endpoint must acknowledge the receipt of the webhook by responding with 2xx HTTP status.

Retries and duplicate handling#

Atlas Open API expects a 2xx status response from the webhook endpoint. If this response is not received, Atlas Open API will retry the request.
It is expected for your application to receive a webhook multiple times. We recommend detecting deplicates so prevent double processing.

Events#

Menu#

menu.updated#

{
    "event_type": "menu.updated",
    "event_at": 1727423000,
    "payload": {
        "event": "menu.updated"
        "menu_id": 1
    }
}

Stock#

stock.updated#

{
    "event_type": "stock.updated",
    "event_at": 1727423000,
    "payload": {
        "item_id": 15,
        "outlet_id": 1,
        "is_available": true
    }
}

Order#

order.created#

OrderCreatedPayload
id
integer 
required
ID that uniquely identifies the order
user_id
integer 
required
User associated with the order
channel_id
integer 
required
Channel associated with the order
outlet_id
integer 
required
Outlet associated with the order
brand_id
integer  | null 
required
Brand associated with the order
identifier
string  | null 
required
state
string 
required
Current state of the order
fulfilment_type
enum<string> 
required
Specifies how the order will be fulfilled
Allowed values:
dine_inpickupdelivery
serving_date
string <date>
required
Date the order will be served, format YYYY-MM-DD
timeslot_start
integer 
required
Corresponds to the start of serving timeslot, number of seconds from the start of serving_date.
timeslot_end
integer 
required
Corresponds to the end of serving timeslot, number of seconds from the start of serving_date.
timeslot_type
enum<string> 
required
Type of timeslot the value corresponds to
Allowed value:
asap
timeslot_range
string 
read-onlyrequired
Human-readable presentation of the timeslot range
order_items
array[object (OrderItemResponse) {12}] 
required
id
integer 
required
ID that uniquely identifies the order item
item_id
integer 
required
Item the order item refers to
name
string 
required
Name of the item
quantity
integer 
required
Quantity of the item
>= 1
price_cents
integer 
required
currency
string 
required
Currency of price
discount
integer 
required
Default:
0
notes
string  | null 
required
Additional notes about the item
calculated_subtotal
integer  | null 
required
per_unit_quantity
integer  | null 
required
unit_label
string  | null 
required
sub_items
array [object {11}] 
required
contact_name
string  | null 
required
Name of the contact person, required for deliveriy
contact_email
string  | null 
required
Email of the contact person, required for delivery
contact_number
string  | null 
required
Mobile number of the contact person, required for delivery
address_line1
string  | null 
required
Component of the delivery address, required for delivery
address_line2
string  | null 
required
Component of the delivery address, required for delivery
external_order_id
string  | null 
required
External custom order ID
external_order_short_code
string  | null 
required
External custom order ID for easy reference
call_number
string 
required
postal_code
string  | null 
required
Postal code of the delivery address, required for delivery
address_latitude
number  | null 
required
Component of delivery address coordinates, used to check if address is within the outlet's service zone.
address_longitude
number  | null 
required
Component of delivery address coordinates, used to check if address is within the outlet's service zone.
is_cutlery_required
boolean 
required
Determines whether cutlery will be provided for delivery orders
Default:
false
is_contactless
boolean 
required
Default:
false
notes
string  | null 
required
Additional notes about the order
is_gift
boolean 
required
Specifies if the order is for gifting, in which case, ther order price won't be visible to the recipient.
Default:
false
recipient_name
string  | null 
required
Name of the gift recipient, required for gift orders
recipient_contact_number
string  | null 
required
Contact number of the gift recipient, required for gift orders
gift_message
string  | null 
required
Message to the gift recipient
is_paid
boolean 
required
Default:
false
promo_code
string  | null 
required
created_at
integer 
required
Timestamp on order creation. Format: unix time
updated_at
integer 
required
Timestamp on last order update. Format: unix time
cancelled_at
integer  | null 
required
Timestamp on order cancellation. Format: unix time
completed_at
integer  | null 
required
Timestamp on order completion. Format: unix time
donation_amount
integer 
required
>= 0
Default:
0
confirmation_custom_message
string  | null 
required
{
"event_type": "order.created",
"event_at": 1727423000,
"payload": {
    "id": 85,
    "identifier": null,
    "user_id": 17,
    "channel_id": 1,
    "outlet_id": 3,
    "brand_id": null,
    "fulfilment_type": "delivery",
    "state": "unpaid",
    "notes": null,
    "serving_date": "2024-10-01",
    "timeslot_start": 54000,
    "timeslot_end": 55800,
    "timeslot_range": "3:00PM–3:30PM",
    "contact_name": "John",
    "contact_email": "john@example.com",
    "contact_number": "80000001",
    "address_line1": "8 Temasek Boulevard",
    "address_line2": "Suntec Tower 3",
    "address_latitude": null,
    "address_longitude": null,
    "postal_code": "038988",
    "is_gift": false,
    "recipient_name": null,
    "recipient_contact_number": null,
    "gift_message": null,
    "is_paid": false,
    "promo_code": null,
    "delivery_fee": 0,
    "surcharge": 0,
    "admin_discount": 0,
    "discount": 0,
    "tax": 0,
    "tax_rate": "0.0",
    "tax_inclusive_prices": false,
    "subtotal": 0,
    "total": 0,
    "total_including_tax": 0,
    "is_cutlery_required": false,
    "is_contactless": false,
    "created_at": 1727423000,
    "updated_at": 1727423000,
    "cancelled_at": 1727423000,
    "completed_at": 1727423000,
    "order_items": [
        {
            "id": 214,
            "item_id": 380,
            "name": "Coffee",
            "quantity": 1,
            "currency": "SGD",
            "calculated_subtotal": 400,
            "per_unit_quantity": 1,
            "unit_label": null,
            "notes": null,
            "discount": 0,
            "price_cents": 400,
            "sub_items": [
                {
                    "id": 215,
                    "item_id": 496,
                    "name": "Iced",
                    "quantity": 1,
                    "currency": "SGD",
                    "calculated_subtotal": 0,
                    "per_unit_quantity": 1,
                    "unit_label": null,
                    "notes": null,
                    "discount": 0,
                    "price_cents": 0
                }
            ]
        },
        {
            "id": 216,
            "item_id": 480,
            "name": "Eggs Benedict",
            "quantity": 2,
            "currency": "SGD",
            "calculated_subtotal": 1600,
            "per_unit_quantity": 1,
            "unit_label": null,
            "notes": null,
            "discount": 0,
            "price_cents": 1600,
            "sub_items": []
        }
    ]
}
}

order.updated#

OrderCreatedPayload
id
integer 
required
ID that uniquely identifies the order
user_id
integer 
required
User associated with the order
channel_id
integer 
required
Channel associated with the order
outlet_id
integer 
required
Outlet associated with the order
brand_id
integer  | null 
required
Brand associated with the order
identifier
string  | null 
required
state
string 
required
Current state of the order
fulfilment_type
enum<string> 
required
Specifies how the order will be fulfilled
Allowed values:
dine_inpickupdelivery
serving_date
string <date>
required
Date the order will be served, format YYYY-MM-DD
timeslot_start
integer 
required
Corresponds to the start of serving timeslot, number of seconds from the start of serving_date.
timeslot_end
integer 
required
Corresponds to the end of serving timeslot, number of seconds from the start of serving_date.
timeslot_type
enum<string> 
required
Type of timeslot the value corresponds to
Allowed value:
asap
timeslot_range
string 
read-onlyrequired
Human-readable presentation of the timeslot range
order_items
array[object (OrderItemResponse) {12}] 
required
id
integer 
required
ID that uniquely identifies the order item
item_id
integer 
required
Item the order item refers to
name
string 
required
Name of the item
quantity
integer 
required
Quantity of the item
>= 1
price_cents
integer 
required
currency
string 
required
Currency of price
discount
integer 
required
Default:
0
notes
string  | null 
required
Additional notes about the item
calculated_subtotal
integer  | null 
required
per_unit_quantity
integer  | null 
required
unit_label
string  | null 
required
sub_items
array [object {11}] 
required
contact_name
string  | null 
required
Name of the contact person, required for deliveriy
contact_email
string  | null 
required
Email of the contact person, required for delivery
contact_number
string  | null 
required
Mobile number of the contact person, required for delivery
address_line1
string  | null 
required
Component of the delivery address, required for delivery
address_line2
string  | null 
required
Component of the delivery address, required for delivery
external_order_id
string  | null 
required
External custom order ID
external_order_short_code
string  | null 
required
External custom order ID for easy reference
call_number
string 
required
postal_code
string  | null 
required
Postal code of the delivery address, required for delivery
address_latitude
number  | null 
required
Component of delivery address coordinates, used to check if address is within the outlet's service zone.
address_longitude
number  | null 
required
Component of delivery address coordinates, used to check if address is within the outlet's service zone.
is_cutlery_required
boolean 
required
Determines whether cutlery will be provided for delivery orders
Default:
false
is_contactless
boolean 
required
Default:
false
notes
string  | null 
required
Additional notes about the order
is_gift
boolean 
required
Specifies if the order is for gifting, in which case, ther order price won't be visible to the recipient.
Default:
false
recipient_name
string  | null 
required
Name of the gift recipient, required for gift orders
recipient_contact_number
string  | null 
required
Contact number of the gift recipient, required for gift orders
gift_message
string  | null 
required
Message to the gift recipient
is_paid
boolean 
required
Default:
false
promo_code
string  | null 
required
created_at
integer 
required
Timestamp on order creation. Format: unix time
updated_at
integer 
required
Timestamp on last order update. Format: unix time
cancelled_at
integer  | null 
required
Timestamp on order cancellation. Format: unix time
completed_at
integer  | null 
required
Timestamp on order completion. Format: unix time
donation_amount
integer 
required
>= 0
Default:
0
confirmation_custom_message
string  | null 
required
{
"event_type": "order.updated",
"event_at": 1727423000,
"payload": {
    "id": 85,
    "identifier": null,
    "user_id": 17,
    "channel_id": 1,
    "outlet_id": 3,
    "brand_id": null,
    "fulfilment_type": "delivery",
    "state": "unpaid",
    "notes": null,
    "serving_date": "2024-10-01",
    "timeslot_start": 54000,
    "timeslot_end": 55800,
    "timeslot_range": "3:00PM–3:30PM",
    "contact_name": "John",
    "contact_email": "john@example.com",
    "contact_number": "80000001",
    "address_line1": "8 Temasek Boulevard",
    "address_line2": "Suntec Tower 3",
    "address_latitude": null,
    "address_longitude": null,
    "postal_code": "038988",
    "is_gift": false,
    "recipient_name": null,
    "recipient_contact_number": null,
    "gift_message": null,
    "is_paid": false,
    "promo_code": null,
    "delivery_fee": 0,
    "surcharge": 0,
    "admin_discount": 0,
    "discount": 0,
    "tax": 0,
    "tax_rate": "0.0",
    "tax_inclusive_prices": false,
    "subtotal": 0,
    "total": 0,
    "total_including_tax": 0,
    "is_cutlery_required": false,
    "is_contactless": false,
    "created_at": 1727423000,
    "updated_at": 1727423000,
    "cancelled_at": 1727423000,
    "completed_at": 1727423000,
    "order_items": [
        {
            "id": 214,
            "item_id": 380,
            "name": "Coffee",
            "quantity": 1,
            "currency": "SGD",
            "calculated_subtotal": 400,
            "per_unit_quantity": 1,
            "unit_label": null,
            "notes": null,
            "discount": 0,
            "price_cents": 400,
            "sub_items": [
                {
                    "id": 215,
                    "item_id": 496,
                    "name": "Iced",
                    "quantity": 1,
                    "currency": "SGD",
                    "calculated_subtotal": 0,
                    "per_unit_quantity": 1,
                    "unit_label": null,
                    "notes": null,
                    "discount": 0,
                    "price_cents": 0
                }
            ]
        },
        {
            "id": 216,
            "item_id": 480,
            "name": "Eggs Benedict",
            "quantity": 2,
            "currency": "SGD",
            "calculated_subtotal": 1600,
            "per_unit_quantity": 1,
            "unit_label": null,
            "notes": null,
            "discount": 0,
            "price_cents": 1600,
            "sub_items": []
        }
    ]
}
}

Outlet#

outlet.created#

   {
      "event_type": "outlet.created",
      "payload": {
        "id": 2,
        "identifier": "valley-hungry",
        "label": "Hungry Valley",
        "address": "Hungry Valley, Singapore",
        "description": "Valley of hungry people",
        "contact_number": "+6598890011",
        "created_at": "2022-11-23T12:39:41.039+08:00",
        "updated_at": "2025-01-23T12:37:43.456+08:00",
        "email": "outlet@atlas.kitchen",
        "archived": null
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }

outlet.updated#

   {
      "event_type": "outlet.updated",
      "payload": {
        "id": 2,
        "identifier": "valley-hungry",
        "label": "Hungry Valley",
        "address": "Hungry Valley, Singapore",
        "description": "Valley of hungry people",
        "contact_number": "+6598890011",
        "created_at": "2022-11-23T12:39:41.039+08:00",
        "updated_at": "2025-01-23T12:37:43.456+08:00",
        "email": "outlet@atlas.kitchen",
        "archived": null
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }

outlet.closed#

   {
      "event_type": "outlet.closed",
      "payload": {
        "id": 2,
        "identifier": "valley-hungry",
        "label": "Hungry Valley",
        "address": "Hungry Valley, Singapore",
        "description": "Valley of hungry people",
        "contact_number": "+6598890011",
        "created_at": "2022-11-23T12:39:41.039+08:00",
        "updated_at": "2025-01-23T12:37:43.456+08:00",
        "email": "outlet@atlas.kitchen",
        "archived": null
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }

outlet.opened#

   {
      "event_type": "outlet.opened",
      "payload": {
        "id": 2,
        "identifier": "valley-hungry",
        "label": "Hungry Valley",
        "address": "Hungry Valley, Singapore",
        "description": "Valley of hungry people",
        "contact_number": "+6598890011",
        "created_at": "2022-11-23T12:39:41.039+08:00",
        "updated_at": "2025-01-23T12:37:43.456+08:00",
        "email": "outlet@atlas.kitchen",
        "archived": null
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }

User#

user.created#

   {
      "event_type": "user.created",
      "data": {
        "id": 123,
        "email": "john.doe@example.com",
        "mobile_number": "+1234567890", 
        "name": "John Doe",
        "date_of_birth": "1990-01-01",
        "marketing_consent": true,
        "title": "Mr.",
        "external_user_links": [
          {
            "external_user_id": "ext_123",
            "external_user_type": "ext_app"
          }
        ]
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }

user.updated#

   {
      "event_type": "user.updated",
      "data": {
        "id": 123,
        "email": "john.doe@example.com",
        "mobile_number": "+1234567890",
        "name": "John Doe", 
        "date_of_birth": "1990-01-01",
        "marketing_consent": true,
        "title": "Mr.",
        "external_user_links": [
          {
            "external_user_id": "ext_123",
            "external_user_type": "ext_app"
          }
        ]
      },
      "created_at": "2025-01-23T14:11:12.008+08:00",
      "updated_at": "2025-01-23T14:11:12.008+08:00"
   }
Previous
Reservations (BETA)
Next
Menu List
Built with