TableCheck CRM API

Obtain full customer, reservation, membership, and related guest data for restaurant operators. Manage customers (list, create, amend, delete, bulk search/export), memberships and membership programs, reservations and reservation flags, plus shops and franchises.

OpenAPI Specification

tablecheck-crm.yml Raw ↑
# Test and edit this file at https://editor.swagger.io/

openapi: 3.0.0

info:
  version: 1.0.2
  title: TableCheck API - CRM V1
  description: The CRM API is used by restaurant operators to obtain full customer, reservation, membership, and other related data from the TableSolution system.
  termsOfService: https://tablecheck.atlassian.net/wiki/spaces/API/pages/61571353/TableCheck+API+Terms+of+Service

externalDocs:
  description: Implementation Guide
  url: https://tablecheck.atlassian.net/wiki/spaces/API/pages/44664326/CRM+v1

servers:



  - url: https://api.tablecheck.com/api/crm/v1/
    description: Production (uses live data)

paths:
  /reservations:
    get:
      summary: List all Reservations
      operationId: listReservations
      tags:
        - reservations
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        
        - name: created_at_min
          in: query
          description: Search lower bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: created_at_max
          in: query
          description: Search upper bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: updated_at_min
          in: query
          description: Search lower bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: updated_at_max
          in: query
          description: Search upper bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: start_at_min
          in: query
          description: Search lower bound of start_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: start_at_max
          in: query
          description: Search upper bound of start_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - name: sort
          in: query
          description: The field by which to sort the results.
          required: false
          schema:
            type: string
            default: start_at
            enum:
              - start_at
              - created_at
              - updated_at
        - name: sort_order
          in: query
          description: The direction to sort the results (asc or desc.)
          required: false
          schema:
            default: asc
            enum:
              - asc
              - desc
            type: string
        - name: customer_ids
          in: query
          description: Array or comma-separated list of customer IDs to filter reservations.
          required: false
          schema:
            type: string
            format: bson-id
            example: f2ab06ff5d03d98e316513e1
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'
      responses:
        '200':
          description: A paged array of reservations
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationsListResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    post:
      summary: Create Reservation
      operationId: createReservation
      tags:
        - reservations
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/ReservationCreateParams"
      responses:
        '200':
          description: The Reservation which was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationShowResponse"
        '400': &BadRequest
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '403': &ForbiddenError
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ForbiddenError"
        '422': &UnprocessableEntityError
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                '$ref': "#/components/schemas/UnprocessableEntityError"

  /reservations/{reservation_id}:
    get:
      summary: Fetch a specific Reservation
      operationId: showReservationById
      tags:
        - reservations
      parameters:
        - name: reservation_id
          in: path
          required: true
          description: The ID or slug of the Reservation to retrieve
          schema:
            type: string
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    put:
      summary: Update Reservation
      operationId: updateReservation
      tags:
        - reservations
      parameters:
        - name: reservation_id
          in: path
          required: true
          description: The ID or ref of the Reservation to update
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/ReservationUpdateParams"
      responses:
        '200':
          description: The Reservation which was updated
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationShowResponse"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ForbiddenError"
        '404':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                '$ref': "#/components/schemas/UnprocessableEntityError"

  /reservation_flags:
    get:
      summary: List all Reservation Flags
      operationId: listReservationFlags
      tags:
        - reservation_flags
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific reservation flag IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
            example: ae5355ca1fd337ed5d6893e2
        - name: shop_ids
          in: query
          description: Array or comma-separated list of shop IDs to filter reservation flags.
          required: false
          schema:
            type: string
            format: bson-id
            example: ae5355ca1fd337ed5d6893e2
        
        - name: created_at_min
          in: query
          description: Search lower bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
            example: '2020-01-29T19:00:00Z'
        - name: created_at_max
          in: query
          description: Search upper bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
            example: '2020-01-29T19:00:00Z'
        
        - name: updated_at_min
          in: query
          description: Search lower bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
            example: '2020-01-29T19:00:00Z'
        - name: updated_at_max
          in: query
          description: Search upper bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
            example: '2020-01-29T19:00:00Z'
        
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000

      responses:
        '200':
          description: A paged array of reservation flags
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationFlagsListResponse"
        '400': *BadRequest
        '403': *ForbiddenError
        '422': *UnprocessableEntityError

  /reservation_flags/{reservation_flag_id}:
    get:
      summary: Fetch a specific Reservation Flag
      operationId: showReservationFlagById
      tags:
        - reservation_flags
      parameters:
        - name: reservation_flag_id
          in: path
          required: true
          description: The ID of the Reservation Flag to retrieve
          schema:
            type: string
      responses:
        '200':
          description: The specified Reservation Flag
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ReservationFlagShowResponse"
        '400': *BadRequest
        '403': *ForbiddenError
        '404': &NotFoundError
          description: Not Found
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/NotFoundError"
        '422': *UnprocessableEntityError

  /memberships:
    get:
      summary: List all Memberships
      operationId: listMemberships
      tags:
        - memberships
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: customer_ids
          in: query
          description: Array or comma-separated list of specific customer IDs.
          required: false
          schema:
            type: string
            format: bson-id
        - name: code
          in: query
          description: Search using specific code.
          required: false
          schema:
            type: string
        - name: membership_program_id
          in: query
          description: Search using specific membership program ids
          required: false
          schema:
            type: string
            format: bson-id
        
        - name: created_at_min
          in: query
          description: Search lower bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: created_at_max
          in: query
          description: Search upper bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: updated_at_min
          in: query
          description: Search lower bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: updated_at_max
          in: query
          description: Search upper bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'
      responses:
        '200':
          description: The Memberships list.
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipShowResponse"
    post:
      summary: Create Membership
      operationId: createMembership
      tags:
        - memberships
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/MembershipCreateParams"
      responses:
        '200':
          description: The Membership which was created
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipShowResponse"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ForbiddenError"
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                '$ref': "#/components/schemas/UnprocessableEntityError"

      responses:
        '200':
          description: A paged array of memberships
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipsListResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /memberships/{membership_id}:
    get:
      summary: Fetch a specific Membership
      operationId: showMembershipById
      tags:
        - memberships
      parameters:
        - name: membership_id
          in: path
          required: true
          description: The ID of the Membership to retrieve
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    put:
      summary: Update Membership
      operationId: updateMembership
      tags:
        - memberships
      parameters:
        - name: membership_id
          in: path
          required: true
          description: The ID of the Membership to update
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/MembershipUpdateParams"
      responses:
        '200':
          description: The Reservation which was updated
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipShowResponse"
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ForbiddenError"
        '404':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BadRequestError"
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                '$ref': "#/components/schemas/UnprocessableEntityError"

    delete:
      summary: Destroy the membership
      operationId: deleteMembershipById
      tags:
        - memberships
      parameters:
        - name: membership_id
          in: path
          required: true
          description: The ID of the Membership to delete
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    default: "ok"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /membership_programs:
    get:
      summary: List all Membership Programs
      operationId: listMembershipPrograms
      tags:
        - membership_programs
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: membership_ids
          in: query
          description: Array or comma-separated list of specific membership IDs.
          required: false
          schema:
            type: string
            format: bson-id
        
        - name: created_at_min
          in: query
          description: Search lower bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: created_at_max
          in: query
          description: Search upper bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: updated_at_min
          in: query
          description: Search lower bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: updated_at_max
          in: query
          description: Search upper bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'

      responses:
        '200':
          description: A paged array of reservations
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipProgramsListResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /membership_programs/{membership_program_id}:
    get:
      summary: Fetch a specific Membership Program
      operationId: showMembershipProgramById
      tags:
        - membership_programs
      parameters:
        - name: membership_program_id
          in: path
          required: true
          description: The ID of the Membership Program to retrieve
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MembershipProgramShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /customers:
    get:
      summary: List all Customers
      operationId: listCustomers
      tags:
        - customers
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific customer IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: shop_ids
          in: query
          description: Array or comma-separated list of specific shop IDs.
          required: false
          schema:
            type: string
            format: bson-id
        
        - name: created_at_min
          in: query
          description: Search lower bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: created_at_max
          in: query
          description: Search upper bound of created_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: updated_at_min
          in: query
          description: Search lower bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        - name: updated_at_max
          in: query
          description: Search upper bound of updated_at field (ISO timestamp).
          required: false
          schema:
            type: string
            format: date-time
        
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'

      responses:
        '200':
          description: A paged array of customers
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomersListResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

    post:
      summary: Create a new customer
      operationId: createCustomer
      tags:
        - customers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/CustomerCreateParams"
      responses:
        '200':
          description: Information about the customer
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomerShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /customers/{customer_id}:
    get:
      summary: Fetch a specific Customer
      operationId: showCustomerById
      tags:
        - customers
      parameters:
        - name: customer_id
          in: path
          required: true
          description: The ID of the Customer to retrieve
          schema:
            type: string
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomerShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    put:
      summary: Amend the Customer
      operationId: amendCustomer
      tags:
        - customers
      parameters:
        - name: customer_id
          in: path
          required: true
          description: The ID of the Customer to retrieve
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/CustomerUpdateParams"
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomerShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    delete:
      summary: Destroy the customer
      operationId: deleteCustomerById
      tags:
        - customers
      parameters:
        - name: customer_id
          in: path
          required: true
          description: The ID of the Customer to delete
          schema:
            type: string

      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    default: "ok"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /customer_search:
    post:
      summary: Search and bulk export customers
      operationId: customerSearch
      tags:
        - customers
      requestBody:
        required: true
        content:
          application/json:
            schema:
              '$ref': "#/components/schemas/CustomerSearchParams"
      responses:
        '200':
          description: List of exported customers
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CustomerSearchResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /shops:
    get:
      summary: List all Shops
      operationId: listShops
      tags:
        - shops
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: slugs
          in: query
          description: Array or comma-separated list of specific slugs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: franchise_ids
          in: query
          description: Array or comma-separated list of specific Franchise IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'

      responses:
        '200':
          description: A paged array of shops
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ShopsListResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /shops/{shop_id}:
    get:
      summary: Fetch a specific Shop
      operationId: showShopById
      tags:
        - shops
      parameters:
        - name: shop_id
          in: path
          required: true
          description: The ID or slug of the Shop to retrieve
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ShopShowResponse"
        default:
          description: Error response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /franchises:
    get:
      summary: List all Franchises
      operationId: listFranchises
      tags:
        - franchises
      parameters:
        - name: ids
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: names
          in: query
          description: Array or comma-separated list of specific IDs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: slugs
          in: query
          description: Array or comma-separated list of specific slugs to return.
          required: false
          schema:
            type: string
            format: bson-id
        - name: page
          in: query
          description: The zero-based page number. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            minimum: 0
        - name: per_page
          in: query
          description: Number of items to return at once. Used for pagination.
          required: false
          schema:
            type: number
            format: integer
            default: 100
            minimum: 1
            maximum: 1000
        - $ref: '#/components/parameters/IncludeFields'
        - $ref: '#/components/parameters/ExcludeFields'

      responses:
        '200':
          description: A paged array of franchises
          content:
            a

# --- truncated at 32 KB (122 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/tablecheck/refs/heads/main/openapi/tablecheck-crm.yml