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

# Scan Ticket

> Scan a ticket using a scanner registered to your organization. If `scanner_id` is omitted, the first active scanner in your organization is used. The scanner's profile rules, timeslot restrictions, and scan windows are enforced automatically. Requires the `tickets.write` scope.



## OpenAPI

````yaml post /tickets/{ticket_id}/scan
openapi: 3.0.0
info:
  version: 1.0.0
  title: Tickable API
  description: >-
    The Tickable API provides programmatic access to events, orders, tickets,
    and webhooks for your organization.
  contact:
    name: Tickable
    url: https://tickable.nl
servers:
  - url: https://api.tickable.io
    description: Production
security:
  - Bearer: []
tags:
  - name: Events
    description: Manage events
  - name: Tickets
    description: View tickets
  - name: Orders
    description: View orders
  - name: Webhooks
    description: Manage webhook subscriptions
  - name: User
    description: Current user information
  - name: OAuth
    description: OAuth2 authorization and token endpoints
paths:
  /tickets/{ticket_id}/scan:
    post:
      tags:
        - Tickets
      summary: Scan ticket
      description: >-
        Scan a ticket using a scanner registered to your organization. If
        `scanner_id` is omitted, the first active scanner in your organization
        is used. The scanner's profile rules, timeslot restrictions, and scan
        windows are enforced automatically. Requires the `tickets.write` scope.
      operationId: scanTicket
      parameters:
        - schema:
            type: string
            format: uuid
            description: Ticket ID
            example: c3d4e5f6-7890-4a1b-2c3d-4e5f6a7b8c9d
          required: true
          description: Ticket ID
          name: ticket_id
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                scanner_id:
                  type: string
                  nullable: true
                  format: uuid
                  description: >-
                    Scanner ID. If omitted, the first active scanner in your
                    organization is used.
                  example: e5f6a7b8-9012-4c3d-4e5f-6a7b8c9d0e1f
      responses:
        '200':
          description: Scan result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScanResult'
        '403':
          description: Scanner does not belong to your organization
        '404':
          description: Ticket not found
      security:
        - Bearer: []
components:
  schemas:
    ScanResult:
      type: object
      properties:
        ticket_id:
          type: string
          format: uuid
          example: c3d4e5f6-7890-4a1b-2c3d-4e5f6a7b8c9d
        status:
          type: string
          enum:
            - valid
            - scanned
            - cancelled
            - not_allowed
          example: valid
        scanned_before:
          type: boolean
          example: false
        event:
          $ref: '#/components/schemas/ScanResultEvent'
        timeslot:
          $ref: '#/components/schemas/ScanResultTimeslot'
        ticket_type:
          $ref: '#/components/schemas/ScanResultTicketType'
        owner_name:
          type: string
          example: Jane Doe
        owner_email:
          type: string
          example: jane@example.com
        seat:
          type: string
          nullable: true
          example: A12
        scanned_at:
          type: string
          nullable: true
          example: '2026-06-15T14:30:00Z'
        cancelled_at:
          type: string
          nullable: true
          example: null
        related_tickets:
          type: array
          nullable: true
          items:
            $ref: '#/components/schemas/RelatedTicket'
          description: >-
            Other tickets in the same order, if the event has order scanning
            enabled
      required:
        - ticket_id
        - status
        - scanned_before
        - event
        - timeslot
        - ticket_type
        - owner_name
        - owner_email
        - seat
        - scanned_at
        - cancelled_at
        - related_tickets
    ScanResultEvent:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: 550e8400-e29b-41d4-a716-446655440000
        title:
          type: string
          example: Summer Festival 2026
        location:
          type: string
          nullable: true
          example: Vondelpark
      required:
        - id
        - title
        - location
    ScanResultTimeslot:
      type: object
      properties:
        title:
          type: string
          nullable: true
          example: Morning Session
        starts_at:
          type: string
          nullable: true
          example: '2026-06-15T10:00:00Z'
        ends_at:
          type: string
          nullable: true
          example: '2026-06-15T12:00:00Z'
      required:
        - title
        - starts_at
        - ends_at
    ScanResultTicketType:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: b2c4e6a8-1234-4f5a-9c8d-0e1f2a3b4c5d
        name:
          type: string
          example: Early Bird
        price:
          type: number
          example: 2500
      required:
        - id
        - name
        - price
    RelatedTicket:
      type: object
      properties:
        id:
          type: string
          format: uuid
          example: a1b2c3d4-5678-4e9f-0a1b-2c3d4e5f6a7b
        seat:
          type: string
          nullable: true
          example: A13
        owner_name:
          type: string
          example: John Doe
        owner_email:
          type: string
          example: john@example.com
        scanned_at:
          type: string
          nullable: true
          example: null
        cancelled_at:
          type: string
          nullable: true
          example: null
        ticket_type_name:
          type: string
          example: Early Bird
      required:
        - id
        - seat
        - owner_name
        - owner_email
        - scanned_at
        - cancelled_at
        - ticket_type_name
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      description: >-
        Pass as `Authorization: Bearer {token}`. Accepts either an OAuth2 JWT
        access token or an API key (`tk_live_...`) created from the Tickable
        dashboard.

````