SpotOn Reserve API

An API for SpotOn Reserve (powered by SeatNinja), the company's reservations and waitlist product, allowing partners to list accessible restaurants, check available reservation times and wait times, create reservations, and add guests to a waitlist. Authentication uses an API key passed in the x-api-key request header, scoped per restaurant.

Documentation

Specifications

SDKs

Examples

Schemas & Data

📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-availability-response-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-availability-slot-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-customer-information-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-reservation-request-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-reservation-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-restaurant-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-wait-time-response-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-waitlist-entry-schema.json
📊
JSONSchema
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-schema/reserve-waitlist-request-schema.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-availability-response-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-availability-slot-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-customer-information-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-reservation-request-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-reservation-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-restaurant-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-wait-time-response-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-waitlist-entry-structure.json
📊
JSONStructure
https://raw.githubusercontent.com/api-evangelist/spoton/refs/heads/main/json-structure/reserve-waitlist-request-structure.json

Other Resources

OpenAPI Specification

spoton-reserve-openapi-original.yml Raw ↑
openapi: 3.0.3
info:
  title: SpotOn Reserve API
  description: >-
    The SpotOn Reserve API (powered by SeatNinja) lets partners integrate
    reservation, waitlist, and guest-management workflows into the SpotOn Reserve
    product. It supports listing accessible restaurants, checking available
    reservation times, creating and managing reservations, retrieving wait times,
    and adding guests to a waitlist. Authentication uses an API key supplied via
    the x-api-key request header, scoped to specific restaurants. The sandbox
    environment enforces daily and hourly request quotas; production has no
    documented rate limit.
  version: v2
  contact:
    name: SpotOn Reserve Developer Center
    url: https://developers.spoton.com/reserve/docs/getting-started
  x-generated-from: documentation
  x-last-validated: '2026-06-03'
servers:
- url: https://api.seatninja.com
  description: Production
- url: https://sandbox.seatninja.com
  description: Sandbox
security:
- apiKeyAuth: []
tags:
- name: Restaurants
  description: Restaurants accessible with the API key.
- name: Availability
  description: Available reservation times and wait-time lookups.
- name: Reservations
  description: Create and manage guest reservations.
- name: Waitlist
  description: Add guests to a restaurant waitlist.
paths:
  /restaurants:
    get:
      operationId: listRestaurants
      summary: SpotOn List Restaurants
      description: List the restaurants accessible with the supplied API key.
      tags:
      - Restaurants
      responses:
        '200':
          description: A list of accessible restaurants.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Restaurant'
              examples:
                ListRestaurants200Example:
                  summary: Default listRestaurants 200 response
                  x-microcks-default: true
                  value:
                  - restaurantId: 152
                    name: Smoke's Burgers
                    timeZone: America/Detroit
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/ServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /v2/reservations/{restaurantId}/availability:
    get:
      operationId: getAvailableReservationTimes
      summary: SpotOn Get Available Reservation Times
      description: Retrieve the open reservation time slots for a restaurant filtered by date and party size.
      tags:
      - Availability
      parameters:
      - $ref: '#/components/parameters/RestaurantId'
      - name: date
        in: query
        required: true
        description: The date to check availability for, in YYYY-MM-DD format.
        schema:
          type: string
          format: date
      - name: partySize
        in: query
        required: true
        description: The number of guests in the party.
        schema:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
      responses:
        '200':
          description: Available reservation time slots.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AvailabilityResponse'
              examples:
                GetAvailableReservationTimes200Example:
                  summary: Default getAvailableReservationTimes 200 response
                  x-microcks-default: true
                  value:
                    restaurantId: 152
                    date: '2025-03-15'
                    partySize: 4
                    slots:
                    - time: example
                      available: example
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /v2/reservations/{restaurantId}/wait-time:
    get:
      operationId: getWaitTime
      summary: SpotOn Get Wait Time
      description: Retrieve the current wait time for a restaurant.
      tags:
      - Availability
      parameters:
      - $ref: '#/components/parameters/RestaurantId'
      - name: partySize
        in: query
        required: false
        description: Optional party size to retrieve a size-specific wait time.
        schema:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
      responses:
        '200':
          description: The current wait time.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WaitTimeResponse'
              examples:
                GetWaitTime200Example:
                  summary: Default getWaitTime 200 response
                  x-microcks-default: true
                  value:
                    restaurantId: 152
                    partySize: 4
                    quotedWaitMinutes: 15
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /v2/reservations/{restaurantId}/reservation:
    post:
      operationId: createReservation
      summary: SpotOn Create Reservation
      description: Create a reservation for a guest at the specified restaurant.
      tags:
      - Reservations
      parameters:
      - $ref: '#/components/parameters/RestaurantId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReservationRequest'
            examples:
              CreateReservationRequestExample:
                summary: Default createReservation request
                x-microcks-default: true
                value:
                  customerInformation:
                    customerId: abc123
                    firstName: Mark
                    lastName: Nalepka
                    phoneNumber: '1112223333'
                    email: [email protected]
                    imageUrl: https://example.com/path/abc123
                    memberNumber: '3'
                    memberTier: Gold
                  notes: Operator note
                  time: '2025-03-15T14:30:00Z'
                  partySize: 4
                  partyFlags: 0
      responses:
        '200':
          description: The created reservation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Reservation'
              examples:
                CreateReservation200Example:
                  summary: Default createReservation 200 response
                  x-microcks-default: true
                  value:
                    reservationId: abc123
                    restaurantId: 152
                    customerInformation:
                      customerId: abc123
                      firstName: Mark
                      lastName: Nalepka
                      phoneNumber: '1112223333'
                      email: [email protected]
                      imageUrl: https://example.com/path/abc123
                      memberNumber: '3'
                      memberTier: Gold
                    time: '2025-03-15T14:30:00Z'
                    partySize: 4
                    status: booked
                    notes: Operator note
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
  /v2/reservations/{restaurantId}/waitlist:
    post:
      operationId: addToWaitlist
      summary: SpotOn Add to Waitlist
      description: Add a guest to the waitlist at the specified restaurant.
      tags:
      - Waitlist
      parameters:
      - $ref: '#/components/parameters/RestaurantId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WaitlistRequest'
            examples:
              AddToWaitlistRequestExample:
                summary: Default addToWaitlist request
                x-microcks-default: true
                value:
                  customerInformation:
                    customerId: abc123
                    firstName: Mark
                    lastName: Nalepka
                    phoneNumber: '1112223333'
                    email: [email protected]
                    imageUrl: https://example.com/path/abc123
                    memberNumber: '3'
                    memberTier: Gold
                  notes: Operator note
                  partySize: 4
                  partyFlags: 0
      responses:
        '200':
          description: The created waitlist entry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WaitlistEntry'
              examples:
                AddToWaitlist200Example:
                  summary: Default addToWaitlist 200 response
                  x-microcks-default: true
                  value:
                    waitlistId: abc123
                    restaurantId: 152
                    customerInformation:
                      customerId: abc123
                      firstName: Mark
                      lastName: Nalepka
                      phoneNumber: '1112223333'
                      email: [email protected]
                      imageUrl: https://example.com/path/abc123
                      memberNumber: '3'
                      memberTier: Gold
                    partySize: 4
                    quotedWaitMinutes: 15
                    status: example
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
      x-microcks-operation:
        delay: 0
        dispatcher: FALLBACK
components:
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: API key scoped to specific restaurants.
  parameters:
    RestaurantId:
      name: restaurantId
      in: path
      required: true
      description: The unique identifier for the restaurant.
      schema:
        type: integer
        format: int32
  responses:
    BadRequest:
      description: The request was malformed or violated a documented constraint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: The API key is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Forbidden:
      description: The API key does not have access to the requested restaurant.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The requested resource does not exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    ServerError:
      description: An unexpected server error occurred.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      description: A standard error response.
      properties:
        message:
          type: string
          description: A human-readable description of the error.
          example: example
        code:
          type: string
          description: A machine-readable error code.
          example: A1B2
    Restaurant:
      type: object
      description: A restaurant accessible with the API key.
      properties:
        restaurantId:
          type: integer
          format: int32
          description: The unique identifier for the restaurant.
          example: 152
        name:
          type: string
          description: The restaurant name.
          example: Smoke's Burgers
        timeZone:
          type: string
          description: The IANA time zone of the restaurant.
          example: America/Detroit
    CustomerInformation:
      type: object
      description: Guest contact and identity details for a reservation or waitlist entry.
      properties:
        customerId:
          type: string
          description: Optional existing customer identifier.
          example: abc123
        firstName:
          type: string
          description: Guest first name.
          example: Mark
        lastName:
          type: string
          description: Guest last name.
          example: Nalepka
        phoneNumber:
          type: string
          description: Guest phone number.
          example: '1112223333'
        email:
          type: string
          format: email
          description: Guest email address.
          example: [email protected]
        imageUrl:
          type: string
          format: uri
          description: Optional URL of a guest image.
          example: https://example.com/path/abc123
        memberNumber:
          type: string
          description: Optional loyalty member number.
          example: '3'
        memberTier:
          type: string
          description: Optional loyalty member tier.
          example: Gold
      required:
      - firstName
      - phoneNumber
    ReservationRequest:
      type: object
      description: A request to create a reservation.
      properties:
        customerInformation:
          $ref: '#/components/schemas/CustomerInformation'
        notes:
          type: string
          description: Optional notes for the reservation, such as a seating request.
          example: Operator note
        time:
          type: string
          format: date-time
          description: The requested reservation date and time, in RFC 3339 format.
          example: '2025-03-15T14:30:00Z'
        partySize:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
          description: The number of guests in the party.
          example: 4
        partyFlags:
          type: integer
          format: int64
          description: Optional bit flags describing party attributes.
          example: 0
      required:
      - customerInformation
      - time
      - partySize
    Reservation:
      type: object
      description: A created reservation.
      properties:
        reservationId:
          type: string
          description: The unique identifier for the reservation.
          example: abc123
        restaurantId:
          type: integer
          format: int32
          description: The restaurant the reservation belongs to.
          example: 152
        customerInformation:
          $ref: '#/components/schemas/CustomerInformation'
        time:
          type: string
          format: date-time
          description: The reserved date and time, in RFC 3339 format.
          example: '2025-03-15T14:30:00Z'
        partySize:
          type: integer
          format: int32
          description: The number of guests in the party.
          example: 4
        status:
          type: string
          description: The current status of the reservation.
          enum:
          - booked
          - confirmed
          - checked_in
          - cancelled
          example: booked
        notes:
          type: string
          description: Notes attached to the reservation.
          example: Operator note
    WaitlistRequest:
      type: object
      description: A request to add a guest to the waitlist.
      properties:
        customerInformation:
          $ref: '#/components/schemas/CustomerInformation'
        notes:
          type: string
          description: Optional notes for the waitlist entry.
          example: Operator note
        partySize:
          type: integer
          format: int32
          minimum: 1
          maximum: 99
          description: The number of guests in the party.
          example: 4
        partyFlags:
          type: integer
          format: int64
          description: Optional bit flags describing party attributes.
          example: 0
      required:
      - customerInformation
      - partySize
    WaitlistEntry:
      type: object
      description: A created waitlist entry.
      properties:
        waitlistId:
          type: string
          description: The unique identifier for the waitlist entry.
          example: abc123
        restaurantId:
          type: integer
          format: int32
          description: The restaurant the waitlist entry belongs to.
          example: 152
        customerInformation:
          $ref: '#/components/schemas/CustomerInformation'
        partySize:
          type: integer
          format: int32
          description: The number of guests in the party.
          example: 4
        quotedWaitMinutes:
          type: integer
          format: int32
          description: The quoted wait time in minutes.
          example: 15
        status:
          type: string
          description: The current status of the waitlist entry.
          example: example
    AvailabilitySlot:
      type: object
      description: An available reservation time slot.
      properties:
        time:
          type: string
          format: date-time
          description: The available reservation date and time, in RFC 3339 format.
          example: '2025-03-15T14:30:00Z'
        available:
          type: boolean
          description: Whether the slot is available for booking.
          example: false
    AvailabilityResponse:
      type: object
      description: The set of available reservation time slots for a date and party size.
      properties:
        restaurantId:
          type: integer
          format: int32
          description: The restaurant the availability applies to.
          example: 152
        date:
          type: string
          format: date
          description: The date the availability applies to.
          example: '2025-03-15'
        partySize:
          type: integer
          format: int32
          description: The party size the availability applies to.
          example: 4
        slots:
          type: array
          description: The available time slots.
          items:
            $ref: '#/components/schemas/AvailabilitySlot'
    WaitTimeResponse:
      type: object
      description: The current wait time for a restaurant.
      properties:
        restaurantId:
          type: integer
          format: int32
          description: The restaurant the wait time applies to.
          example: 152
        partySize:
          type: integer
          format: int32
          description: The party size the wait time applies to, if requested.
          example: 4
        quotedWaitMinutes:
          type: integer
          format: int32
          description: The current quoted wait time in minutes.
          example: 15