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

# Market Discovery

> Discovers all known market types currently available, grouped by sport.
Samples active events to extract available market names and keys.
Useful for building market selectors, mapping market keys to display names, and understanding coverage.




## OpenAPI

````yaml GET /v1/markets
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/markets:
    get:
      tags:
        - Sports
      summary: Market Discovery — All available market types grouped by sport
      description: >
        Discovers all known market types currently available, grouped by sport.

        Samples active events to extract available market names and keys.

        Useful for building market selectors, mapping market keys to display
        names, and understanding coverage.
      operationId: getMarkets
      parameters:
        - name: sport
          in: query
          description: Filter markets by sport key
          schema:
            type: string
            example: soccer
      responses:
        '200':
          description: A catalog of supported betting market types, organized by sport.
          content:
            application/json:
              schema:
                type: object
                properties:
                  markets:
                    type: object
                    additionalProperties:
                      type: array
                      items:
                        type: object
                        properties:
                          key:
                            type: string
                            description: Normalized market key (lowercase, snake_case)
                            example: match_winner
                          name:
                            type: string
                            description: Display name of the market
                            example: Match Winner
                          outcomes_count:
                            type: integer
                            description: Number of outcomes in this market (e.g. 3 for 1X2)
                            example: 3
                  total_unique:
                    type: integer
                    description: Total number of unique market types found
              example:
                markets:
                  soccer:
                    - key: match_winner
                      name: Match Winner
                      outcomes_count: 3
                    - key: over_under_2_5
                      name: Over/Under 2.5
                      outcomes_count: 2
                    - key: both_teams_to_score
                      name: Both Teams to Score
                      outcomes_count: 2
                  basketball:
                    - key: match_winner
                      name: Match Winner
                      outcomes_count: 2
                    - key: total_points
                      name: Total Points
                      outcomes_count: 2
                total_unique: 200
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  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
  schemas:
    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.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: Your FieldFunded API Key

````