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

# Check Bets

> Submit your users' bet selections and check their resolution status — the API automatically determines if each bet `won`, `lost`, `refund`, or is still `pending`. Each selection is matched by
`market` name and `outcome` label (with smart alias handling for common variants like
"Match Winner" / "1X2" / "Moneyline").

Team names and final scores are included in the response.
Process settlements promptly — poll regularly after the game ends to capture all market resolutions as they arrive gradually.

Each selection requires: `event_id`, `market` (name), and `outcome` (label).
For guaranteed accuracy, include **`market_id`** and **`selection_id`** (**primary** identification — from `/events` or `/settlements`) to match by ID instead of name.
Optionally include `odds` to get `payout_multiplier` and `stake` to get calculated `payout` in the response.
The `stake` field is **currency-agnostic** — send any numeric amount in your platform's currency.
The response includes `matched_market_id` and `matched_selection_id` for your records.

Request body supports:
- batch mode: `{ selections: [...] }`
- single mode: `{ selection: {...} }`
- single shortcut: `{ event_id, market, outcome, odds?, stake? }`




## OpenAPI

````yaml POST /v1/bets/check
openapi: 3.0.3
info:
  title: FieldFunded Sports API
  description: >
    Real-time sports data API covering **30+ sports & esports** and **1,000+
    betting markets** per event. Built for low-latency live odds, settlement,
    and quantitative analysis.


    ## Official SDK

    The fastest way to integrate is using our official [TypeScript SDK](/sdk).
    It handles authentication, retries, and provides full type safety for all
    1,000+ markets.


    ## Features

    - **Sub-second latency** — Data refreshed every 300ms from live feeds

    - **30+ sports & esports** — Soccer, Basketball, Tennis, Ice Hockey,
    Baseball, American Football, Rugby, Cricket, MMA, Handball, Volleyball, and
    more

    - **Full Esports Coverage** — Counter-Strike, Dota 2, LoL, Valorant, Rainbow
    Six, King of Glory, Call of Duty, Mobile Legends

    - **1,000+ Markets per game** — Match Winner, Over/Under, BTTS, Handicaps,
    Corners, Cards, Player Props, Map Winner, Round Winner, and more (major
    leagues like NBA, NFL, Premier League)

    - **Live Scores** — Real-time scoreboards with period scores, serving
    indicators, and match clocks

    - **Outrights/Futures** — Long-term futures and season-level markets (e.g.,
    League Winner, Top Goalscorer, Most Assists, Tournament MVP)

    - **Settlement Results** (Automatic) — Per-market settlement outcomes
    (won/lost/refund) for ended events, with gradual market-by-market
    resolution. No developer action required — markets begin resolving within
    seconds after game end. Send `stake` to get instant `payout` calculation
    (currency-agnostic). Poll regularly after the game ends to capture all
    market resolutions as they arrive.

    - **Parlay Resolution** (Exclusive) — Submit multi-leg parlays (singles,
    combos) and get combined result + payout calculation with optional `stake`.
    Refund legs are treated as odds 1.00 in the combined calculation.

    - **Featured Games** — Curated top matches from priority leagues (Premier
    League, La Liga, Champions League, Europa League, Bundesliga, Serie A, Ligue
    1, NBA, NFL, MLB, NHL), live-first sorted.

    - **Rich Visual Assets** — PNG team logos (~85% coverage), PNG & SVG team
    logos for featured leagues, SVG league logos, 182 SVG country flags and
    custom SVG sport icons.

    - **Global Coverage** — Premier League, La Liga, NBA, NFL, NHL, MLB,
    Champions League, and thousands of worldwide leagues including 3rd
    divisions, regional cups, ITF tournaments, and youth/female leagues, etc.


    ## Pricing

    Free tier with 10,000 requests/month. Paid plans from $29/mo. All features
    included at every tier. See [full pricing comparison](/compare/pricing).



    ## Learn More

    - [Quick Start Guide](/quickstart) — First API call in 5 minutes

    - [Authentication](/authentication) — API key setup

    - [Rate Limits](/rate-limits) — Per-plan limits and quota monitoring

    - [Supported Sports](/reference/supported-sports) — Full sport key reference

    - [Market Types](/reference/market-types) — 1,000+ market catalogue

    - [Event Statuses](/reference/event-statuses) — Lifecycle and 48-hour rule

    - [Visual Assets](/reference/visual-assets) — Logos, flags, and icons

    - [SDK Reference](/sdk) — TypeScript SDK installation and usage



    ## Sport-Specific Live Data

    Detail endpoints include a `sport_data` object with sport-specific fields:

    - **Tennis/Volleyball**: `home_serving`, `away_serving` (who is serving),
    `home_game_score`/`away_game_score` (values: `0`, `15`, `30`, `40`, `AD`),
    `is_tiebreak`

    - **Ice Hockey**: `home_suspend`/`away_suspend` (players in penalty box =
    power play indicator)

    - **All sports**: Period-by-period scoreboards via `scoreboard` object


    The `scoreboard` object contains:

    - `headers`: Column labels (e.g. `["", "1st", "2nd", "T", "Corner", "YC",
    "RC"]`)

    - `home`/`away`: Stats arrays matching the headers


    **Sport-specific scoreboard detail:**


    | Sport | Scoreboard Columns | Extra Fields |

    |-------|-------------------|--------------|

    | **Football (Soccer)** | 1st Half, 2nd Half, Total, Corners, Yellow Cards
    (YC), Red Cards (RC) | `period` (1H, 2H, HT, ET, PEN) |

    | **Tennis** | Set 1, Set 2, Set 3, Set 4, Set 5, Total |
    `home_game_score`/`away_game_score` (0, 15, 30, 40, AD), `is_tiebreak`,
    `home_serving`/`away_serving` |

    | **Basketball (NBA)** | Q1, Q2, Q3, Q4, OT, Total | `period` (Q1-Q4,
    OT1-OT3) |

    | **Ice Hockey (NHL)** | P1, P2, P3, OT, Total |
    `home_suspend`/`away_suspend` (power play) |

    | **American Football (NFL)** | Q1, Q2, Q3, Q4, OT, Total | `period`,
    `down_and_distance` |

    | **Baseball (MLB)** | Inn 1-9+, Total, Hits, Errors | `period` (Top/Bot
    1-9+), `bases`, `outs` |

    | **Volleyball** | Set 1-5, Points, Total | `home_serving`/`away_serving` |

    | **Table Tennis** | Set 1-7, Total | `home_serving`/`away_serving` |

    | **CS2 / Valorant** | Map 1, Map 2, Map 3, Rounds | `current_map`,
    `map_score`, `round_score` |

    | **Dota 2 / LoL** | Game 1, Game 2, Game 3, Total | `current_game`,
    `game_duration` |

    | **Cricket** | Innings 1, Innings 2, Overs, Wickets | `run_rate`, `target`
    |

    | **Handball** | 1st Half, 2nd Half, Total | `period` |

    | **Rugby** | 1st Half, 2nd Half, Total | `period`, `try_count` |

    | **Darts** | Set/Leg scores | `current_set`, `current_leg` |

    | **Snooker** | Frame scores, Total | `current_frame`, `frame_score` |

    | **MMA / Boxing** | Round 1-12, Total | `current_round` |


    ## Prematch Odds

    - Prematch events include full market odds (up to 1,000+ markets per event
    on major leagues)

    - Odds are refreshed via incremental cursor — 10 prematch games per 300ms
    cycle (~10-30s full pass depending on total game count)

    - Detail data (markets, scoreboards) polled every ~16-20s per event

    - All odds formats supported: `decimal`, `american`, `fractional`


    ### Fixture Horizon

    Prematch fixture depth is **league-dependent** — major leagues (e.g. Premier
    League, NBA) typically appear further ahead than niche or regional events.
    There is no fixed global limit; it reflects when the data provider publishes
    upcoming matches. Use `GET /v1/events?starts_within=2h` or
    `starts_within=1d` to filter by time window. Every event includes a
    `commence_time` (ISO 8601) field for precise scheduling.



    ## Market Suspension & Locked Odds

    Individual selections or entire markets can become temporarily **locked**
    (`is_locked: true`).

    This happens during:

    - **Goal/score events** — markets lock for 30-60 seconds while odds are
    recalculated

    - **Dangerous moments** — e.g. penalty kicks, red cards, break points in
    tennis

    - **End of game** — as a match approaches final minutes, the provider
    progressively locks markets

    - **Half-time / period breaks** — some markets lock between periods


    When `is_locked: true`, the odds value is still present (last known value)
    but the selection

    **cannot be bet on**. Your UI should grey out or disable these selections.


    ### Empty Markets (End of Game)

    Near the end of a live match, the `markets` array may become **empty**
    (`[]`) or return

    with **all outcomes locked**. This is normal — the provider stops accepting
    bets in the

    final minutes. The `markets_count` field will reflect `0` in this case.


    After the game finishes (`status: "ended"`), markets are no longer returned.

    Use `/v1/events/{eventId}/result` or `/v1/settlements` for final settlement
    data.


    ### ended Game Snapshot (Endgame Data)

    When a game finishes (or is cancelled/postponed), the API archives the final
    score permanently and provides settlement data in a rolling window. This
    applies to **all sports & esports** (Soccer, NBA, CS2, LoL, Tennis, etc.).


    **Two tiers of post-game data:**


    | Endpoint | Data | Retention |

    |----------|------|-----------|

    | `/v1/events/{eventId}/result` | Final score, status | **Permanent** —
    archived indefinitely |

    | `/v1/settlements` | Market resolutions (won/lost/refund), team names,
    scores, logos | **Recent** — poll regularly after game end to capture all
    market resolutions as they arrive gradually |

    | `/v1/bets/check` | Bet resolution against settlement data | **Recent**
    (same as settlements) |


    > **Important**: Process settlements promptly by polling every 60 seconds.
    Final scores remain permanently available via `/v1/events/{eventId}/result`.


    ## Team Side Identification

    Market outcomes include an optional `team_side` field:

    - `"home"` — this selection refers to the home team

    - `"away"` — this selection refers to the away team

    - `null` or absent — neutral selection (Draw, Over/Under totals, etc.)


    This is useful for mapping selections to team names without parsing the
    `label` string.

    Available on 1X2, Handicap, Double Chance, and similar two-sided markets.



    ### Prematch → Live Transition

    Detected automatically. When a game kicks off, its status changes from
    `prematch` to `live` and it appears in `/v1/live`. No action needed from the
    developer.



    All IDs, scores, and timestamps in endpoint examples are **synthetic**. Use
    /v1/events to discover real event IDs.
  version: 1.0.0
  termsOfService: https://docs.fieldfunded.com/terms
  contact:
    name: FieldFunded API Support
    url: https://docs.fieldfunded.com
    email: support@fieldfunded.com
servers:
  - url: https://api.fieldfunded.com
    description: Production
security:
  - ApiKeyAuth: []
tags:
  - name: Sports
    description: Discover available sports and leagues
  - name: Events
    description: Browse and search sports events
  - name: Live
    description: Real-time live event data and scores
  - name: Odds
    description: Current betting odds
  - name: Results
    description: Automatic match settlement and outcomes
  - name: Settlement
    description: >
      Fully automatic bet settlement — markets resolve on their own as soon as a
      game ends. No developer action required.

      Also includes bet-check endpoints: submit your users' selections to verify
      outcomes against automatic results.

      Supports single bets and multi-leg parlays/combos.

      The 48-hour rule applies: postponed/suspended games that don't resume
      within 48h are auto-refunded.


      #### Accurate Settlement Using IDs

      Every market and selection has a unique ID (`market_id` and
      `selection_id`). Use these IDs for bet placement and settlement to
      guarantee 100% accuracy. Market names and labels are also available for
      display purposes.
  - name: Outrights
    description: |
      Season-level winner markets (e.g., League Winner).
      Updated every 3 hours.
  - name: System
    description: API health and status
  - name: Usage Monitoring
    description: >-
      Track your API usage, quota status, and active warnings. Data available
      via the Developer Portal at `/portal`.
paths:
  /v1/bets/check:
    post:
      tags:
        - Settlement
      summary: Check Bets — Automatic settlement with payout calculation
      description: >
        Submit your users' bet selections and check their resolution status —
        the API automatically determines if each bet `won`, `lost`, `refund`, or
        is still `pending`. Each selection is matched by

        `market` name and `outcome` label (with smart alias handling for common
        variants like

        "Match Winner" / "1X2" / "Moneyline").


        Team names and final scores are included in the response.

        Process settlements promptly — poll regularly after the game ends to
        capture all market resolutions as they arrive gradually.


        Each selection requires: `event_id`, `market` (name), and `outcome`
        (label).

        For guaranteed accuracy, include **`market_id`** and **`selection_id`**
        (**primary** identification — from `/events` or `/settlements`) to match
        by ID instead of name.

        Optionally include `odds` to get `payout_multiplier` and `stake` to get
        calculated `payout` in the response.

        The `stake` field is **currency-agnostic** — send any numeric amount in
        your platform's currency.

        The response includes `matched_market_id` and `matched_selection_id` for
        your records.


        Request body supports:

        - batch mode: `{ selections: [...] }`

        - single mode: `{ selection: {...} }`

        - single shortcut: `{ event_id, market, outcome, odds?, stake? }`
      operationId: checkBets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                selections:
                  type: array
                  maxItems: 50
                  description: Batch mode (optional when using single mode)
                  items:
                    type: object
                    required:
                      - event_id
                      - market
                      - outcome
                    properties:
                      event_id:
                        type: string
                        description: Event ID from the events endpoint
                      market:
                        type: string
                        description: Market name (e.g. "Match Winner", "Over/Under 2.5")
                      outcome:
                        type: string
                        description: Selection label (e.g. "Home", "Over 2.5")
                      odds:
                        type: number
                        minimum: 1
                        description: >-
                          Optional — odds at time of bet, used to calculate
                          payout_multiplier. If provided, must be a decimal >=
                          1.
                      stake:
                        type: number
                        minimum: 0.01
                        description: >-
                          Optional — stake amount for payout calculation.
                          Currency-agnostic (any numeric amount).
                      market_id:
                        oneOf:
                          - type: integer
                          - type: string
                        description: >-
                          Primary — stable market identifier from /events or
                          /settlements. Guarantees 100% accuracy by matching on
                          ID instead of name.
                      selection_id:
                        oneOf:
                          - type: integer
                          - type: string
                        description: >-
                          Primary — stable selection identifier from /events or
                          /settlements. Guarantees 100% accuracy by matching on
                          ID instead of label.
                selection:
                  type: object
                  description: Single selection mode
                  required:
                    - event_id
                    - market
                    - outcome
                  properties:
                    event_id:
                      type: string
                    market:
                      type: string
                    outcome:
                      type: string
                    odds:
                      type: number
                      minimum: 1
                    stake:
                      type: number
                      minimum: 0.01
                    market_id:
                      oneOf:
                        - type: integer
                        - type: string
                    selection_id:
                      oneOf:
                        - type: integer
                        - type: string
                event_id:
                  type: string
                  description: Root-level single shortcut (requires market and outcome)
                market:
                  type: string
                outcome:
                  type: string
                odds:
                  type: number
                  minimum: 1
                stake:
                  type: number
                  minimum: 0.01
                market_id:
                  oneOf:
                    - type: integer
                    - type: string
                selection_id:
                  oneOf:
                    - type: integer
                    - type: string
            example:
              selections:
                - event_id: '87654321'
                  market: Match Winner
                  outcome: Home
                  odds: 1.85
                  stake: 10
                  market_id: 340168
                  selection_id: 1824650
                - event_id: '87654321'
                  market: Over/Under 2.5
                  outcome: Over 2.5
                  odds: 1.6
                  stake: 15
                - event_id: '87654322'
                  market: Match Winner
                  outcome: Away
                  odds: 3.2
                  stake: 5
      responses:
        '200':
          description: >-
            Automated resolution and payout calculations for the submitted
            single bets.
          content:
            application/json:
              schema:
                type: object
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      properties:
                        event_id:
                          type: string
                        market:
                          type: string
                        outcome:
                          type: string
                        result:
                          type: string
                          enum:
                            - won
                            - lost
                            - refund
                            - pending
                          description: >-
                            Settlement result. 'refund' = market nullified,
                            stake returned. 'pending' = not yet settled
                        event_status:
                          type: string
                          enum:
                            - live
                            - ended
                            - prematch
                            - postponed
                            - cancelled
                        score:
                          $ref: '#/components/schemas/Score'
                        matched_market:
                          type: string
                          description: >-
                            Actual market name matched (may differ from input).
                            Only present when a market was matched.
                        matched_market_id:
                          oneOf:
                            - type: integer
                            - type: string
                          nullable: true
                          description: >-
                            Unique market identifier of the matched market. Only
                            present when a market was matched (omitted when
                            result is 'pending').
                        matched_outcome:
                          type: string
                          description: >-
                            Actual outcome label matched. Only present when an
                            outcome was matched.
                        matched_selection_id:
                          oneOf:
                            - type: integer
                            - type: string
                          nullable: true
                          description: >-
                            Unique selection identifier of the matched outcome.
                            Only present when an outcome was matched (omitted
                            when result is 'pending').
                        available_markets:
                          type: array
                          items:
                            type: string
                          description: >-
                            List of settled market names for this event. Only
                            present when the requested market was not found.
                        available_outcomes:
                          type: array
                          items:
                            type: string
                          description: >-
                            List of outcome labels in the matched market. Only
                            present when the requested outcome was not found.
                        payout_multiplier:
                          type: number
                          description: >-
                            Multiply by stake for payout (0=lost, 1.0=refund,
                            odds=won)
                        odds:
                          type: number
                          description: >-
                            Echo of the odds value provided in the request. Only
                            present when odds was provided.
                        stake:
                          type: number
                          description: Echo of the stake amount provided in the request
                        payout:
                          type: number
                          description: >-
                            Calculated payout: stake × payout_multiplier
                            (rounded to 2dp). Only present when stake was
                            provided.
                        reason:
                          type: string
                          description: >-
                            Explanation when result is 'pending' (e.g. 'Event
                            not yet settled', 'Market not yet settled')
                  summary:
                    type: object
                    properties:
                      total:
                        type: integer
                      settled:
                        type: integer
                      won:
                        type: integer
                      lost:
                        type: integer
                      refunded:
                        type: integer
                      pending:
                        type: integer
              example:
                results:
                  - event_id: '87654321'
                    market: Match Winner
                    outcome: Home
                    odds: 1.85
                    stake: 10
                    result: won
                    event_status: ended
                    score:
                      home: 2
                      away: 1
                    matched_market: Match Winner
                    matched_market_id: 340168
                    matched_outcome: Home
                    matched_selection_id: 1824650
                    payout_multiplier: 1.85
                    payout: 18.5
                  - event_id: '87654321'
                    market: Over/Under 2.5
                    outcome: Over 2.5
                    odds: 1.6
                    stake: 15
                    result: won
                    event_status: ended
                    score:
                      home: 2
                      away: 1
                    matched_market: Over/Under 2.5
                    matched_market_id: 340172
                    matched_outcome: Over 2.5
                    matched_selection_id: 1824658
                    payout_multiplier: 1.6
                    payout: 24
                  - event_id: '87654322'
                    market: Match Winner
                    outcome: Away
                    odds: 3.2
                    stake: 5
                    result: pending
                    event_status: live
                    score:
                      home: 1
                      away: 1
                    reason: Event not yet settled
                summary:
                  total: 3
                  settled: 2
                  won: 2
                  lost: 0
                  refunded: 0
                  pending: 1
        '400':
          description: Invalid request body (including invalid `odds` when provided)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              examples:
                invalid_odds:
                  summary: Invalid odds in one selection
                  value:
                    error: bad_request
                    message: >-
                      Selection at index 0 has invalid 'odds'. Use a decimal
                      number >= 1 when provided.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  schemas:
    Score:
      type: object
      description: >-
        Home/away goals or points. A value of `0` is a valid score (for example,
        0-0) and is returned as numeric zero.
      properties:
        home:
          type: integer
          example: 2
        away:
          type: integer
          example: 1
    Error:
      type: object
      properties:
        error:
          type: string
          description: Error type
        message:
          type: string
          description: Human-readable error message
      example:
        error: not_found
        message: Event not found. For historical results, use /v1/settlements.
  responses:
    Unauthorized:
      description: Missing or invalid API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: unauthorized
            message: Invalid or missing API key. Visit docs.fieldfunded.com for access.
    RateLimited:
      description: Rate limit exceeded
      headers:
        Retry-After:
          description: Seconds until rate limit resets
          schema:
            type: integer
        X-RateLimit-Limit:
          schema:
            type: integer
        X-RateLimit-Remaining:
          schema:
            type: integer
        X-RateLimit-Reset:
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: rate_limited
            message: Rate limit exceeded. Upgrade your plan for higher limits.
    InternalServerError:
      description: |
        Internal server error. Something went wrong on our end.
        Usually transient — please retry after a short delay.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: server_error
            message: Internal server error
    ServiceUnavailable:
      description: >
        Backend data store temporarily unavailable. The `Retry-After` header
        indicates

        how many seconds to wait before retrying. The `component` field
        identifies

        which service is degraded (`realtime_data` for live odds/scores,
        `historical_data` for settlements).
      headers:
        Retry-After:
          description: Recommended wait time in seconds before retrying
          schema:
            type: integer
            example: 30
      content:
        application/json:
          schema:
            type: object
            properties:
              error:
                type: string
                example: service_unavailable
              message:
                type: string
                example: Data store temporarily unavailable
              component:
                type: string
                enum:
                  - realtime_data
                  - historical_data
                description: Which service is temporarily degraded
                example: realtime_data
          example:
            error: service_unavailable
            message: Data store temporarily unavailable
            component: realtime_data
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your FieldFunded API Key

````