curl --request GET \
--url https://api-uat.dimetrades.com/api/market-groups \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-uat.dimetrades.com/api/market-groups"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api-uat.dimetrades.com/api/market-groups', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-uat.dimetrades.com/api/market-groups",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-uat.dimetrades.com/api/market-groups"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-uat.dimetrades.com/api/market-groups")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-uat.dimetrades.com/api/market-groups")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"marketGroups": [
{
"id": 12,
"name": "Game Lines",
"subcategoryId": 7,
"displayOrder": 1,
"isActive": true,
"createdAt": "2026-08-06T17:41:00.000Z",
"updatedAt": "2026-08-06T17:41:00.000Z"
},
{
"id": 13,
"name": "Player Props",
"subcategoryId": 7,
"displayOrder": 2,
"isActive": true,
"createdAt": "2026-08-06T17:41:00.000Z",
"updatedAt": "2026-08-06T17:41:00.000Z"
}
],
"pagination": {
"count": 2,
"totalCount": 102,
"hasPreviousPage": false,
"hasNextPage": true
}
},
"errors": []
}{
"data": {},
"errors": {
"statusCode": 400,
"error": "RequestValidationError",
"message": "email must match format \"email\"",
"code": 1002,
"explanation": "The request input did not pass validation checks."
}
}{
"data": {},
"errors": {
"statusCode": 500,
"error": "InternalError",
"message": "Internal Server Error",
"code": 1003,
"explanation": "An unexpected error occurred on the server, Please try again later."
}
}List market groups
Returns the sport-scoped category/tab catalog that Market.marketGroupId
references — “Game Lines”, “Player Props”, “Correct Score”, and so on.
No user token required — send your X-API-Key only.
Without eventId, this is reference data, not per-request data: fetch it
once (or cache it), then join client-side by matching each market’s
marketGroupId against this list’s id, grouped further by
subcategoryId if you’re rendering one sport’s tabs at a time. Don’t call
it that way per market.
Pass eventId when rendering a single event’s detail page instead — it
restricts the list to groups that have at least one market for that
event. A group can be non-empty for the sport in general (some other
event has “Player Props” markets) while having zero markets for this
particular event, so the unscoped list can’t be used to render a single
event’s tabs without producing empty ones.
Only sports markets carry a non-null marketGroupId today — other
categories (Crypto, Financial, Climate, Commodities, Economics) don’t use
this grouping, so subcategoryId here always resolves to a sport.
page and limit are validated as integers here, not as strings of
digits the way GET /events expects them. Unknown parameters return 400.
curl --request GET \
--url https://api-uat.dimetrades.com/api/market-groups \
--header 'X-API-Key: <api-key>'import requests
url = "https://api-uat.dimetrades.com/api/market-groups"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api-uat.dimetrades.com/api/market-groups', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api-uat.dimetrades.com/api/market-groups",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api-uat.dimetrades.com/api/market-groups"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api-uat.dimetrades.com/api/market-groups")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api-uat.dimetrades.com/api/market-groups")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": {
"success": true,
"marketGroups": [
{
"id": 12,
"name": "Game Lines",
"subcategoryId": 7,
"displayOrder": 1,
"isActive": true,
"createdAt": "2026-08-06T17:41:00.000Z",
"updatedAt": "2026-08-06T17:41:00.000Z"
},
{
"id": 13,
"name": "Player Props",
"subcategoryId": 7,
"displayOrder": 2,
"isActive": true,
"createdAt": "2026-08-06T17:41:00.000Z",
"updatedAt": "2026-08-06T17:41:00.000Z"
}
],
"pagination": {
"count": 2,
"totalCount": 102,
"hasPreviousPage": false,
"hasNextPage": true
}
},
"errors": []
}{
"data": {},
"errors": {
"statusCode": 400,
"error": "RequestValidationError",
"message": "email must match format \"email\"",
"code": 1002,
"explanation": "The request input did not pass validation checks."
}
}{
"data": {},
"errors": {
"statusCode": 500,
"error": "InternalError",
"message": "Internal Server Error",
"code": 1003,
"explanation": "An unexpected error occurred on the server, Please try again later."
}
}Authorizations
ISV / partner credential — public half. Required on every request.
Identifies the integration partner (ISV) making the call. Issued by Dime
Trades when the ISV is onboarded and sent on every /partner/* endpoint:
X-API-Key: dt_pk_live_7f3c9a2e5b18
- On the two partner endpoints that create accounts or issue tokens (
POST /partner/customers,POST /partner/customers/login), it is accompanied byX-API-Secretand is the only authentication — there is no user token yet. - On every other partner endpoint it is sent alongside the user's
Authorization: Bearer <token>: the API key says which platform is calling, the bearer token says which user it is calling for.
Credentials are scoped to one or more brands; using a key with a brandId outside that scope returns 403. Staging and production keys are separate.
The key identifies your platform — treat it as a backend credential.
Query Parameters
Restrict to active (or inactive) groups. Omitted, both are returned — so check isActive before rendering a tab.
Restrict to one sport's groups. Accepts either a level-1 sport id (Basketball, Soccer) or a league id beneath it (MLB, La Liga).
Groups are stored against the sport, so a league id climbs to its parent and then returns only those of the sport's groups that the league's own events actually populate — e.g. Baseball has 9 groups, while KBO returns 6 and CPBL 2. That keeps a league's group bar free of tabs that would open onto nothing.
Omit to get every sport's groups across pages.
x >= 17
Restrict to groups that have at least one market for this specific event. Use this on the event detail page so empty tabs (groups with no markets for the event being viewed) are never returned.
x >= 15454
x >= 1x >= 1