Getting started
api4data gives you a clean client API to sync events and live markets. Call the endpoints in order so IDs stay linked correctly. Your server IP must be whitelisted before requests will work.
1 API call per second
across all REST APIs (Sport list, Tournament list, Event list, Market list, Market details, and Horse/Greyhound Racing).
https://api4data.com
https://socket.api4data.com
Sport list
GET every sport and store sportId.
Tournament list
POST to receive tournaments for those sports.
Event list
GET all events and store them in your system.
Market list
POST event id(s) to receive that event’s markets.
Market details
POST market id(s) to receive live market data.
Socket · marketRate
Listen for instant market updates on the socket.
Introduction
Follow these steps for a full integration.
Step 1 — Sport list
Call /api/client/sportList. You receive every sport
(sportId, sportName). Store these before loading tournaments.
Step 2 — Tournament list
Call /api/client/tournamentsList with
tournamentId, tournamentName, and sportId set to 1.
Each item includes
tournamentId, tournamentName, and sportId
from the Sport list.
Step 3 — Event list
Call /api/client/eventList. You receive the full event list.
Save it locally so you can map users / UI to stable event ids.
Step 4 — Market list
Call /api/client/marketList with one or more eventId values
from the Event list. Use page and limit for pagination
(limit max 200).
Step 5 — Market details
Call /api/client/marketPrice with marketId values from Market list
to get live market data for pricing / odds screens
(max 200 market ids per request).
Step 6 — Socket · marketRate
Connect to https://socket.api4data.com and listen on the
marketRate event. Whenever any market updates, you receive that
update instantly over the socket — no need to keep polling Market details.
API reference
All client endpoints below are under https://api4data.com.
Sport list
Returns every sport. Use sportId when you read the Tournament list.
https://api4data.com/api/client/sportList
| Key | Value |
|---|---|
Content-Type |
application/json |
None — this is a GET request.
| Field | Type | Description |
|---|---|---|
sportId |
number | Sport id. Example: 2 |
sportName |
string | Sport name. Example: Tennis |
curl -X GET "https://api4data.com/api/client/sportList" \ -H "Content-Type: application/json"
[
{
"sportId": 2,
"sportName": "Tennis"
}
]
Tournament list
Returns tournaments after the Sport list.
Each item includes tournamentId, tournamentName, and sportId.
https://api4data.com/api/client/tournamentsList
| Key | Value |
|---|---|
Content-Type |
application/json |
| Field | Type | Description |
|---|---|---|
tournamentId |
number | 1 to include tournament id in the result |
tournamentName |
number | 1 to include tournament name in the result |
sportId |
number | 1 to include sport id from Sport list |
{
"tournamentId": 1,
"tournamentName": "BCC World-Cup",
"sportId": 1
}
curl -X POST "https://api4data.com/api/client/tournamentsList" \
-H "Content-Type: application/json" \
-d '{"tournamentId":1,"tournamentName":"BCC World-Cup","sportId":1}'
[
{
"tournamentId": 1,
"tournamentName": "BCC World-Cup",
"sportId": 1
}
]
Event list
Returns every available event. Use this as your source of truth for event ids.
https://api4data.com/api/client/eventList
| Key | Value |
|---|---|
Content-Type |
application/json |
None — this is a GET request.
curl -X GET "https://api4data.com/api/client/eventList" \ -H "Content-Type: application/json"
{
"message": "event list successful",
"data": [
{
"_id": "69d8dec3e7cb6a418659eb4d",
"eventId": "35303651",
"marketId": "1.988253031",
"exEventId": "b26c4f948b14bca4174b194d707ef7f9",
"sportId": "6",
"tournamentsId": "1576402161",
"tournamentsName": "Boxing Matches",
"eventName": "Floyd Mayweather Jr v Manny Pacquiao",
"highlight": false,
"quicklink": false,
"popular": false,
"IsSettle": 0,
"IsVoid": 0,
"IsUnsettle": 1,
"dataSwitch": 0,
"createdAt": "2026-04-10T11:28:03.576Z",
"marketTime": "2026-09-20T03:30:00.000Z"
}
]
}
Market list
Returns markets for the event id(s) you pass. Pass ids you stored from the Event list response.
https://api4data.com/api/client/marketList
| Key | Value |
|---|---|
Content-Type |
application/json |
| Field | Type | Description |
|---|---|---|
eventId required |
string[] | Event ids from Event list API. Example: ["35303651"] |
page required |
integer | Page number starting from 1 |
limit required |
integer | Records per page. Maximum 200. Example: 10 |
{
"eventId": ["35303651"],
"page": 1,
"limit": 10
}
curl -X POST "https://api4data.com/api/client/marketList" \
-H "Content-Type: application/json" \
-d '{"eventId":["35303651"],"page":1,"limit":10}'
{
"message": "market list successful",
"data": {
"page": 1,
"limit": 10,
"totalPages": 1,
"totalResults": 1,
"results": [
{
"_id": "69d8df366435c37dc070f4f6",
"eventName": "Floyd Mayweather Jr v Manny Pacquiao",
"marketId": "1.988253031",
"exEventId": "b26c4f948b14bca4174b194d707ef7f9",
"exMarketId": "a26c25ae28270df1b4e9a5fcbec85839",
"isPreBet": false,
"marketName": "Match Odds",
"marketTime": "2026-09-20T03:30:00.000Z",
"sportName": "Boxing",
"tournamentsName": "Boxing Matches",
"type": "match_odds"
}
]
}
}
Market details
Returns live market data for one or more market ids. Use market ids from the Market list response.
https://api4data.com/api/client/marketPrice
| Key | Value |
|---|---|
Content-Type |
application/json |
| Field | Type | Description |
|---|---|---|
marketId required |
string[] | Use exMarketId values from Market list. Max 200 ids per request. Example: ["a26c25ae28270df1b4e9a5fcbec85839"] |
{
"marketId": ["a26c25ae28270df1b4e9a5fcbec85839"]
}
curl -X POST "https://api4data.com/api/client/marketPrice" \
-H "Content-Type: application/json" \
-d '{"marketId":["a26c25ae28270df1b4e9a5fcbec85839"]}'
{
"message": "market list successful",
"data": [
{
"_id": "69d8df366435c37dc070f4f6",
"marketId": "1.988253031",
"exMarketId": "a26c25ae28270df1b4e9a5fcbec85839",
"marketName": "Match Odds",
"marketTime": "2026-09-20T03:30:00.000Z",
"runners": [
{
"selectionId": 3861213,
"handicap": 0,
"description": {
"runnerName": "Floyd Mayweather Jr",
"metadata": {
"runnerId": "3861213"
}
},
"state": {
"sortPriority": 1,
"lastPriceTraded": 1.63,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 1.55,
"size": 42.71
},
{
"price": 1.54,
"size": 133.45
}
],
"availableToLay": [
{
"price": 1.66,
"size": 78.12
},
{
"price": 1.67,
"size": 24.78
}
]
}
},
{
"selectionId": 2364143,
"handicap": 0,
"description": {
"runnerName": "Manny Pacquiao",
"metadata": {
"runnerId": "2364143"
}
},
"state": {
"sortPriority": 2,
"lastPriceTraded": 3,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 3.1,
"size": 19.2
},
{
"price": 2.86,
"size": 38.94
}
],
"availableToLay": [
{
"price": 3.3,
"size": 70.61
},
{
"price": 3.6,
"size": 10.89
}
]
}
},
{
"selectionId": 31162,
"handicap": 0,
"description": {
"runnerName": "Draw",
"metadata": {
"runnerId": "31162"
}
},
"state": {
"sortPriority": 3,
"lastPriceTraded": 17,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 11,
"size": 25.53
},
{
"price": 9,
"size": 15.23
}
],
"availableToLay": [
{
"price": 20,
"size": 21.63
},
{
"price": 22,
"size": 14.78
}
]
}
}
],
"state": {
"betDelay": 0,
"bspReconciled": false,
"complete": true,
"inplay": false,
"numberOfWinners": 1,
"numberOfRunners": 3,
"numberOfActiveRunners": 3,
"lastMatchTime": "2026-04-09T18:39:46.195Z",
"totalMatched": 1013.0356673161865,
"totalAvailable": 1850.9237527197595,
"crossMatching": true,
"runnersVoidable": false,
"version": 7270738430,
"betDelayModels": [],
"status": "SUSPENDED"
},
"type": "match_odds"
}
]
}
Socket · marketRate
Connect to the live socket and listen for the marketRate event.
Any market update is pushed to you instantly — use this after you have loaded
markets via the REST APIs.
https://socket.api4data.com
| Event name | Description |
|---|---|
marketRate listen |
Fired whenever a market rate / price updates. Payload contains the latest market update so your UI can refresh instantly. |
1. Connect your client to https://socket.api4data.com.
2. Subscribe / listen on the marketRate event.
3. On every market change, the socket emits marketRate with the update payload.
4. Apply that payload in your app immediately (no extra REST poll needed for live rates).
import { io } from "socket.io-client";
const socket = io("https://socket.api4data.com");
socket.on("connect", () => {
console.log("connected", socket.id);
});
socket.on("marketRate", (data) => {
// Instant market update — refresh rates in your UI
console.log("marketRate update", data);
});
socket.on("disconnect", () => {
console.log("disconnected");
});
marketRate payloadLive push payload shape matches market details (rates update instantly on this event).
{
"_id": "69d8df366435c37dc070f4f6",
"marketId": "1.988253031",
"exMarketId": "a26c25ae28270df1b4e9a5fcbec85839",
"marketName": "Match Odds",
"marketTime": "2026-09-20T03:30:00.000Z",
"runners": [
{
"selectionId": 3861213,
"handicap": 0,
"description": {
"runnerName": "Floyd Mayweather Jr",
"metadata": {
"runnerId": "3861213"
}
},
"state": {
"sortPriority": 1,
"lastPriceTraded": 1.63,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 1.55,
"size": 42.71
},
{
"price": 1.54,
"size": 133.45
}
],
"availableToLay": [
{
"price": 1.66,
"size": 78.12
},
{
"price": 1.67,
"size": 24.78
}
]
}
},
{
"selectionId": 2364143,
"handicap": 0,
"description": {
"runnerName": "Manny Pacquiao",
"metadata": {
"runnerId": "2364143"
}
},
"state": {
"sortPriority": 2,
"lastPriceTraded": 3,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 3.1,
"size": 19.2
},
{
"price": 2.86,
"size": 38.94
}
],
"availableToLay": [
{
"price": 3.3,
"size": 70.61
},
{
"price": 3.6,
"size": 10.89
}
]
}
},
{
"selectionId": 31162,
"handicap": 0,
"description": {
"runnerName": "Draw",
"metadata": {
"runnerId": "31162"
}
},
"state": {
"sortPriority": 3,
"lastPriceTraded": 17,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{
"price": 11,
"size": 25.53
},
{
"price": 9,
"size": 15.23
}
],
"availableToLay": [
{
"price": 20,
"size": 21.63
},
{
"price": 22,
"size": 14.78
}
]
}
}
],
"state": {
"betDelay": 0,
"bspReconciled": false,
"complete": true,
"inplay": false,
"numberOfWinners": 1,
"numberOfRunners": 3,
"numberOfActiveRunners": 3,
"lastMatchTime": "2026-04-09T18:39:46.195Z",
"totalMatched": 1013.0356673161865,
"totalAvailable": 1850.9237527197595,
"crossMatching": true,
"runnersVoidable": false,
"version": 7270738430,
"betDelayModels": [],
"status": "SUSPENDED"
},
"type": "match_odds"
}
marketPrice) for the initial snapshot, then keep the socket
open and apply marketRate events for live updates.
Horse/Greyhound Racing
Horse racing and greyhound use their own market list, market details, and socket.
Do not load these markets from Sport list, Event list, or socket.api4data.com.
https://api4data.com
https://hr-socket.api4data.com
Market list
POST hr-ghMarketList and store exMarketId.
Market details
POST those ids to hr-ghMarketPrice for runners and prices.
Socket · HrGhMarketRate
Listen on hr-socket.api4data.com for live updates.
Market list
Returns horse racing and greyhound markets for the eventId you pass.
Use page and limit to page through the list, then pass
each exMarketId to Market details.
https://api4data.com/api/client/hr-ghMarketList
| Key | Value |
|---|---|
Content-Type |
application/json |
| Field | Type | Description |
|---|---|---|
eventId required |
string[] | Event ids for the meeting. Example: ["36192571"] |
page required |
integer | Page number starting from 1 |
limit required |
integer | Records per page. Maximum 200. Example: 10 |
{
"eventId": ["36192571"],
"page": 1,
"limit": 10
}
curl -X POST "https://api4data.com/api/client/hr-ghMarketList" \
-H "Content-Type: application/json" \
-d '{"eventId":["36192571"],"page":1,"limit":10}'
This page is Delta Downs (US), 15 Oct. sportName is Horse Racing. Greyhound meetings use the same shape with their own sportName.
{
"message": "market list successful",
"data": {
"page": 1,
"limit": 10,
"totalPages": 1,
"totalResults": 8,
"results": [
{
"_id": "6ad01c9d9bbd298505ca1b86",
"marketId": "1.263881649",
"eventName": "Delta Downs (US) 15th Oct",
"exEventId": "5362b1a439517bd6c880694e0b7a532c",
"exMarketId": "f05a722b212771f47cdb8afa1718a582",
"isPreBet": false,
"marketName": "R1 1m1f Claim",
"marketTime": "2026-10-15T21:40:00.000Z",
"sportName": "Horse Racing",
"tournamentsName": "USA",
"type": "match_odds"
},
{
"_id": "6ad01ca09bbd298505ca1b8b",
"marketId": "1.263881652",
"eventName": "Delta Downs (US) 15th Oct",
"exEventId": "5362b1a439517bd6c880694e0b7a532c",
"exMarketId": "be9c5815fd281da49c9c7cae097454bd",
"isPreBet": false,
"marketName": "R2 5f Allw",
"marketTime": "2026-10-15T22:08:00.000Z",
"sportName": "Horse Racing",
"tournamentsName": "USA",
"type": "match_odds"
}
]
}
}
The live page also included R3 through R8 (totalResults 8). Each race is one result with its own marketId, exMarketId, marketName, and marketTime.
Market details
Returns runners, silks, and live back prices for one or more racing markets.
Pass exMarketId values from Market list.
https://api4data.com/api/client/hr-ghMarketPrice
| Key | Value |
|---|---|
Content-Type |
application/json |
| Field | Type | Description |
|---|---|---|
marketId required |
string[] | Use exMarketId values from Market list. Max 200 ids per request. Example: ["11a2d195b517029215dd08d9c8cd8a7b"] |
{
"marketId": ["11a2d195b517029215dd08d9c8cd8a7b"]
}
curl -X POST "https://api4data.com/api/client/hr-ghMarketPrice" \
-H "Content-Type: application/json" \
-d '{"marketId":["11a2d195b517029215dd08d9c8cd8a7b"]}'
Each runner’s description.metadata carries the card details. Greyhound runners often only include runnerId.
| Field | Description |
|---|---|
CLOTH_NUMBER |
Saddle cloth number. CLOTH_NUMBER_ALPHA is the same value as text. |
JOCKEY_NAME |
Jockey. JOCKEY_CLAIM is the claim in pounds. |
TRAINER_NAME |
Trainer. OWNER_NAME is the owner. |
AGE / SEX_TYPE / COLOUR_TYPE |
Age, sex, and colour. Example sex: F. Example colour: B, CH, DK B/. |
WEIGHT_VALUE |
Weight. Units are in WEIGHT_UNITS (example: pounds). |
STALL_DRAW |
Barrier / stall. |
FORM |
Recent form string. Example: 740. |
SIRE_NAME / DAM_NAME / DAMSIRE_NAME |
Sire, dam, and damsire. |
DAYS_SINCE_LAST_RUN |
Days since the horse last raced. |
FORECASTPRICE_NUMERATOR / FORECASTPRICE_DENOMINATOR |
Forecast price as a fraction. Example: 46 / 5. |
COLOURS_DESCRIPTION |
Silk description. Image URL is COLOURS_FILENAME_URL. |
WEARING |
Optional tack code. Example: O. |
state.adjustmentFactor |
Runner adjustment factor. state.status is ACTIVE while the runner is in the market. |
Delta Downs R8, R8 7f Mdn Claim. The live payload had 11 runners. Two are shown here; the rest use the same shape. Back prices are in exchange.availableToBack.
{
"message": "market list successful",
"data": [
{
"_id": "6ad01cab9bbd298505ca1b9a",
"marketId": "1.263881658",
"exMarketId": "11a2d195b517029215dd08d9c8cd8a7b",
"marketName": "R8 7f Mdn Claim",
"marketTime": "2026-10-16T00:56:00.000Z",
"runners": [
{
"selectionId": 13318275,
"handicap": 0,
"description": {
"runnerName": "Lady Ella",
"metadata": {
"CLOTH_NUMBER_ALPHA": "1",
"SIRE_NAME": "Mo Tom",
"COLOURS_DESCRIPTION": "Blue, Blue 'L' in White Ball, White Sleeves",
"COLOURS_FILENAME": "data:image/png;base64,",
"FORECASTPRICE_DENOMINATOR": "5",
"DAMSIRE_NAME": "Daring Bid",
"WEIGHT_VALUE": "119.0",
"SEX_TYPE": "F",
"DAYS_SINCE_LAST_RUN": "47",
"OWNER_NAME": "Lane Michael LeBlanc, Richard Paul LeBlanc and Chistopher Leblanc",
"JOCKEY_NAME": "Casey Fusilier",
"runnerId": "13318275",
"CLOTH_NUMBER": "1",
"TRAINER_NAME": "Allen Landry",
"COLOUR_TYPE": "B",
"AGE": "3",
"JOCKEY_CLAIM": "0",
"FORM": "740",
"FORECASTPRICE_NUMERATOR": "46",
"COLOURS_FILENAME_URL": "https://content.betfair.com/cdn-cgi/image/fit=scale-down,width=96,q=90/feeds_images/Horses/SilkColours/c20261015xdd/20261015xdd015601.png",
"DAM_NAME": "Angel's Lil Baby",
"STALL_DRAW": "1",
"WEIGHT_UNITS": "pounds"
}
},
"state": {
"adjustmentFactor": 10.84,
"sortPriority": 1,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{ "price": 1.15, "size": 66.15 },
{ "price": 1.02, "size": 61.42 },
{ "price": 1.01, "size": 1374.81 }
]
}
},
{
"selectionId": 92243248,
"handicap": 0,
"description": {
"runnerName": "Meaner Than Mean",
"metadata": {
"CLOTH_NUMBER": "5",
"JOCKEY_NAME": "Misael Alvarez",
"JOCKEY_CLAIM": "5",
"TRAINER_NAME": "Benjamin Zeno",
"FORM": "75903503",
"STALL_DRAW": "5",
"WEARING": "O",
"runnerId": "92243248"
}
},
"state": {
"adjustmentFactor": 3.347,
"sortPriority": 5,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{ "price": 1.15, "size": 66.15 },
{ "price": 1.02, "size": 61.42 },
{ "price": 1.01, "size": 1374.81 }
]
}
}
],
"state": {
"betDelay": 0,
"bspReconciled": false,
"complete": true,
"inplay": false,
"numberOfWinners": 1,
"numberOfRunners": 11,
"numberOfActiveRunners": 11,
"totalMatched": 0,
"totalAvailable": 16526.149666968387,
"crossMatching": false,
"runnersVoidable": false,
"version": 7691166552,
"betDelayModels": [],
"status": "OPEN"
},
"type": "match_odds"
}
]
}
Socket · HrGhMarketRate
Connect to the racing socket and listen for HrGhMarketRate.
Horse racing and greyhound updates are pushed here. The main
socket.api4data.com feed does not carry these markets.
https://hr-socket.api4data.com
| Event name | Description |
|---|---|
HrGhMarketRate listen |
Fired when a horse racing or greyhound market updates.
The payload is wrapped: market fields sit on value, keyed by exMarketId.
|
| Field | Description |
|---|---|
exMarketId |
Market id. Same value as value.exMarketId and the id you sent to Market details. |
key |
Market document id. Same as _id from Market list. |
sportId |
Sport id. Example: 4339 for greyhound. |
type |
Market type. Example: match_odds. |
value |
Full market. Includes eventName, marketName, marketTime,
runners (back and lay), runnerData (selection id to display name),
state, sportName, and tournamentsName.
|
value.IsSettle / IsUnsettle / IsVoid |
Settlement flags. 0 or 1. |
1. Load markets with hr-ghMarketList and the snapshot with hr-ghMarketPrice.
2. Connect your client to https://hr-socket.api4data.com.
3. Listen on the HrGhMarketRate event.
4. On each push, read value and refresh that exMarketId in your UI.
import { io } from "socket.io-client";
const socket = io("https://hr-socket.api4data.com");
socket.on("connect", () => {
console.log("connected", socket.id);
});
socket.on("HrGhMarketRate", (data) => {
// data.exMarketId identifies the race
// data.value is the latest market, including runners
console.log("HrGhMarketRate update", data.exMarketId, data.value);
});
socket.on("disconnect", () => {
console.log("disconnected");
});
HrGhMarketRate payloadSheffield greyhound, D5 280m. The live payload had 6 runners. Two are shown here. Horse racing pushes use this same wrapper.
{
"exMarketId": "c712229550fbee10de92da7d48cedc7c",
"value": {
"marketId": "1.263902385",
"IsSettle": 0,
"IsUnsettle": 1,
"IsVoid": 0,
"betLimit": null,
"eventCode": "0S96E7UE",
"eventId": "36192571",
"eventName": "Sheffield 15th Oct",
"exEventId": "fa5604dc163c22490c5557482b45934f",
"exMarketId": "c712229550fbee10de92da7d48cedc7c",
"iconUrl": "https://d2ph3vk1qazzk.cloudfront.net/icons/menu-greygound-racing.png",
"isMarketDataDelayed": true,
"isMarketDataVirtual": true,
"isPreBet": false,
"isUnmatch": false,
"marketName": "D5 280m",
"marketTime": "2026-10-15T10:36:00.000Z",
"runnerData": {
"81034933": "1. Anglesey Herring",
"101110284": "2. Lexis Dunganon",
"103899792": "3. Cloondarone Luna",
"81903943": "4. Anglesey Tesia",
"70985307": "5. Moanteen Cobra",
"101561858": "6. Cloondarone Sham"
},
"runners": [
{
"selectionId": 81034933,
"handicap": 0,
"description": {
"runnerName": "1. Anglesey Herring",
"metadata": { "runnerId": "81034933" }
},
"state": {
"sortPriority": 1,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{ "price": 1.65, "size": 27.93 },
{ "price": 1.22, "size": 13.9 },
{ "price": 1.21, "size": 66.2 }
],
"availableToLay": [
{ "price": 230, "size": 13.38 },
{ "price": 360, "size": 2.65 }
]
}
},
{
"selectionId": 101110284,
"handicap": 0,
"description": {
"runnerName": "2. Lexis Dunganon",
"metadata": { "runnerId": "101110284" }
},
"state": {
"sortPriority": 2,
"totalMatched": 0,
"status": "ACTIVE"
},
"exchange": {
"availableToBack": [
{ "price": 1.61, "size": 23.62 },
{ "price": 1.22, "size": 13.9 },
{ "price": 1.21, "size": 66.2 }
],
"availableToLay": [
{ "price": 230, "size": 13.38 },
{ "price": 380, "size": 2.65 }
]
}
}
],
"sportName": "Greyhound Racing",
"sportsId": "4339",
"spreadexId": null,
"state": {
"betDelay": 0,
"bspReconciled": false,
"complete": true,
"inplay": false,
"numberOfWinners": 1,
"numberOfRunners": 6,
"numberOfActiveRunners": 6,
"totalMatched": 0,
"totalAvailable": 23971.909488738904,
"crossMatching": true,
"runnersVoidable": false,
"version": 7690830897,
"betDelayModels": [],
"status": "OPEN"
},
"tournamentsId": "1575853196",
"tournamentsName": "PGR",
"type": "match_odds"
},
"key": "6ad06e489bbd298505ca5ab9",
"sportId": "4339",
"type": "match_odds"
}
hr-ghMarketPrice for the first snapshot, then keep
https://hr-socket.api4data.com open and apply HrGhMarketRate
from value. This socket is separate from https://socket.api4data.com.
Integration notes
Recommended order: Sport list → Tournament list → Event list → Market list → Market details → Socket marketRate.
Batching: eventId and marketId accept arrays, so you can request multiple ids in one call.
Max limit: Market list limit and Market details marketId array both support a maximum of 200 per request.
Rate limit: maximum 1 API call per second across all REST APIs.
Pagination: for large market lists, increase page while keeping the same limit (max 200).
Horse racing and greyhound: hr-ghMarketList → hr-ghMarketPrice → HrGhMarketRate on https://hr-socket.api4data.com. Do not use the main event list or socket.api4data.com for these markets.
Live updates: listen on marketRate at https://socket.api4data.com. Horse racing and greyhound listen on HrGhMarketRate at https://hr-socket.api4data.com.
Content type: send and expect application/json on REST calls.