> ## Documentation Index
> Fetch the complete documentation index at: https://help.atlas.kitchen/llms.txt
> Use this file to discover all available pages before exploring further.

# Get menus

> Returns published menus with sections, products, and modifier groups.



## OpenAPI

````yaml get /outlets/{outlet_id}/serving_dates/{serving_date}/menus
openapi: 3.1.0
info:
  title: Atlas Storefront API
  version: 1.0.0
  description: ''
servers:
  - url: https://api.atlas.kitchen/storefronts/v1
    description: Storefront API
security:
  - channelId: []
    sessionId: []
tags:
  - name: Introduction
    description: >
      The Atlas Storefront API powers online ordering for food and beverage
      merchants. Each merchant on Atlas operates one or more **outlets**
      (physical locations), each with its own menus, service hours, delivery
      zones, and payment processing.


      This API lets you build a complete ordering experience on top of Atlas:


      - **Browse** a merchant's menus with sections, items, modifiers, and
      real-time stock

      - **Build** a cart with configurable items, promo codes, and loyalty
      points

      - **Pay** via a hosted payment page with real-time confirmation

      - **Confirm** orders with a single API call after payment


      ### How it works


      Every merchant has a **channel** — a unique identifier representing their
      storefront (website, app, kiosk, etc.). The channel determines which
      outlets, menus, and branding the diner sees. You receive a channel ID when
      a merchant is onboarded.


      The API is stateless from your perspective. You pass the channel ID, the
      API gives you a session, and from there you can browse menus, build a
      cart, and check out — all without user accounts or login.


      ### Conventions


      **Monetary values** — All monetary fields (`price_cents`, `subtotal`,
      `total`, `tax`, `delivery_fee`, etc.) are integers in **minor currency
      units** (e.g. cents). `1580` = $15.80 SGD.


      **Timeslots** — Time values (`timeslot_start`, `timeslot_end`,
      `service_start`, `service_end`) are in **seconds since midnight**. `36000`
      = 10:00 AM.


      **Errors** — All errors follow a consistent structure:

      ```json

      {
        "type": "Invalid Parameter",
        "message": "Human-readable description",
        "details": [
          { "field": "item_id", "message": "must exist" }
        ]
      }

      ```
  - name: Authentication
    description: >
      ### Channel ID


      Every request must include an `X-Channel-Id` header. This identifies which
      merchant's storefront you're accessing — it determines the outlets, menus,
      branding, and payment configuration the diner sees.


      You receive the channel ID when a merchant is onboarded to Atlas. It is a
      fixed identifier, not a secret.


      ### Sessions


      The API automatically creates a session on your first request and returns
      it in the `X-Session-Id` response header. This session tracks the diner's
      cart.


      ```bash

      # First request — only X-Channel-Id needed

      curl -sD - https://api.example.com/storefronts/v1/channel \
        -H "X-Channel-Id: your-channel-id"
      ```


      ```

      # Response header — save this

      X-Session-Id: b7ac755d301dc5d23c790ccd7bb6dadf

      ```


      Include both headers on all subsequent requests:


      | Header | What it is | Where it comes from |

      |--------|-----------|-------------------|

      | `X-Channel-Id` | Merchant's storefront identifier | Provided during
      onboarding |

      | `X-Session-Id` | Diner's session (tracks cart) | Auto-created, returned
      in first response header |


      Sessions are lightweight — they hold a reference to the diner's active
      cart. When an order is placed, the session gets a new empty cart
      automatically.
  - name: Checkout Flow
    description: >
      The complete ordering flow from menu to confirmed order:


      <img src="/checkout-flow.svg" alt="Checkout Flow"
      style="width:100%;max-width:100%" />


      ### After payment


      Once the diner completes payment on the hosted page and is redirected back
      to your app, call `POST /cart/order`.


      This endpoint validates the payment **in real-time** — it makes a
      synchronous call to the payment processor to check status. It does **not**
      depend on webhooks.


      - **Payment succeeded** → cart converts to a confirmed order, full order
      object returned

      - **Payment not completed** → `422` with `"Insufficient payment made to
      the cart"`


      No polling needed. No webhook waiting. Just one call.
  - name: Channel
    description: >
      Retrieve merchant configuration, outlet details, service hours, delivery
      fees, and content (announcements, banners, popups).


      Start here — `GET /channel` gives you the outlets you can order from,
      including their coordinates, service hours, and delivery fee structure.
  - name: Menu
    description: >
      Browse menus for a specific outlet and serving date. Returns the full
      catalog: sections, items with prices, configurable items with modifier
      groups, stock levels, timeslots, and availability.


      ### How menus are structured


      ```

      Menu

      ├── sections[]           → categories (Mains, Sides, Drinks)

      │   ├── products[]       → item IDs + display_order

      │   └── sub_sections[]   → nested categories

      └── products{}           → full item details keyed by ID
          ├── price_cents
          ├── is_configurable
          └── item_modifier_groups[]  → modifier groups with options
      ```


      Use `sections[].products[].id` to look up full item details in the
      `products{}` map.
  - name: Cart
    description: >
      Manage the shopping cart — create, configure, add/remove items, apply
      promos, and review pricing.


      ### Cart lifecycle


      1. `POST /cart` — create empty cart

      2. `PATCH /cart` — set outlet, fulfilment type, timeslot, contact details

      3. `POST /cart/items` — add items (with optional modifiers via
      `sub_items`)

      4. `GET /cart/payment_breakdown` — review subtotal, tax, fees, discounts

      5. `POST /cart/validation` — verify cart is ready for checkout


      ### Adding items with modifiers


      For configurable items (`is_configurable: true`), pass modifiers as
      `sub_items`:


      ```json

      {
        "item_id": 1,
        "quantity": 2,
        "sub_items": [
          {
            "item_id": 2,
            "modifier_id": 1,
            "item_modifier_group_id": 1,
            "quantity": 1
          }
        ]
      }

      ```


      Get `modifier_id` and `item_modifier_group_id` from the menu's
      `item_modifier_groups`.
  - name: Payment
    description: >
      Create a payment intent to generate a hosted payment page URL.


      ### Flow


      1. Call `POST /payment_intents` → receive `atlas_pay_url`

      2. Redirect the diner to `atlas_pay_url`

      3. Diner enters payment details and pays

      4. Diner is redirected back to your app

      5. Call `POST /cart/order` to confirm (see **Order**)


      If a pending payment intent already exists for the same cart amount, the
      existing one is returned instead of creating a duplicate.
  - name: Order
    description: >
      Convert a paid cart into a confirmed order.


      Call `POST /cart/order` after the diner completes payment. This endpoint:


      1. Validates the cart (items, timeslot, minimum order)

      2. Checks payment status **in real-time** against the payment processor

      3. Converts the cart to a confirmed order


      On success, returns the full order object. The session automatically gets
      a fresh empty cart for the next order.


      If called before payment completes, returns `422` with a clear error
      message.
paths:
  /outlets/{outlet_id}/serving_dates/{serving_date}/menus:
    get:
      tags:
        - Menu
      summary: Get menus
      description: Returns published menus with sections, products, and modifier groups.
      operationId: listMenus
      parameters:
        - $ref: '#/components/parameters/outletId'
        - $ref: '#/components/parameters/servingDate'
      responses:
        '200':
          description: Menu list with full hierarchy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MenuListResponse'
              example:
                object: menu
                outlet_id: 1
                serving_date: '2026-04-17'
                items:
                  - id: 1
                    identifier: aviato-burger-1
                    name: Aviato Burger
                    tag_list: []
                    lead_time: 0
                    start_date: '2026-04-15'
                    end_date: '2036-04-15'
                    created_at: 1776182695
                    updated_at: 1776182698
                    sections:
                      - display_order: 0
                        id: 1
                        identifier: menu-mains
                        name: Mains
                        description: null
                        image_url: null
                        sub_sections: []
                        products:
                          - display_order: 0
                            id: 1
                          - display_order: 1
                            id: 16
                      - display_order: 1
                        id: 2
                        identifier: menu-sides
                        name: Sides
                        description: null
                        image_url: null
                        sub_sections: []
                        products:
                          - display_order: 0
                            id: 17
                          - display_order: 1
                            id: 18
                      - display_order: 2
                        id: 3
                        identifier: menu-dessert
                        name: Dessert
                        description: null
                        image_url: null
                        sub_sections: []
                        products:
                          - display_order: 0
                            id: 21
                      - display_order: 3
                        id: 4
                        identifier: menu-drinks
                        name: Drinks
                        description: null
                        image_url: null
                        sub_sections: []
                        products:
                          - display_order: 0
                            id: 22
                          - display_order: 1
                            id: 23
                    products:
                      '1':
                        currency: SGD
                        price_cents: 790
                        brand_id: 1
                        name: Scrambled Eggs Bowl
                        description: >-
                          Fluffy scrambled eggs with your choice of protein and
                          toppings
                        is_configurable: true
                        id: 1
                        sku: menu-scrambled-eggs-bowl
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: true
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups:
                          - id: 1
                            display_order: 0
                            is_fixed: false
                            hide_thumbnails: false
                            archived: false
                            selection_required_min_override: null
                            selection_required_max_override: null
                            modifier_group:
                              id: 1
                              identifier: choose-spice-level
                              name: Choose Spice Level
                              selection_required_min: 1
                              selection_required_max: 1
                              max_quantity_per_modifier: null
                              hide_thumbnails: false
                              modifiers:
                                - id: 1
                                  display_order: 0
                                  default_quantity: 0
                                  price_cents_override: null
                                  upsell_label: null
                                  upsell_label_text_color: null
                                  upsell_label_background_color: null
                                  item:
                                    price_cents: 0
                                    name: Mild
                                    description: null
                                    type: Component
                                    id: 2
                                    sugar_level: null
                                    nutri_grade: null
                                    horizontal_image_url: null
                                    product_tags: []
                                    additional_data: {}
                                    promotional_label_text: null
                                    promotional_label_font_color: null
                                    promotional_label_bg_color: null
                                - id: 2
                                  display_order: 1
                                  default_quantity: 0
                                  price_cents_override: null
                                  upsell_label: null
                                  upsell_label_text_color: null
                                  upsell_label_background_color: null
                                  item:
                                    price_cents: 0
                                    name: Spicy
                                    description: null
                                    type: Component
                                    id: 3
                                    sugar_level: null
                                    nutri_grade: null
                                    horizontal_image_url: null
                                    product_tags: []
                                    additional_data: {}
                                    promotional_label_text: null
                                    promotional_label_font_color: null
                                    promotional_label_bg_color: null
                          - id: 2
                            display_order: 1
                            is_fixed: false
                            hide_thumbnails: false
                            archived: false
                            selection_required_min_override: null
                            selection_required_max_override: null
                            modifier_group:
                              id: 2
                              identifier: select-filling
                              name: Select Filling
                              selection_required_min: 1
                              selection_required_max: 1
                              max_quantity_per_modifier: null
                              hide_thumbnails: false
                              modifiers:
                                - id: 3
                                  display_order: 0
                                  default_quantity: 0
                                  price_cents_override: null
                                  upsell_label: null
                                  upsell_label_text_color: null
                                  upsell_label_background_color: null
                                  item:
                                    price_cents: 0
                                    name: Bacon
                                    description: null
                                    type: Component
                                    id: 4
                                    sugar_level: null
                                    nutri_grade: null
                                    horizontal_image_url: null
                                    product_tags: []
                                    additional_data: {}
                                    promotional_label_text: null
                                    promotional_label_font_color: null
                                    promotional_label_bg_color: null
                          - id: 4
                            display_order: 3
                            is_fixed: false
                            hide_thumbnails: false
                            archived: false
                            selection_required_min_override: null
                            selection_required_max_override: null
                            modifier_group:
                              id: 4
                              identifier: add-ons
                              name: Add-ons
                              selection_required_min: 0
                              selection_required_max: 6
                              max_quantity_per_modifier: null
                              hide_thumbnails: false
                              modifiers:
                                - id: 12
                                  display_order: 3
                                  default_quantity: 0
                                  price_cents_override: null
                                  upsell_label: null
                                  upsell_label_text_color: null
                                  upsell_label_background_color: null
                                  item:
                                    price_cents: 50
                                    name: Extra Cheese
                                    description: null
                                    type: Component
                                    id: 13
                                    sugar_level: null
                                    nutri_grade: null
                                    horizontal_image_url: null
                                    product_tags: []
                                    additional_data: {}
                                    promotional_label_text: null
                                    promotional_label_font_color: null
                                    promotional_label_bg_color: null
                      '16':
                        currency: SGD
                        price_cents: 790
                        brand_id: 1
                        name: Burrito
                        description: Flour tortilla with your choice of filling
                        is_configurable: true
                        id: 16
                        sku: menu-burrito
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
                      '17':
                        currency: SGD
                        price_cents: 400
                        brand_id: 1
                        name: Corn Chips
                        description: null
                        is_configurable: false
                        id: 17
                        sku: menu-corn-chips
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
                      '18':
                        currency: SGD
                        price_cents: 600
                        brand_id: 1
                        name: Guacamole
                        description: null
                        is_configurable: false
                        id: 18
                        sku: menu-guacamole
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
                      '21':
                        currency: SGD
                        price_cents: 395
                        brand_id: 1
                        name: Churros
                        description: null
                        is_configurable: false
                        id: 21
                        sku: menu-churros
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
                      '22':
                        currency: SGD
                        price_cents: 250
                        brand_id: 1
                        name: Water
                        description: null
                        is_configurable: false
                        id: 22
                        sku: menu-water
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
                      '23':
                        currency: SGD
                        price_cents: 250
                        brand_id: 1
                        name: Coke Zero
                        description: null
                        is_configurable: false
                        id: 23
                        sku: menu-coke-zero
                        report_category: null
                        additional_data: {}
                        horizontal_image_url: null
                        product_tags: []
                        archived_at: null
                        is_highlight: false
                        promotional_label_text: null
                        promotional_label_font_color: null
                        promotional_label_bg_color: null
                        sugar_level: null
                        nutri_grade: null
                        item_modifier_groups: []
        '401':
          $ref: '#/components/responses/Unauthorized'
      security:
        - channelId: []
components:
  parameters:
    outletId:
      name: outlet_id
      in: path
      required: true
      schema:
        type: integer
    servingDate:
      name: serving_date
      in: path
      required: true
      schema:
        type: string
        format: date
        example: '2026-04-11'
  schemas:
    MenuListResponse:
      type: object
      properties:
        object:
          type: string
          example: menu
        outlet_id:
          type: integer
          example: 1
        serving_date:
          type: string
          format: date
          example: '2026-04-17'
        items:
          type: array
          items:
            $ref: '#/components/schemas/Menu'
    Menu:
      type: object
      properties:
        id:
          type: integer
          example: 1
        identifier:
          type: string
          example: aviato-burger-1
        name:
          type: string
          example: Aviato Burger
        tag_list:
          type: array
          items:
            type: string
          example: []
        lead_time:
          type: integer
          description: Minutes
          example: 0
        start_date:
          type: string
          format: date
          example: '2026-04-15'
        end_date:
          type: string
          format: date
          example: '2036-04-15'
        created_at:
          type: integer
          description: Unix timestamp
          example: 1776182695
        updated_at:
          type: integer
          description: Unix timestamp
          example: 1776182698
        sections:
          type: array
          items:
            $ref: '#/components/schemas/MenuSection'
        products:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/Product'
    Error:
      type: object
      properties:
        type:
          type: string
          example: Invalid Parameter
        message:
          type: string
        details:
          type: array
          items:
            type: object
            properties:
              field:
                type: string
              message:
                type: string
    MenuSection:
      type: object
      properties:
        id:
          type: integer
          example: 1
        identifier:
          type: string
          example: menu-mains
        name:
          type: string
          example: Mains
        description:
          type: string
          nullable: true
          example: null
        display_order:
          type: integer
          example: 0
        image_url:
          type: string
          nullable: true
          example: null
        sub_sections:
          type: array
          items:
            $ref: '#/components/schemas/MenuSubSection'
          example: []
        products:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
                example: 1
              display_order:
                type: integer
                example: 0
    Product:
      type: object
      properties:
        id:
          type: integer
          example: 1
        name:
          type: string
          example: Scrambled Eggs Bowl
        sku:
          type: string
          example: menu-scrambled-eggs-bowl
        description:
          type: string
          nullable: true
          example: Fluffy scrambled eggs with your choice of protein and toppings
        price_cents:
          type: integer
          example: 790
        currency:
          type: string
          example: SGD
        brand_id:
          type: integer
          example: 1
        is_configurable:
          type: boolean
          example: true
        is_highlight:
          type: boolean
          example: true
        horizontal_image_url:
          type: string
          nullable: true
          example: null
        product_tags:
          type: array
          items:
            type: string
          example: []
        promotional_label_text:
          type: string
          nullable: true
          example: null
        promotional_label_font_color:
          type: string
          nullable: true
          example: null
        promotional_label_bg_color:
          type: string
          nullable: true
          example: null
        sugar_level:
          type: string
          nullable: true
          example: null
        nutri_grade:
          type: string
          nullable: true
          example: null
        report_category:
          type: string
          nullable: true
          example: null
        archived_at:
          type: string
          format: date-time
          nullable: true
          example: null
        additional_data:
          type: object
          nullable: true
          example: {}
        item_modifier_groups:
          type: array
          items:
            $ref: '#/components/schemas/ItemModifierGroup'
    MenuSubSection:
      type: object
      properties:
        id:
          type: integer
        identifier:
          type: string
        name:
          type: string
        description:
          type: string
          nullable: true
        display_order:
          type: integer
        image_url:
          type: string
          nullable: true
        products:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
              display_order:
                type: integer
    ItemModifierGroup:
      type: object
      properties:
        id:
          type: integer
          example: 1
        display_order:
          type: integer
          example: 0
        is_fixed:
          type: boolean
          example: false
        hide_thumbnails:
          type: boolean
          example: false
        archived:
          type: boolean
          example: false
        selection_required_min_override:
          type: integer
          nullable: true
          example: null
        selection_required_max_override:
          type: integer
          nullable: true
          example: null
        modifier_group:
          $ref: '#/components/schemas/ModifierGroup'
    ModifierGroup:
      type: object
      properties:
        id:
          type: integer
          example: 1
        identifier:
          type: string
          example: salsa-level
        name:
          type: string
          example: Salsa Level
        selection_required_min:
          type: integer
          example: 1
        selection_required_max:
          type: integer
          example: 1
        max_quantity_per_modifier:
          type: integer
          nullable: true
          example: null
        hide_thumbnails:
          type: boolean
          example: false
        modifiers:
          type: array
          items:
            $ref: '#/components/schemas/Modifier'
    Modifier:
      type: object
      properties:
        id:
          type: integer
          example: 1
        display_order:
          type: integer
          example: 0
        default_quantity:
          type: integer
          example: 0
        price_cents_override:
          type: integer
          nullable: true
          example: null
        upsell_label:
          type: string
          nullable: true
          example: null
        upsell_label_text_color:
          type: string
          nullable: true
          example: null
        upsell_label_background_color:
          type: string
          nullable: true
          example: null
        item:
          $ref: '#/components/schemas/ModifierItem'
    ModifierItem:
      type: object
      properties:
        id:
          type: integer
          example: 2
        name:
          type: string
          example: Mild
        price_cents:
          type: integer
          example: 0
        description:
          type: string
          nullable: true
          example: null
        type:
          type: string
          nullable: true
          example: Component
        product_tags:
          type: array
          items:
            type: string
          example: []
        horizontal_image_url:
          type: string
          nullable: true
          example: null
        sugar_level:
          type: string
          nullable: true
          example: null
        nutri_grade:
          type: string
          nullable: true
          example: null
        promotional_label_text:
          type: string
          nullable: true
          example: null
        promotional_label_font_color:
          type: string
          nullable: true
          example: null
        promotional_label_bg_color:
          type: string
          nullable: true
          example: null
        additional_data:
          type: object
          nullable: true
          example: {}
  responses:
    Unauthorized:
      description: Missing or invalid X-Channel-Id or X-Session-Id
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    channelId:
      type: apiKey
      in: header
      name: X-Channel-Id
      description: Merchant storefront identifier. Provided during onboarding.
    sessionId:
      type: apiKey
      in: header
      name: X-Session-Id
      description: >-
        Diner session identifier. Created by `GET /channel` and returned in the
        `X-Session-Id` response header.

````