Skip to main content

Prediction Reference Data

Prediction Reference Data​

Prediction market instruments contain rich metadata from public/get-events and public/get-instruments response. This metadata enables partners to build flexible navigation hierarchies tailored to their application's needs.

Physical Instrument Hierarchy​

The physical data model consists of two levels:

Event (underlying game/match/tournament)
└─ Instrument (tradable contract)
  • Each Event groups related instruments under a common event_symbol. Event has metadata which allows you to extract League and Year information for higher level grouping, e.g. a Series.
  • Given an event_symbol, you can drill down for associated Instruments. Each Instrument represents a single tradable outcome with its own symbol and metadata.

You can try Prediction Instrument Hierarchy Explorer to visualise the instrument hierarchy.

Event​

An Event represents a real-world occurrence that can have tradable outcomes — such as a sports match, tournament, election, or other predictable event. Events are returned by public/get-events and serve as the grouping level for related instruments.

Sample Event Response​

{
"symbol": "FIFA-00001-260629-M",
"series_symbols": [],
"name": "Japan @ Brazil",
"description": "Japan @ Brazil",
"event_date": 1782766800000000000,
"last_updated_time": 1782443710514350000,
"event_details": {
"metaData": {
"NAME": "Japan @ Brazil",
"EVENT_DATE": "2026-06-29T17:00:00-04:00",
"SPORTS_GROUPING": "SOCCER"
},
"eventName": "Japan @ Brazil"
}
}

Key Event Fields​

FieldDescriptionExample
symbolUnique event identifier. The prefix indicates the league (e.g., FIFA, MLB, UFC). Use this to query instruments via public/get-instruments?event_symbol=..."FIFA-00001-260629-M"
event_details.metaData.SPORTS_GROUPINGSport category for grouping events. Specific to sports events."SOCCER", "MLB", "ESPORT", "MMA"
event_details.metaData.NAMEHuman-readable event name, typically in "Away @ Home" format for matches"Japan @ Brazil"
event_details.metaData.EVENT_DATEEvent start time in ISO 8601 format. Extract the year component for season-based grouping."2026-06-29T17:00:00-04:00"

Instrument​

An Instrument represents a single tradable option contract tied to a specific outcome of an event. Instruments are returned by public/get-instruments and contain rich metadata for building navigation hierarchies and displaying contract details.

Sample Instrument Response​

{
"id": -1,
"method": "public/get-instruments",
"code": 0,
"result": {
"data": [
{
"symbol": "NX.F.OPT.FIFA-00001-260714-M.O.1.67.20260830",
"inst_type": "BINARY_OPTION",
"display_name": "France vs Spain ; Spain (2-Way) ; AT&T Stadium ; 260714",
"base_ccy": "USD",
"quote_ccy": "USD",
"tradable": true,
"expiry_timestamp_ms": 1788127200000,
"underlying_symbol": "FIFA-00001-260714-M",
"event_details": {
"metaData": {
"NAME": "Spain @ France",
"VENUE": "AT&T Stadium",
"LEAGUE": "FIFA",
"EVENT_DATE": "2026-07-14T19:00:00+00:00",
"PARTICIPANT": "Spain",
"SPORTS_GROUPING": "SOCCER",
"AWAY_PARTICIPANT": "Spain",
"HOME_PARTICIPANT": "France",
"PREDICT_CATEGORY": "Sports",
"PREDICT_EVENT_TYPE": "Game",
"PREDICT_MARKET_TYPE": "Game Line",
"PREDICT_PERIOD_TYPE": "90 Minutes and Stoppage Time",
"PREDICT_OUTCOME_TYPE": "Away",
"PREDICT_CONTRACT_TYPE": "Moneyline (2-Way)"
},
"eventName": "Spain to win"
}
},
{
"symbol": "NX.F.OPT.FIFA-00001-260714-M.O.1.68.20260830",
"inst_type": "BINARY_OPTION",
"display_name": "France vs Spain ; France (2-Way) ; AT&T Stadium ; 260714",
"base_ccy": "USD",
"quote_ccy": "USD",
"tradable": true,
"expiry_timestamp_ms": 1788127200000,
"underlying_symbol": "FIFA-00001-260714-M",
"event_details": {
"metaData": {
"NAME": "Spain @ France",
"VENUE": "AT&T Stadium",
"LEAGUE": "FIFA",
"EVENT_DATE": "2026-07-14T19:00:00+00:00",
"PARTICIPANT": "France",
"SPORTS_GROUPING": "SOCCER",
"AWAY_PARTICIPANT": "Spain",
"HOME_PARTICIPANT": "France",
"PREDICT_CATEGORY": "Sports",
"PREDICT_EVENT_TYPE": "Game",
"PREDICT_MARKET_TYPE": "Game Line",
"PREDICT_PERIOD_TYPE": "90 Minutes and Stoppage Time",
"PREDICT_OUTCOME_TYPE": "Home",
"PREDICT_CONTRACT_TYPE": "Moneyline (2-Way)"
},
"eventName": "France to win"
}
}
]
}
}

Key Instrument Fields​

Use these metadata fields to build navigation hierarchies:

FieldDescriptionExample
event_details.metaData.PREDICT_CATEGORYTop-level category for all prediction markets"Sports", "Politics", "Culture"
event_details.metaData.SPORTS_GROUPINGSport category (for sports events)"SOCCER", "MLB", "ESPORT", "MMA"
event_details.metaData.LEAGUESpecific league within the sport"FIFA", "EPL", "UCL", "MLS"
event_details.metaData.EVENT_DATEEvent start time (ISO 8601). Extract year for season grouping."2026-07-14T19:00:00+00:00"
event_details.metaData.NAMEHuman-readable event name in "Away @ Home" format"Spain @ France"
event_details.metaData.PREDICT_CONTRACT_TYPEType of contract/market"Moneyline (2-Way)", "Spread", "Total Goals"
event_details.metaData.PREDICT_PERIOD_TYPETime period the contract covers"90 Minutes and Stoppage Time", "Full Game", "1st Half"

Example Hierarchy​

Using the fields above, you can, for example, build a three-level navigation hierarchy:

LevelFieldsExample
SeriesPREDICT_CATEGORY → SPORTS_GROUPING → LEAGUE → YEAR(EVENT_DATE)Sports > SOCCER > FIFA > 2026
EventNAME → PREDICT_CONTRACT_TYPE → PREDICT_PERIOD_TYPESpain @ France > Moneyline (2-Way) > 90 Minutes and Stoppage Time
ContractThe instrument record itselfNX.F.OPT.FIFA-00001-260714-M.O.1.67.20260830

Getting Continuous Updates​

Both public/get-events and public/get-instruments support pagination and incremental updates using since and cursor parameters.

Initial Load​

GET /dcm/v1/public/get-events?since=0
GET /dcm/v1/public/get-instruments?since=0

Use since=0 to fetch all available records from the beginning.

Pagination​

When results exceed the page limit, the response includes a next_cursor field. Use it to fetch the next page:

GET /dcm/v1/public/get-events?since=0&cursor={next_cursor}
GET /dcm/v1/public/get-instruments?since=0&cursor={next_cursor}

Continue paginating until no next_cursor is returned.

Incremental Updates​

After the initial load, use the last_updated_time from the most recent record as your since value to fetch only new or updated records:

GET /dcm/v1/public/get-events?since={last_updated_time}
GET /dcm/v1/public/get-instruments?since={last_updated_time}

This enables efficient polling for changes without re-fetching the entire dataset.

Example: Continuously Building a 3-Level Instrument Hierarchy​

This example demonstrates how to build and maintain a Series > Event > Contract hierarchy using REST polling with since and cursor parameters.

Goal:

  • Build a 3-level navigation hierarchy: Series → Event → Contract
  • Keep data up-to-date via continuous REST polling

Procedure:

  1. Initialize tracking variables:

    events_last_modified = 0
    instruments_last_modified = 0
  2. Fetch events with changes:

    GET /dcm/v1/public/get-events?since={events_last_modified}

    Paginate using cursor until all pages are retrieved.

  3. For each event, fetch associated instruments:

    GET /dcm/v1/public/get-instruments?event_symbol={symbol}&since={instruments_last_modified}

    This can be done in parallel for multiple events. Paginate each using cursor.

  4. Build the hierarchy from instrument metadata:

    • Series level: Group by PREDICT_CATEGORY → SPORTS_GROUPING → LEAGUE → YEAR(EVENT_DATE)
    • Event level: Group by NAME → PREDICT_CONTRACT_TYPE → PREDICT_PERIOD_TYPE
    • Contract level: Individual instrument records
  5. Update tracking variables: Record the maximum last_updated_time from events and instruments for the next polling cycle.

  6. Sleep and repeat: Wait for your desired polling interval, then return to step 2 with the updated since values.

This approach ensures you only fetch changed records on subsequent cycles, minimizing API calls and data transfer.

Full Meta Data Reference​

For the complete metadata specification, please refer to FIX Document Pack > Prediction Market Appendix for details.