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

# Reserve a ticket selection

> Sets the selected tickets aside for the session for the event's hold window (`event.hold_minutes`); they leave everyone else's `available`. Replaces the session's previous hold on this event. On a NUMBERED locality without `seat_ids` the best available contiguous seats are assigned.



## OpenAPI

````yaml /api-reference/openapi.json post /api/checkout/holds
openapi: 3.0.0
info:
  title: UnderPass Public API
  version: 1.3.0
  description: >-
    Public API for browsing events and selling tickets on the UnderPass
    platform. Build a custom event landing or checkout on your own domain: list
    events, reserve tickets at selection, sell numbered seats, run a waiting
    room, start a checkout and poll the order. Everything added since 1.0 is
    optional and opt-in per event; a storefront built against 1.0 keeps working.
  contact:
    name: UnderPass Engineering
    email: developers@underpass.com.co
    url: https://underpass.com.co
servers:
  - url: https://api.underpass.com.co
    description: Production
  - url: https://api-dev.underpass.com.co
    description: Development
security: []
paths:
  /api/checkout/holds:
    post:
      tags:
        - Checkout
      summary: Reserve a ticket selection
      description: >-
        Sets the selected tickets aside for the session for the event's hold
        window (`event.hold_minutes`); they leave everyone else's `available`.
        Replaces the session's previous hold on this event. On a NUMBERED
        locality without `seat_ids` the best available contiguous seats are
        assigned.
      operationId: createHold
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateHoldDto'
      responses:
        '201':
          description: Reserved
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HoldDto'
        '400':
          description: >-
            `INSUFFICIENT_TICKETS` (with `detail.available`,
            `detail.reserved_by_others`), `PERFORMANCE_REQUIRED`,
            `SEAT_COUNT_MISMATCH`, `SEAT_NOT_IN_TICKET_TYPE`,
            `SEAT_NOT_SELLABLE`
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDto'
        '403':
          description: '`QUEUE_PASS_REQUIRED` / `QUEUE_PASS_INVALID` (waiting room)'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDto'
        '409':
          description: '`SEAT_TAKEN` (`detail.seat_ids`)'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorDto'
components:
  schemas:
    CreateHoldDto:
      type: object
      required:
        - event_id
        - session_key
        - items
      properties:
        event_id:
          type: string
        session_key:
          type: string
          description: >-
            Opaque per-browser id, 8 to 128 characters. Owns the hold; one
            ACTIVE hold per session per event (a new POST replaces it).
          minLength: 8
          maxLength: 128
        items:
          type: array
          items:
            $ref: '#/components/schemas/HoldItemInputDto'
          description: 1 to 20 items.
          minItems: 1
          maxItems: 20
        queue_pass:
          type: string
          description: Waiting-room pass, required when the event has `waiting_room`.
    HoldDto:
      type: object
      properties:
        id:
          type: string
          description: Send as `hold_id` on `checkout/start`.
        event_id:
          type: string
        status:
          type: string
          enum:
            - ACTIVE
            - CONVERTED
            - CONSUMED
            - RELEASED
            - EXPIRED
        expires_at:
          type: string
          format: date-time
          description: Show a countdown; at zero the tickets are back on sale.
        order_id:
          type: string
          nullable: true
        items:
          type: array
          items:
            type: object
            properties:
              ticket_type_id:
                type: string
              selling_stage_id:
                type: string
              performance_id:
                type: string
                nullable: true
              quantity:
                type: integer
              ticket_count:
                type: integer
                description: quantity × group_size
              seat_ids:
                type: array
                items:
                  type: string
              seat_labels:
                type: array
                items:
                  type: string
    ErrorDto:
      type: object
      properties:
        statusCode:
          type: integer
        code:
          type: string
          description: Stable identifier to match on.
        message:
          type: string
        detail:
          type: object
          additionalProperties: true
        timestamp:
          type: string
          format: date-time
    HoldItemInputDto:
      type: object
      required:
        - ticket_type_id
        - selling_stage_id
        - quantity
      properties:
        ticket_type_id:
          type: string
        selling_stage_id:
          type: string
        quantity:
          type: integer
          description: Units; tickets locked = quantity × group_size.
          minimum: 1
        performance_id:
          type: string
          description: Required on multi-date events.
        seat_ids:
          type: array
          items:
            type: string
          description: >-
            Numbered seating: seats to claim, quantity × group_size. Omitted =
            best available.
          maxItems: 200

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.