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

# Terminal board

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

Session-only Terminal product. Separate current Terminal grants and display/chart source-purpose/region reviews; API plans/keys and REST credits are not used. Private, no-store, bounded polling and native recorded history only.

`POST /v1/terminal/board`

## Authentication

`AccountSession`

## Parameters

| Name | Location | Required | Description |
| - | - | - | - |
| `X-Oddswire-Account` | header | No | UUID of an account where the signed-in user is a member; defaults to their oldest account. |

## Request body

```json theme={null}
{
  "$ref": "#/components/schemas/TerminalBoardInput"
}
```

## Responses

| Status | Meaning |
| - | - |
| 200 | Account ledger response; no-store. Key secrets appear only once on creation/rotation. Lists contain at most 100 recent entries, active keys first. |
| 400 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 401 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 403 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 404 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 405 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 409 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 422 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 429 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 500 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 503 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |
| 504 | Structured problem; see [error handling](https://docs.oddswire.io/errors.md). |

Full request and response schemas: [OpenAPI](https://docs.oddswire.io/openapi.json). [Authentication](https://docs.oddswire.io/authentication.md) · [Prices and coverage](https://docs.oddswire.io/data.md) · [Errors and credits](https://docs.oddswire.io/errors.md).


## OpenAPI

````yaml POST /v1/terminal/board
openapi: 3.1.2
info:
  description: >-
    Generated from canonical/account/usage DTOs and handler registries. Atomic
    included credits and durable usage, UTC monthly cycles, overage off. Full
    local response write/flush is the observable completion boundary; uncertain
    crash/outage deliveries recover free. Live Clerk login needs provider setup.
    Test-only Stripe billing uses signed durable receipts and reconciled app
    entitlements; real sandbox verification remains open. Dashboard and
    WebSocket are local pilots. Bounded history/as-of/lines and CSV/Parquet
    exports require separate current history/export grants and source-purpose
    reviews. Public launch remains gated. Namespaces are never joined by
    coincident IDs.
  title: Oddswire REST v1 local pilot
  version: 1.0.0
servers:
  - url: http://127.0.0.1:9113
security: []
externalDocs:
  description: WebSocket v1 AsyncAPI contract
  url: http://127.0.0.1:9113/asyncapi.json
paths:
  /v1/terminal/board:
    post:
      summary: terminalBoard
      description: >-
        Session-only Terminal product. Separate current Terminal grants and
        display/chart source-purpose/region reviews; API plans/keys and REST
        credits are not used. Private, no-store, bounded polling and native
        recorded history only.
      operationId: terminalBoard
      parameters:
        - description: >-
            UUID of an account where the signed-in user is a member; defaults to
            their oldest account.
          in: header
          name: X-Oddswire-Account
          required: false
          schema:
            format: uuid
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TerminalBoardInput'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TerminalBoardPage'
          description: >-
            Account ledger response; no-store. Key secrets appear only once on
            creation/rotation. Lists contain at most 100 recent entries, active
            keys first.
          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'
        '403':
          $ref: '#/components/responses/Problem'
        '404':
          $ref: '#/components/responses/Problem'
        '405':
          $ref: '#/components/responses/Problem'
        '409':
          $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:
        - AccountSession: []
components:
  schemas:
    TerminalBoardInput:
      additionalProperties: false
      properties:
        cursor:
          type: string
      type: object
    TerminalBoardPage:
      additionalProperties: false
      properties:
        data:
          items:
            $ref: '#/components/schemas/TerminalBoard'
          type: array
        meta:
          $ref: '#/components/schemas/Meta'
        missing:
          items:
            $ref: '#/components/schemas/Missing'
          type: array
      required:
        - data
        - missing
        - meta
      type: object
    TerminalBoard:
      additionalProperties: false
      properties:
        displayed_fixtures:
          type: integer
        missing:
          items:
            $ref: '#/components/schemas/Missing'
          type: array
        namespace:
          type: string
        next_cursor:
          type: string
        preferences_revision:
          type: integer
        product:
          type: string
        provenance:
          type: string
        rows:
          items:
            $ref: '#/components/schemas/TerminalRow'
          type: array
        server_now:
          format: date-time
          type: string
        sources:
          items:
            $ref: '#/components/schemas/TerminalSource'
          type: array
        total_fixtures:
          type: integer
      required:
        - product
        - namespace
        - provenance
        - preferences_revision
        - server_now
        - rows
        - sources
        - missing
        - total_fixtures
        - displayed_fixtures
        - next_cursor
      type: object
    Meta:
      additionalProperties: false
      properties:
        consistency:
          type: string
        count:
          type: integer
        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
    TerminalRow:
      additionalProperties: false
      properties:
        cells:
          items:
            $ref: '#/components/schemas/TerminalCell'
          type: array
        code:
          type: string
        family:
          $ref: '#/components/schemas/Family'
        fixture:
          $ref: '#/components/schemas/FixtureInfo'
        id:
          type: string
        identity_scope:
          type: string
        kind:
          $ref: '#/components/schemas/SourceKind'
        line_quarters:
          type: integer
        period:
          $ref: '#/components/schemas/Period'
        reference:
          $ref: '#/components/schemas/FairResult'
        reference_reason:
          type: string
        settlement_rule:
          type: string
      required:
        - id
        - fixture
        - identity_scope
        - family
        - period
        - settlement_rule
        - code
        - kind
        - cells
        - reference_reason
      type: object
    TerminalSource:
      additionalProperties: false
      properties:
        chart_allowed:
          type: boolean
        display_allowed:
          type: boolean
        fair_allowed:
          type: boolean
        info:
          $ref: '#/components/schemas/SourceInfo'
        namespace:
          type: string
        reason:
          type: string
      required:
        - namespace
        - info
        - display_allowed
        - fair_allowed
        - chart_allowed
        - reason
      type: object
    Family:
      enum:
        - 1x2
        - total
        - asian_handicap
      type: string
    ID:
      maximum: 9007199254740991
      minimum: 1
      type: integer
    InvalidParam:
      additionalProperties: false
      properties:
        name:
          type: string
        reason:
          type: string
      required:
        - name
        - reason
      type: object
    TerminalCell:
      additionalProperties: false
      properties:
        best:
          type: boolean
        confirmed_ts:
          format: date-time
          type: string
        decimal_odds:
          $ref: '#/components/schemas/Decimal'
        freshness_limit_seconds:
          type: integer
        key:
          $ref: '#/components/schemas/PriceKey'
        native_unit:
          $ref: '#/components/schemas/NativeUnit'
        native_value:
          $ref: '#/components/schemas/Decimal'
        quote_key:
          type: string
        reason:
          type: string
        seen_ts:
          format: date-time
          type: string
        source_ts:
          format: date-time
          type: string
        status:
          enum:
            - active
            - stale
            - suspended
            - unavailable
          type: string
      required:
        - quote_key
        - key
        - status
        - reason
        - native_unit
        - seen_ts
        - confirmed_ts
        - freshness_limit_seconds
        - best
      type: object
    FixtureInfo:
      additionalProperties: false
      properties:
        away:
          $ref: '#/components/schemas/Participant'
        bindings:
          items:
            $ref: '#/components/schemas/Binding'
          type: array
        fixture:
          $ref: '#/components/schemas/Fixture'
        home:
          $ref: '#/components/schemas/Participant'
        identity_scope:
          enum:
            - reviewed_group
            - source_local
          type: string
      required:
        - fixture
        - home
        - away
        - identity_scope
        - bindings
      type: object
    SourceKind:
      enum:
        - sportsbook
        - exchange
        - prediction
      type: string
    Period:
      enum:
        - full_time
        - first_half
      type: string
    FairResult:
      additionalProperties: false
      properties:
        evaluated_at:
          format: date-time
          type: string
        independent_groups:
          type: integer
        market:
          $ref: '#/components/schemas/FairMarket'
        max_confirmation_skew_seconds:
          type: integer
        method:
          enum:
            - multiplicative
            - power
          type: string
        min_independent_groups:
          type: integer
        min_sharp_groups:
          type: integer
        missing:
          items:
            type: string
          type: array
        policy_id:
          type: string
        policy_sha256:
          type: string
        probabilities:
          items:
            $ref: '#/components/schemas/FairProbability'
          type: array
        sharp_groups:
          type: integer
        sources:
          items:
            $ref: '#/components/schemas/FairSource'
          type: array
        status:
          enum:
            - available
            - insufficient_reference
          type: string
        valid_until:
          format: date-time
          type: string
        version:
          type: string
      required:
        - version
        - evaluated_at
        - market
        - method
        - policy_id
        - policy_sha256
        - status
        - missing
        - independent_groups
        - sharp_groups
        - min_independent_groups
        - min_sharp_groups
        - max_confirmation_skew_seconds
        - sources
      type: object
    SourceInfo:
      additionalProperties: false
      properties:
        brand:
          $ref: '#/components/schemas/Brand'
        collection:
          enum:
            - working
            - blocked
            - access_only
            - not_integrated
          type: string
        entitled:
          type: boolean
        families:
          items:
            $ref: '#/components/schemas/Family'
          type: array
        inplay:
          $ref: '#/components/schemas/InPlayCoverage'
        rights:
          type: string
        source:
          $ref: '#/components/schemas/Source'
      required:
        - inplay
        - source
        - brand
        - collection
        - families
        - rights
        - entitled
      type: object
    Decimal:
      pattern: ^(0|[1-9][0-9]{0,15})\.[0-9]{8}$
      type: string
    PriceKey:
      additionalProperties: false
      properties:
        depth:
          maximum: 3
          type: integer
        fixture_id:
          $ref: '#/components/schemas/ID'
        market_id:
          $ref: '#/components/schemas/ID'
        outcome_id:
          $ref: '#/components/schemas/ID'
        side:
          $ref: '#/components/schemas/Side'
        source_fixture_id:
          minLength: 1
          type: string
        source_id:
          $ref: '#/components/schemas/ID'
        source_market_id:
          minLength: 1
          type: string
        source_outcome_id:
          minLength: 1
          type: string
      required:
        - source_id
        - fixture_id
        - market_id
        - outcome_id
        - source_fixture_id
        - source_market_id
        - source_outcome_id
        - side
        - depth
      type: object
    NativeUnit:
      enum:
        - decimal_odds
        - probability
      type: string
    Participant:
      additionalProperties: false
      properties:
        external_ids:
          additionalProperties:
            type: string
          type: object
        id:
          $ref: '#/components/schemas/ID'
        kind:
          enum:
            - team
            - player
          type: string
        name:
          minLength: 1
          type: string
        sport_id:
          $ref: '#/components/schemas/ID'
      required:
        - id
        - sport_id
        - name
        - kind
      type: object
    Binding:
      additionalProperties: false
      properties:
        group_fixture_id:
          $ref: '#/components/schemas/ID'
        native_fixture_id:
          $ref: '#/components/schemas/ID'
        revision:
          type: integer
        source_fixture_id:
          type: string
        source_id:
          $ref: '#/components/schemas/ID'
        source_swapped:
          type: boolean
        state:
          type: string
        swapped:
          type: boolean
      required:
        - source_id
        - source_fixture_id
        - native_fixture_id
        - state
        - revision
        - swapped
        - source_swapped
      type: object
    Fixture:
      additionalProperties: false
      properties:
        away_id:
          $ref: '#/components/schemas/ID'
        competition_id:
          $ref: '#/components/schemas/ID'
        external_ids:
          additionalProperties:
            type: string
          type: object
        home_id:
          $ref: '#/components/schemas/ID'
        id:
          $ref: '#/components/schemas/ID'
        previous_fixture_id:
          $ref: '#/components/schemas/ID'
        reissued_fixture_id:
          $ref: '#/components/schemas/ID'
        sport_id:
          $ref: '#/components/schemas/ID'
        start_ts:
          format: date-time
          type: string
        status:
          enum:
            - scheduled
            - live
            - ended
            - cancelled
          type: string
      required:
        - id
        - sport_id
        - competition_id
        - home_id
        - away_id
        - start_ts
        - status
      type: object
    FairMarket:
      additionalProperties: false
      properties:
        family:
          $ref: '#/components/schemas/Family'
        fixture_id:
          $ref: '#/components/schemas/ID'
        line_quarters:
          type: integer
        period:
          $ref: '#/components/schemas/Period'
        settlement_rule:
          type: string
      required:
        - fixture_id
        - family
        - period
        - settlement_rule
      type: object
    FairProbability:
      additionalProperties: false
      properties:
        code:
          type: string
        decimal_odds:
          $ref: '#/components/schemas/Decimal'
        probability:
          $ref: '#/components/schemas/Decimal'
      required:
        - code
        - probability
        - decimal_odds
      type: object
    FairSource:
      additionalProperties: false
      properties:
        configured_weight:
          $ref: '#/components/schemas/Decimal'
        currency:
          type: string
        effective_weight:
          $ref: '#/components/schemas/Decimal'
        feed_group_id:
          $ref: '#/components/schemas/ID'
        max_age_seconds:
          type: integer
        max_probability_spread:
          $ref: '#/components/schemas/Decimal'
        min_size:
          $ref: '#/components/schemas/Decimal'
        offers:
          items:
            $ref: '#/components/schemas/FairOffer'
          type: array
        power_exponent:
          $ref: '#/components/schemas/Decimal'
        probabilities:
          items:
            $ref: '#/components/schemas/FairProbability'
          type: array
        quotes:
          items:
            $ref: '#/components/schemas/FairQuoteRef'
          type: array
        reasons:
          items:
            type: string
          type: array
        region:
          type: string
        selected:
          type: boolean
        selected_offer:
          type: string
        sharp:
          type: boolean
        size_unit:
          type: string
        source_id:
          $ref: '#/components/schemas/ID'
      required:
        - source_id
        - region
        - reasons
        - offers
        - quotes
        - selected
        - sharp
        - max_age_seconds
        - min_size
        - max_probability_spread
      type: object
    Brand:
      additionalProperties: false
      properties:
        id:
          $ref: '#/components/schemas/ID'
        name:
          minLength: 1
          type: string
        slug:
          minLength: 1
          type: string
      required:
        - id
        - slug
        - name
      type: object
    InPlayCoverage:
      additionalProperties: false
      properties:
        families:
          items:
            $ref: '#/components/schemas/Family'
          type: array
        freshness_limit_seconds:
          type: integer
        mode:
          enum:
            - pre_match_only
            - local_test_only
          type: string
        reason:
          type: string
      required:
        - mode
        - families
        - freshness_limit_seconds
        - reason
      type: object
    Source:
      additionalProperties: false
      properties:
        brand_id:
          $ref: '#/components/schemas/ID'
        enabled:
          type: boolean
        feed_group_id:
          $ref: '#/components/schemas/ID'
        id:
          $ref: '#/components/schemas/ID'
        kind:
          $ref: '#/components/schemas/SourceKind'
        region:
          minLength: 1
          type: string
        slug:
          minLength: 1
          type: string
      required:
        - id
        - slug
        - brand_id
        - region
        - kind
        - enabled
      type: object
    Side:
      enum:
        - quote
        - back
        - lay
        - bid
        - ask
      type: string
    FairOffer:
      additionalProperties: false
      properties:
        native_offer:
          type: string
        reasons:
          items:
            type: string
          type: array
      required:
        - native_offer
        - reasons
      type: object
    FairQuoteRef:
      additionalProperties: false
      properties:
        latest_revision:
          type: integer
        mapping_revision:
          type: integer
        mapping_swapped:
          type: boolean
        market_id:
          $ref: '#/components/schemas/ID'
        native_settlement_rule:
          type: string
        price:
          $ref: '#/components/schemas/LatestPrice'
        source_swapped:
          type: boolean
        target_code:
          type: string
      required:
        - price
        - latest_revision
        - mapping_revision
        - market_id
        - target_code
        - native_settlement_rule
        - mapping_swapped
        - source_swapped
      type: object
    LatestPrice:
      additionalProperties: false
      properties:
        confirmed_ts:
          format: date-time
          type: string
        observation:
          $ref: '#/components/schemas/PriceObservation'
      required:
        - observation
        - confirmed_ts
      type: object
    PriceObservation:
      additionalProperties: false
      properties:
        event_id:
          format: uuid
          type: string
        key:
          $ref: '#/components/schemas/PriceKey'
        raw_payload_id:
          format: uuid
          type: string
        seen_ts:
          format: date-time
          type: string
        source_sequence:
          type: string
        source_ts:
          format: date-time
          type: string
        value:
          $ref: '#/components/schemas/PriceValue'
      required:
        - event_id
        - raw_payload_id
        - key
        - value
        - seen_ts
      type: object
    PriceValue:
      additionalProperties: false
      properties:
        available_size:
          $ref: '#/components/schemas/Decimal'
        commission_rate:
          $ref: '#/components/schemas/Decimal'
        currency:
          pattern: ^[A-Z]{3}$
          type: string
        decimal_odds:
          $ref: '#/components/schemas/Decimal'
        fee_rate:
          $ref: '#/components/schemas/Decimal'
        main_line:
          type: boolean
        native_unit:
          $ref: '#/components/schemas/NativeUnit'
        native_value:
          $ref: '#/components/schemas/Decimal'
        size_unit:
          enum:
            - currency
            - contracts
          type: string
        state:
          $ref: '#/components/schemas/PriceState'
      required:
        - state
        - native_unit
      type: object
    PriceState:
      enum:
        - active
        - suspended
        - unavailable
      type: string
  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:
    AccountSession:
      description: >-
        Clerk session JWT, or one-hour CLI-only local session. No cookie
        authentication.
      scheme: bearer
      type: http

````

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