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

# List products

> Retrieve the full product catalog of your venue (the `/products` collection).

Returns every active product; soft-deleted products (`isDeleted`) are excluded. There is no pagination - the whole catalog is returned in one call. Every field is always present with an explicit `null` when unset. Amounts are verbatim: `price`/`cost` in cents, `vat` in basis points (200 = 2%). A product is a package when its `package_products` array is non-empty.



## OpenAPI

````yaml /api-reference/bookingshake-openapi.json get /products
openapi: 3.0.3
info:
  title: BookingShake API
  description: >-
    The BookingShake API allows you to programmatically create and manage
    events, bookings, and related resources. Integrate BookingShake with your
    applications to automate event creation, retrieve booking sources, spaces,
    statuses, and custom fields.


    **Rate Limiting:** All endpoints are rate limited per API key. POST
    /events/create allows 10 requests per minute, while GET endpoints allow 60
    requests per minute. Rate limit information is provided in response headers
    (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset).
  version: 1.0.0
  contact:
    name: BookingShake Support
    email: support@bookingshake.com
    url: https://bookingshake.com
servers:
  - url: https://api.bookingshake.io/api
    description: Production server
security:
  - bearerAuth: []
tags:
  - name: Events
    description: Create and manage events and bookings
  - name: Resources
    description: Retrieve booking sources, spaces, and statuses
  - name: Fields
    description: Retrieve available custom and default fields
  - name: Invoices
    description: Retrieve issued invoices
  - name: Payments
    description: Retrieve payments
  - name: Contacts
    description: Retrieve contacts (people)
  - name: Products
    description: Retrieve the venue product catalog
paths:
  /products:
    get:
      tags:
        - Products
      summary: List products
      description: >-
        Retrieve the full product catalog of your venue (the `/products`
        collection).


        Returns every active product; soft-deleted products (`isDeleted`) are
        excluded. There is no pagination - the whole catalog is returned in one
        call. Every field is always present with an explicit `null` when unset.
        Amounts are verbatim: `price`/`cost` in cents, `vat` in basis points
        (200 = 2%). A product is a package when its `package_products` array is
        non-empty.
      operationId: getProducts
      responses:
        '200':
          description: Product catalog retrieved successfully
          headers:
            X-RateLimit-Limit:
              schema:
                type: integer
              description: Maximum requests allowed per minute (60 for this endpoint)
            X-RateLimit-Remaining:
              schema:
                type: integer
              description: Requests remaining in the current window
            X-RateLimit-Reset:
              schema:
                type: integer
              description: Unix timestamp when the rate limit resets
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: success
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/ProductResource'
              example:
                message: success
                data:
                  - id: product-123
                    title: Forfait journée d'étude
                    subtitle: Pause + déjeuner inclus
                    subsubtitle: null
                    description_html: <p>Salle équipée, pauses et déjeuner.</p>
                    price: 4000
                    cost: 2500
                    vat: 2000
                    price_includes_tax: false
                    priced_per_person: true
                    is_accommodation: false
                    tag: Séminaire
                    accounting_tag: 707-SEM
                    package_products: null
                    children_products: null
                    locale:
                      - lang: en
                        value: Day delegate package
                        description: null
                    created_at: 1749722400000
        '400':
          description: Bad request - invalid token
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                message: invalid token
        '429':
          $ref: '#/components/responses/RateLimitExceeded'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                message: error
      security:
        - bearerAuth: []
components:
  schemas:
    ProductResource:
      type: object
      description: >-
        A product from your venue catalog. Every field is present with an
        explicit `null` when unset. Amounts are verbatim: `price`/`cost` in
        cents, `vat` in basis points (200 = 2%). A product is a package when its
        `package_products` array is non-empty.
      properties:
        id:
          type: string
          description: Unique product ID
        title:
          type: string
          nullable: true
          description: Product title
        subtitle:
          type: string
          nullable: true
          description: Product subtitle
        subsubtitle:
          type: string
          nullable: true
          description: Product third-level title
        description_html:
          type: string
          nullable: true
          description: Rich-text (HTML) description
        price:
          type: integer
          nullable: true
          description: Selling price, in cents
        cost:
          type: integer
          nullable: true
          description: Cost price, in cents
        vat:
          type: integer
          nullable: true
          description: VAT rate in basis points (200 = 2%)
        price_includes_tax:
          type: boolean
          nullable: true
          description: Whether `price` is tax-inclusive
        priced_per_person:
          type: boolean
          nullable: true
          description: >-
            Whether the product is priced/quantified per person (quantity =
            number of guests)
        is_accommodation:
          type: boolean
          nullable: true
          description: Whether the product is an accommodation (lodging) product
        tag:
          type: string
          nullable: true
          description: Catalog tag
        accounting_tag:
          type: string
          nullable: true
          description: Accounting tag
        package_products:
          type: array
          nullable: true
          description: >-
            For packages: the products composing this package (non-empty marks
            the product as a package).
          items:
            $ref: '#/components/schemas/ProductPackageEntry'
        children_products:
          type: array
          nullable: true
          description: IDs of child products
          items:
            type: string
        locale:
          type: array
          nullable: true
          description: Per-language translations of the title/description
          items:
            $ref: '#/components/schemas/ProductLocale'
        created_at:
          type: integer
          format: int64
          nullable: true
          description: Creation timestamp, Unix milliseconds
    ErrorResponse:
      type: object
      properties:
        message:
          type: string
          description: Error message describing what went wrong
          example: invalid token
    ProductPackageEntry:
      type: object
      description: >-
        A sub-product within a package. `price` and `price_includes_tax` are an
        optional per-product price override (price in cents); when absent, the
        sub-product follows its current catalog price.
      properties:
        id:
          type: string
          description: Sub-product ID
        quantity:
          type: number
          description: Quantity of the sub-product in the package
        price:
          type: integer
          description: Optional price override, in cents (absent when not overridden)
        price_includes_tax:
          type: boolean
          description: >-
            Optional tax-inclusiveness of the override price (absent when not
            overridden)
      required:
        - id
        - quantity
    ProductLocale:
      type: object
      description: A per-language translation of a product.
      properties:
        lang:
          type: string
          description: Language code (e.g. en, fr)
        value:
          type: string
          nullable: true
          description: Translated title
        description:
          type: string
          nullable: true
          description: Translated description
      required:
        - lang
    RateLimitResponse:
      type: object
      properties:
        message:
          type: string
          description: Error message
          example: Rate limit exceeded
        data:
          type: object
          properties:
            limit:
              type: integer
              description: Maximum requests allowed per window
              example: 10
            window:
              type: string
              description: Time window duration
              example: 60 seconds
            remaining:
              type: integer
              description: Requests remaining (always 0 on rate limit error)
              example: 0
            resetAt:
              type: string
              format: date-time
              description: ISO 8601 timestamp when the limit resets
              example: '2025-11-17T14:30:00.000Z'
            retryAfter:
              type: integer
              description: Seconds to wait before retrying
              example: 45
  responses:
    RateLimitExceeded:
      description: Rate limit exceeded - too many requests
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Maximum requests allowed per minute
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Requests remaining (always 0 on 429)
        X-RateLimit-Reset:
          schema:
            type: integer
          description: Unix timestamp when the rate limit resets
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait before retrying
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitResponse'
          example:
            message: Rate limit exceeded
            data:
              limit: 60
              window: 60 seconds
              remaining: 0
              resetAt: '2025-11-17T14:30:00.000Z'
              retryAfter: 45
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Bearer authentication using your BookingShake API key. Retrieve your API
        key from Settings > Integrations in your BookingShake dashboard.

````