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: jsmith@example.com 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: jsmith@example.com 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: jsmith@example.com 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: jsmith@example.com 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: jsmith@example.com 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