Eat App Tables and Floorplan API

Table and floor-plan management is core to the Eat App platform, but no public tables or floorplan endpoints are documented in the Partner or Concierge references as of the review date. The endpoints modeled here (list tables, list floor plans, get table) are HONESTLY MODELED on Eat App's documented resource conventions and marked as endpointsModeled - they should be confirmed against a partner API key before use.

OpenAPI Specification

eat-app-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Eat App Platform API
  description: >-
    Eat App is a restaurant reservation and table management platform. This
    document models its two documented, partner/key-gated REST surfaces plus a
    small honestly-modeled table-management surface:

    1. Partner API (base /partners/v2) - for booking channels to read
    availability and post reservations.

    2. Concierge API (base /concierge/v2) - for restaurants, vendors, and groups
    to sync reservations, guests, availability, and reference data (resources,
    groups, restaurants). Requests are scoped with X-Group-ID and X-Restaurant-ID
    headers and can be created idempotently via an idempotency_token.

    3. Tables and Floor Plans (base /concierge/v2) - MODELED. No public tables or
    floorplan endpoints are documented; these operations are honestly modeled on
    Eat App's documented resource conventions and should be confirmed with a
    partner API key before use.

    All responses follow a JSON:API-style structure (data objects carrying id,
    type, and attributes). Every request is authenticated with a Bearer token
    (the API key Eat App issues to a partner or Concierge user). The sandbox host
    is https://api.eat-sandbox.co and production is https://api.eatapp.co.
    Endpoints are rate limited to roughly 60 requests per minute.
  version: '2.0'
  contact:
    name: Eat App
    url: https://eatapp.co
servers:
  - url: https://api.eatapp.co
    description: Production
  - url: https://api.eat-sandbox.co
    description: Sandbox
security:
  - bearerAuth: []
tags:
  - name: Partner - Availability
    description: Partner API real-time availability lookups.
  - name: Partner - Reservations
    description: Partner API reservation creation.
  - name: Concierge - Reference
    description: Concierge bootstrap data - resources, groups, restaurants.
  - name: Concierge - Availability
    description: Concierge bookable time-slot lookups over a date range.
  - name: Concierge - Reservations
    description: Concierge reservation create, list, get, and update/cancel.
  - name: Concierge - Guests
    description: Concierge guest search and profile retrieval.
  - name: Tables and Floor Plans (Modeled)
    description: >-
      Honestly-modeled table and floor-plan operations. Not documented in the
      public Partner or Concierge references; confirm before use.
paths:
  /partners/v2/availability:
    get:
      operationId: getPartnerAvailability
      tags:
        - Partner - Availability
      summary: Get availability (Partner)
      description: >-
        Returns bookable availability for a restaurant on a given date. Confirmed
        from the public Partner API documentation.
      parameters:
        - name: restaurant_id
          in: query
          required: true
          schema:
            type: string
          description: The Eat App restaurant identifier.
        - name: date
          in: query
          required: true
          schema:
            type: string
            format: date
          description: The date to check availability for (YYYY-MM-DD).
        - name: guests
          in: query
          required: false
          schema:
            type: integer
          description: Party size to check availability for.
      responses:
        '200':
          description: A JSON:API document of available time slots.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailabilityResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /partners/v2/reservations:
    post:
      operationId: createPartnerReservation
      tags:
        - Partner - Reservations
      summary: Post a reservation (Partner)
      description: >-
        Creates a reservation for a restaurant on behalf of a booking channel.
        Confirmed from the public Partner API documentation.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerReservationInput'
      responses:
        '201':
          description: The created reservation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
        '429':
          $ref: '#/components/responses/RateLimited'
  /concierge/v2/resources:
    get:
      operationId: getConciergeResources
      tags:
        - Concierge - Reference
      summary: Get reference data
      description: >-
        Loads reference data used for dropdowns and validation (e.g. reservation
        statuses, sources, tags). Confirmed from the public Concierge docs.
      responses:
        '200':
          description: A JSON:API document of reference resources.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /concierge/v2/groups:
    get:
      operationId: listConciergeGroups
      tags:
        - Concierge - Reference
      summary: List accessible groups
      description: Lists the groups the authenticated Concierge user can access.
      responses:
        '200':
          description: A JSON:API document of groups.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /concierge/v2/restaurants:
    get:
      operationId: listConciergeRestaurants
      tags:
        - Concierge - Reference
      summary: List restaurants in a group
      description: >-
        Lists restaurants within a group. Requires the X-Group-ID header.
        Confirmed from the public Concierge docs.
      parameters:
        - $ref: '#/components/parameters/GroupIdHeader'
      responses:
        '200':
          description: A JSON:API document of restaurants.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /concierge/v2/availability/range:
    post:
      operationId: getConciergeAvailabilityRange
      tags:
        - Concierge - Availability
      summary: Query availability over a date range
      description: >-
        Returns bookable time slots for a restaurant across a date range.
        Requires the X-Restaurant-ID header. Confirmed from the public Concierge
        docs.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AvailabilityRangeInput'
      responses:
        '200':
          description: A JSON:API document of available slots.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailabilityResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /concierge/v2/reservations:
    get:
      operationId: listConciergeReservations
      tags:
        - Concierge - Reservations
      summary: List reservations
      description: >-
        Lists reservations for a restaurant with filtering options. Requires the
        X-Restaurant-ID header.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
        - name: date
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Filter reservations by date.
        - name: status
          in: query
          required: false
          schema:
            type: string
          description: Filter reservations by status.
      responses:
        '200':
          description: A JSON:API document of reservations.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createConciergeReservation
      tags:
        - Concierge - Reservations
      summary: Create a reservation
      description: >-
        Creates a new reservation. Requires the X-Restaurant-ID header and an
        idempotency_token to safely retry. Confirmed from the public Concierge
        docs.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConciergeReservationInput'
      responses:
        '201':
          description: The created reservation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '422':
          $ref: '#/components/responses/ValidationError'
  /concierge/v2/reservations/{id_or_key}:
    parameters:
      - $ref: '#/components/parameters/IdOrKey'
      - $ref: '#/components/parameters/RestaurantIdHeader'
    get:
      operationId: getConciergeReservation
      tags:
        - Concierge - Reservations
      summary: Get a reservation
      description: Retrieves a single reservation by id or key.
      responses:
        '200':
          description: The requested reservation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: updateConciergeReservation
      tags:
        - Concierge - Reservations
      summary: Update or cancel a reservation
      description: >-
        Modifies an existing reservation or cancels it (by setting its status).
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConciergeReservationInput'
      responses:
        '200':
          description: The updated reservation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ReservationResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/ValidationError'
  /concierge/v2/guests:
    get:
      operationId: searchConciergeGuests
      tags:
        - Concierge - Guests
      summary: Search guests
      description: >-
        Searches the guest CRM by query parameter. Requires the X-Restaurant-ID
        header. Confirmed from the public Concierge docs.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
        - name: query
          in: query
          required: false
          schema:
            type: string
          description: Free-text guest search (name, phone, email).
      responses:
        '200':
          description: A JSON:API document of matching guests.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GuestListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /concierge/v2/guests/{guest_id}:
    get:
      operationId: getConciergeGuest
      tags:
        - Concierge - Guests
      summary: Get a guest
      description: Retrieves an individual guest profile by id.
      parameters:
        - name: guest_id
          in: path
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/RestaurantIdHeader'
      responses:
        '200':
          description: The requested guest profile.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GuestResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /concierge/v2/tables:
    get:
      operationId: listTables
      tags:
        - Tables and Floor Plans (Modeled)
      summary: List tables (MODELED)
      description: >-
        MODELED, not documented. Lists the tables configured for a restaurant.
        Confirm the real path and shape with a partner API key before use.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
      responses:
        '200':
          description: A JSON:API document of tables.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /concierge/v2/tables/{table_id}:
    get:
      operationId: getTable
      tags:
        - Tables and Floor Plans (Modeled)
      summary: Get a table (MODELED)
      description: MODELED, not documented. Retrieves a single table by id.
      parameters:
        - name: table_id
          in: path
          required: true
          schema:
            type: string
        - $ref: '#/components/parameters/RestaurantIdHeader'
      responses:
        '200':
          description: The requested table.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /concierge/v2/floor_plans:
    get:
      operationId: listFloorPlans
      tags:
        - Tables and Floor Plans (Modeled)
      summary: List floor plans (MODELED)
      description: >-
        MODELED, not documented. Lists the floor plans (dining areas / room
        layouts) configured for a restaurant. Confirm before use.
      parameters:
        - $ref: '#/components/parameters/RestaurantIdHeader'
      responses:
        '200':
          description: A JSON:API document of floor plans.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GenericResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Bearer token (the API key Eat App issues to a partner or Concierge user).
        Sent as Authorization: Bearer <api_token>.
  parameters:
    GroupIdHeader:
      name: X-Group-ID
      in: header
      required: true
      schema:
        type: string
      description: Scopes the request to a specific group.
    RestaurantIdHeader:
      name: X-Restaurant-ID
      in: header
      required: true
      schema:
        type: string
      description: Scopes the request to a specific restaurant.
    IdOrKey:
      name: id_or_key
      in: path
      required: true
      schema:
        type: string
      description: The reservation id or reservation key.
  responses:
    Unauthorized:
      description: Missing or invalid Bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ValidationError:
      description: The request body failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: Too many requests (approximately 60 requests per minute).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    ResourceObject:
      type: object
      properties:
        id:
          type: string
        type:
          type: string
        attributes:
          type: object
          additionalProperties: true
    GenericResponse:
      type: object
      properties:
        data:
          oneOf:
            - $ref: '#/components/schemas/ResourceObject'
            - type: array
              items:
                $ref: '#/components/schemas/ResourceObject'
    AvailabilityResponse:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
              type:
                type: string
                example: availability
              attributes:
                type: object
                properties:
                  time:
                    type: string
                  available:
                    type: boolean
                  preference_id:
                    type: string
    AvailabilityRangeInput:
      type: object
      required:
        - start_date
        - end_date
        - guests
      properties:
        start_date:
          type: string
          format: date
        end_date:
          type: string
          format: date
        guests:
          type: integer
    PartnerReservationInput:
      type: object
      required:
        - restaurant_id
        - date
        - time
        - guests
      properties:
        restaurant_id:
          type: string
        date:
          type: string
          format: date
        time:
          type: string
        guests:
          type: integer
        preference_id:
          type: string
        guest:
          $ref: '#/components/schemas/GuestInput'
    ConciergeReservationInput:
      type: object
      properties:
        idempotency_token:
          type: string
          description: Required on create to make the request safely retryable.
        date:
          type: string
          format: date
        time:
          type: string
        guests:
          type: integer
        status:
          type: string
          description: Set to a cancelled status to cancel the reservation.
        preference_id:
          type: string
        guest:
          $ref: '#/components/schemas/GuestInput'
    GuestInput:
      type: object
      properties:
        first_name:
          type: string
        last_name:
          type: string
        phone:
          type: string
        email:
          type: string
    ReservationResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/ResourceObject'
    ReservationListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ResourceObject'
    GuestResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/ResourceObject'
    GuestListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/ResourceObject'
    Error:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              status:
                type: string
              title:
                type: string
              detail:
                type: string