> ## 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.

# Get a product

> Retrieve a single product by its ID, in the same shape as `GET /products`.

Every field is always present with an explicit `null` when unset. Amounts are verbatim: `price`/`cost` in cents, `vat` in basis points (200 = 2%).



## OpenAPI

````yaml /api-reference/bookingshake-openapi.json get /products/{id}
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/{id}:
    get:
      tags:
        - Products
      summary: Get a product
      description: >-
        Retrieve a single product by its ID, in the same shape as `GET
        /products`.


        Every field is always present with an explicit `null` when unset.
        Amounts are verbatim: `price`/`cost` in cents, `vat` in basis points
        (200 = 2%).
      operationId: getProduct
      parameters:
        - name: id
          in: path
          required: true
          description: Product document ID.
          schema:
            type: string
          example: product-123
      responses:
        '200':
          description: Product 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:
                    $ref: '#/components/schemas/ProductResource'
              example:
                message: success
                data:
                  id: product-123
                  title: Forfait séminaire 2 jours
                  subtitle: null
                  subsubtitle: null
                  description_html: <p>Hébergement, salles et restauration.</p>
                  price: 35000
                  cost: 22000
                  vat: 1000
                  price_includes_tax: true
                  priced_per_person: true
                  is_accommodation: false
                  tag: Package
                  accounting_tag: null
                  package_products:
                    - id: product-room
                      quantity: 1
                      price: 12000
                      price_includes_tax: true
                    - id: product-meal
                      quantity: 2
                  children_products:
                    - product-room
                    - product-meal
                  locale: null
                  created_at: 1749722400000
        '400':
          description: Bad request - invalid token or missing product id
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                message: invalid token
        '404':
          description: >-
            Product not found. Returned when the product does not exist, belongs
            to another venue, or has been deleted.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                message: not found
        '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.

````