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

# Fixture details

> Fixture details: request contract, authentication, parameters and response behavior for the Oddswire private pilot.

Deployed REST contract; requires the current approved feature, namespace, source scope and allocation. Signup grants no data. Completed successful canonical data pages cost one credit, including empty pages. Native views retain the native reader rules: empty native pages are free and eligible nonempty pages cost one credit. Errors and 304 are free; inspect Usage for final settlement. See [Current availability](https://docs.oddswire.io/availability.md).

`GET /v1/fixtures/{fixture_id}`

[Authentication](https://docs.oddswire.io/authentication.md) · [Requests, quota and errors](https://docs.oddswire.io/errors.md) · [Coverage and units](https://docs.oddswire.io/data.md).


## OpenAPI

````yaml GET /v1/fixtures/{fixture_id}
openapi: 3.1.2
info:
  description: >-
    Implemented REST v1 contract. Hosted account login and HTTPS API are
    deployed; signup grants no source data or credits. Core data requires
    explicit approved scope. History, streaming, alerts, Terminal and test
    billing have separate availability limits. Read
    https://docs.oddswire.io/availability. Namespaces, decimal strings, native
    identity and missing coverage retain their contract meaning.
  title: Oddswire REST v1 private pilot
  version: 1.0.0
servers:
  - url: https://api.oddswire.io
    description: Hosted HTTPS API; account grants and allocation are required for data.
security: []
externalDocs:
  description: Current feature availability
  url: https://docs.oddswire.io/availability
paths:
  /v1/fixtures/{fixture_id}:
    get:
      summary: getFixture
      description: >-
        Deployed REST contract; requires the current approved feature,
        namespace, source scope and allocation. Signup grants no data. Completed
        successful canonical data pages cost one credit, including empty pages.
        Native views retain the native reader rules: empty native pages are free
        and eligible nonempty pages cost one credit. Errors and 304 are free;
        inspect Usage for final settlement.
      operationId: getFixture
      parameters:
        - description: The standard response view; new resources always use it.
          in: query
          name: view
          required: false
          schema:
            enum:
              - standard
            type: string
        - description: >-
            Explicit dataset namespace or compatible alias: kambi, pilot,
            sportsbooks.
          in: query
          name: namespace
          required: true
          schema:
            type: string
        - description: 'sportsbooks only: exact reviewed source5/11/12/13/14/15.'
          in: query
          name: source_id
          required: false
          schema:
            type: integer
        - description: 'Kambi native only: retained (default) or separately approved live.'
          in: query
          name: mode
          required: false
          schema:
            enum:
              - retained
              - live
            type: string
        - description: >-
            Exact Kambi capture from fixture discovery; required for player
            subjects.
          in: query
          name: capture_id
          required: false
          schema:
            type: string
        - description: 'Native source11/12/13 only: delay0..3600.'
          in: query
          name: delay_seconds
          required: false
          schema:
            type: integer
        - description: >-
            Exact dataset-local fixture ID; native IDs remain strings and
            require source_id.
          in: path
          name: fixture_id
          required: true
          schema:
            type: string
        - description: Weak semantic ETag; freshness and access are revalidated before 304.
          in: header
          name: If-None-Match
          required: false
          schema:
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DatasetFixturesPage'
          description: >-
            A typed page. Each successful data page costs one included credit,
            including explicit missing/insufficient states; account
            introspection is free. missing[] covers the full query.
          headers:
            X-Oddswire-Credit-Cost:
              $ref: '#/components/headers/X-Oddswire-Credit-Cost'
            X-Oddswire-Credits-Limit:
              $ref: '#/components/headers/X-Oddswire-Credits-Limit'
            X-Oddswire-Credits-Remaining:
              $ref: '#/components/headers/X-Oddswire-Credits-Remaining'
            X-Oddswire-Credits-Reserved:
              $ref: '#/components/headers/X-Oddswire-Credits-Reserved'
            X-Oddswire-Credits-Reset:
              $ref: '#/components/headers/X-Oddswire-Credits-Reset'
            X-Oddswire-Credits-Used:
              $ref: '#/components/headers/X-Oddswire-Credits-Used'
            X-Oddswire-Metering:
              $ref: '#/components/headers/X-Oddswire-Metering'
            X-Oddswire-Overage:
              $ref: '#/components/headers/X-Oddswire-Overage'
            X-Oddswire-Usage-State:
              $ref: '#/components/headers/X-Oddswire-Usage-State'
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '304':
          description: >-
            Semantically unchanged after authentication and eligibility
            validation; always zero credits, including at exhausted quota.
          headers:
            X-Oddswire-Credit-Cost:
              $ref: '#/components/headers/X-Oddswire-Credit-Cost'
            X-Oddswire-Credits-Limit:
              $ref: '#/components/headers/X-Oddswire-Credits-Limit'
            X-Oddswire-Credits-Remaining:
              $ref: '#/components/headers/X-Oddswire-Credits-Remaining'
            X-Oddswire-Credits-Reserved:
              $ref: '#/components/headers/X-Oddswire-Credits-Reserved'
            X-Oddswire-Credits-Reset:
              $ref: '#/components/headers/X-Oddswire-Credits-Reset'
            X-Oddswire-Credits-Used:
              $ref: '#/components/headers/X-Oddswire-Credits-Used'
            X-Oddswire-Metering:
              $ref: '#/components/headers/X-Oddswire-Metering'
            X-Oddswire-Overage:
              $ref: '#/components/headers/X-Oddswire-Overage'
            X-Oddswire-Usage-State:
              $ref: '#/components/headers/X-Oddswire-Usage-State'
            X-Request-ID:
              $ref: '#/components/headers/X-Request-ID'
        '400':
          $ref: '#/components/responses/Problem'
        '401':
          $ref: '#/components/responses/Problem'
        '402':
          $ref: '#/components/responses/Problem'
        '403':
          $ref: '#/components/responses/Problem'
        '404':
          $ref: '#/components/responses/Problem'
        '405':
          $ref: '#/components/responses/Problem'
        '409':
          $ref: '#/components/responses/Problem'
        '414':
          $ref: '#/components/responses/Problem'
        '422':
          $ref: '#/components/responses/Problem'
        '429':
          $ref: '#/components/responses/Problem'
        '500':
          $ref: '#/components/responses/Problem'
        '503':
          $ref: '#/components/responses/Problem'
        '504':
          $ref: '#/components/responses/Problem'
      security:
        - ApiKey: []
      x-codeSamples:
        - lang: cURL
          source: >-
            case "$FIXTURE_ID" in ""|*[!A-Za-z0-9_-]*) echo "Set a valid
            FIXTURE_ID" >&2; exit 1;; esac

            curl --get --max-time 10 \
              --url "https://api.oddswire.io/v1/fixtures/$FIXTURE_ID" \
              --data-urlencode "namespace=$ODDSWIRE_NAMESPACE" \
              --header "X-API-Key: $ODDSWIRE_API_KEY"
        - lang: Python
          source: >-
            import re

            import os

            from urllib.parse import urlencode

            from urllib.request import Request, build_opener,
            HTTPRedirectHandler


            class NoRedirect(HTTPRedirectHandler):
                def redirect_request(self, req, fp, code, msg, headers, newurl):
                    return None

            fixture_id=os.environ["FIXTURE_ID"]

            if not re.fullmatch(r"[A-Za-z0-9_-]{1,100}",fixture_id):
                raise ValueError("Invalid fixture ID")
            query = {"namespace": os.environ["ODDSWIRE_NAMESPACE"]}

            url =
            "https://api.oddswire.io/v1/fixtures/{fixture_id}".replace("{fixture_id}",
            fixture_id) + ("?" + urlencode(query) if query else "")

            request = Request(url, headers={"X-API-Key":
            os.environ["ODDSWIRE_API_KEY"]})

            with build_opener(NoRedirect).open(request, timeout=10) as response:
                print(response.read().decode())
        - lang: TypeScript
          source: >-
            const required = (name: string) => {
              const value = process.env[name];
              if (!value) throw new Error(`Set ${name}`);
              return value;
            };

            const fixtureID=required("FIXTURE_ID");

            if (!/^[A-Za-z0-9_-]{1,100}$/.test(fixtureID)) throw new
            Error("Invalid fixture ID");

            const url = new
            URL("https://api.oddswire.io/v1/fixtures/__FIXTURE__".replace("__FIXTURE__",fixtureID));

            url.searchParams.set("namespace", required("ODDSWIRE_NAMESPACE"));

            const response = await fetch(url, {
              headers: {"X-API-Key": required("ODDSWIRE_API_KEY")},
              redirect: "error", signal: AbortSignal.timeout(10_000),
            });

            if (!response.ok) throw new Error(`HTTP ${response.status}`);

            console.log(await response.json());
components:
  schemas:
    DatasetFixturesPage:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/DatasetFixture'
          type: array
        meta:
          $ref: '#/components/schemas/Meta'
        missing:
          items:
            $ref: '#/components/schemas/Missing'
          type: array
      required:
        - data
        - missing
        - meta
      type: object
    DatasetFixture:
      additionalProperties: false
      properties:
        competition:
          type: string
        competition_id:
          oneOf:
            - $ref: '#/components/schemas/ID'
            - type: 'null'
        evidence:
          $ref: '#/components/schemas/DatasetEvidence'
        id:
          type: string
        identity_scope:
          type: string
        original:
          type: object
        participants:
          items:
            $ref: '#/components/schemas/DatasetParticipant'
          type: array
        source_id:
          oneOf:
            - $ref: '#/components/schemas/ID'
            - type: 'null'
        sport:
          type: string
        sport_id:
          oneOf:
            - $ref: '#/components/schemas/ID'
            - type: 'null'
        starts_at:
          oneOf:
            - format: date-time
              type: string
            - type: 'null'
        status:
          type: string
      required:
        - competition_id
        - id
        - identity_scope
        - source_id
        - sport_id
        - sport
        - competition
        - starts_at
        - status
        - participants
        - evidence
        - original
      type: object
    Meta:
      additionalProperties: false
      properties:
        consistency:
          type: string
        count:
          type: integer
        dataset:
          type: string
        namespace:
          type: string
        next_cursor:
          type: string
        request_id:
          type: string
        sent_ts:
          format: date-time
          type: string
        snapshot_ts:
          format: date-time
          type: string
        version:
          type: string
      required:
        - version
        - request_id
        - sent_ts
        - snapshot_ts
        - next_cursor
        - count
        - consistency
      type: object
    Missing:
      additionalProperties: false
      properties:
        detail:
          type: string
        family:
          $ref: '#/components/schemas/Family'
        fixture_id:
          $ref: '#/components/schemas/ID'
        quote_key:
          type: string
        reason:
          type: string
        source_id:
          $ref: '#/components/schemas/ID'
      required:
        - reason
        - detail
      type: object
    Problem:
      additionalProperties: false
      properties:
        code:
          type: string
        detail:
          type: string
        invalid_params:
          items:
            $ref: '#/components/schemas/InvalidParam'
          type: array
        missing:
          items:
            $ref: '#/components/schemas/Missing'
          type: array
        request_id:
          type: string
        status:
          type: integer
        title:
          type: string
        type:
          type: string
      required:
        - type
        - title
        - status
        - detail
        - code
        - request_id
        - invalid_params
        - missing
      type: object
    ID:
      maximum: 9007199254740991
      minimum: 1
      type: integer
    DatasetEvidence:
      additionalProperties: false
      properties:
        capture_id:
          type: string
        confirmed_at:
          oneOf:
            - format: date-time
              type: string
            - type: 'null'
        delay_seconds:
          type: integer
        fresh_for_live_use:
          type: boolean
        mode:
          type: string
        received_at:
          oneOf:
            - format: date-time
              type: string
            - type: 'null'
        source_at:
          oneOf:
            - format: date-time
              type: string
            - type: 'null'
      required:
        - delay_seconds
        - mode
        - received_at
        - confirmed_at
        - source_at
        - fresh_for_live_use
      type: object
    DatasetParticipant:
      additionalProperties: false
      properties:
        fixture_id:
          type: string
        id:
          oneOf:
            - type: string
            - type: 'null'
        identity_scope:
          type: string
        identity_verified:
          type: boolean
        kind:
          enum:
            - team
            - player
          type: string
        name:
          type: string
        original:
          type: object
        role:
          type: string
        source_id:
          oneOf:
            - $ref: '#/components/schemas/ID'
            - type: 'null'
      required:
        - id
        - name
        - kind
        - role
        - identity_scope
        - source_id
        - fixture_id
        - identity_verified
        - original
      type: object
    Family:
      enum:
        - 1x2
        - total
        - asian_handicap
      type: string
    InvalidParam:
      additionalProperties: false
      properties:
        name:
          type: string
        reason:
          type: string
      required:
        - name
        - reason
      type: object
  headers:
    X-Oddswire-Credit-Cost:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Credits-Limit:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Credits-Remaining:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Credits-Reserved:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Credits-Reset:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Credits-Used:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Metering:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Overage:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Oddswire-Usage-State:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
    X-Request-ID:
      description: >-
        Account-scoped admission snapshot where authenticated: remaining
        excludes holds; used counts settled calls. Cost 1 reserves one credit;
        actual charge settles only after complete local write/flush. Inspect
        free account/usage by request ID for final state. UTC reset is RFC3339;
        overage is off. Unknown credentials disclose no account counters.
      schema:
        type: string
  responses:
    Problem:
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
      description: >-
        Structured actionable problem; errors consume zero credits. Quota
        exhaustion/unconfigured returns 402 with counters/reset headers and free
        usage guidance. 429 Retry-After is separate abuse control. No database
        details or credentials.
      headers:
        X-Oddswire-Credit-Cost:
          $ref: '#/components/headers/X-Oddswire-Credit-Cost'
        X-Oddswire-Credits-Limit:
          $ref: '#/components/headers/X-Oddswire-Credits-Limit'
        X-Oddswire-Credits-Remaining:
          $ref: '#/components/headers/X-Oddswire-Credits-Remaining'
        X-Oddswire-Credits-Reserved:
          $ref: '#/components/headers/X-Oddswire-Credits-Reserved'
        X-Oddswire-Credits-Reset:
          $ref: '#/components/headers/X-Oddswire-Credits-Reset'
        X-Oddswire-Credits-Used:
          $ref: '#/components/headers/X-Oddswire-Credits-Used'
        X-Oddswire-Metering:
          $ref: '#/components/headers/X-Oddswire-Metering'
        X-Oddswire-Overage:
          $ref: '#/components/headers/X-Oddswire-Overage'
        X-Oddswire-Usage-State:
          $ref: '#/components/headers/X-Oddswire-Usage-State'
        X-Request-ID:
          $ref: '#/components/headers/X-Request-ID'
  securitySchemes:
    ApiKey:
      in: header
      name: X-API-Key
      type: apiKey

````

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