curl --request GET \
--url https://v2.55-tech.com/futures/betslip \
--header 'x-api-key: <api-key>'import requests
url = "https://v2.55-tech.com/futures/betslip"
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://v2.55-tech.com/futures/betslip', 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://v2.55-tech.com/futures/betslip",
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://v2.55-tech.com/futures/betslip"
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://v2.55-tech.com/futures/betslip")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://v2.55-tech.com/futures/betslip")
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{
"futureId": "id1012639310001",
"futureOutcomeId": 0,
"participantId": 7193,
"client": "demo",
"userRef": null,
"futureInfo": {
"futureId": "id1012639310001",
"sportId": 10,
"seasonId": 126393,
"tournamentId": 17,
"statusId": 0,
"startTime": 1760000000,
"endTime": null
},
"outcomeInfo": null,
"odds": {
"polymarket": {
"id1012639310001:polymarket:0:7193": {
"price": 4.2,
"limit": 2500,
"limitMin": 1,
"limitCurrency": "USD",
"limitUsd": 2500,
"limitMinUsd": 1,
"active": true,
"account": "0xAe58B89E84a625C8D0b7E630f40Cb163fcA73F01",
"currencyInfo": {
"currency": "USD",
"currencyValue": 1,
"updatedAt": "2026-10-09T09:12:04+00:00"
},
"bookmakerFixtureId": null,
"bookmakerMarketId": "10001",
"bookmakerOutcomeId": "475604749945647560845331314831514336920894613040458588818765764150561104610",
"meta": null
}
}
}
}{
"detail": "futureOutcomeId 0 with participantId 0 names no selection"
}{
"detail": "SportId '10' not allowed"
}{
"detail": "No odds found for given parameters"
}{
"detail": "Futures betslip is not yet available. ABP implements the OddsPAPI db-v2 futures identifier scheme only, and the feed still publishes the current-state one, so futures ingest is disabled (ODDSPAPI_FUTURES_ENABLED=false) and nothing is cached. This endpoint answers 501 rather than an empty 200 that would read as 'no odds'. Futures identifiers ARE validated here: a malformed request is a 400/422 even today."
}Get live odds and betslip metadata for a future (not yet available)
Get current odds and metadata for a futures (outright) selection.
Provide futureId plus the selection:
- Participant-keyed markets (outright winner, topscorer, relegation, mvp) carry the sentinel
futureOutcomeId=0— the participant IS the selection, soparticipantIdmust be a real id. - Decomposed markets (prediction Yes/No, season totals Over/Under) carry a real
futureOutcomeId(>= 100001) and may leaveparticipantId=0.
There is no playerId on futures — participantId names a team or a player alike — and no period: a future resolves when its season does.
Fixtures live on GET /fixtures/betslip.
Feed-authoritative. Futures odds come from the OddsPAPI cache only — no bookmaker integration implements a futures betslip fetch, so verifyBetslip on an account has no effect here.
Limit cascade: account.minStake/maxStake > bookmaker.minStake/maxStake > odds.limitMin/limit — same as fixtures.
WebSocket integration: each poll registers (or refreshes) a 60-second subscription on the betslip channel for this selection, the snapshot is broadcast immediately, and deltas follow as prices change. Futures payloads carry futureId/futureOutcomeId/participantId instead of fixtureId/outcomeId/playerId.
Returns HTTP 501 today. ABP implements the OddsPAPI db-v2 futures identifier scheme only, and the feed still publishes the current-state one, so futures ingest is switched off and nothing is cached. This endpoint answers
501rather than an empty200that would read as “no odds” — and your request is validated first, so a malformedfutureId(a bare integer from the current feed is refused) or a selection pair that names nothing is still a400even today. The response shape below is what it serves the day futures turn on (expected late 2026-10).
curl --request GET \
--url https://v2.55-tech.com/futures/betslip \
--header 'x-api-key: <api-key>'import requests
url = "https://v2.55-tech.com/futures/betslip"
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://v2.55-tech.com/futures/betslip', 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://v2.55-tech.com/futures/betslip",
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://v2.55-tech.com/futures/betslip"
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://v2.55-tech.com/futures/betslip")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://v2.55-tech.com/futures/betslip")
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{
"futureId": "id1012639310001",
"futureOutcomeId": 0,
"participantId": 7193,
"client": "demo",
"userRef": null,
"futureInfo": {
"futureId": "id1012639310001",
"sportId": 10,
"seasonId": 126393,
"tournamentId": 17,
"statusId": 0,
"startTime": 1760000000,
"endTime": null
},
"outcomeInfo": null,
"odds": {
"polymarket": {
"id1012639310001:polymarket:0:7193": {
"price": 4.2,
"limit": 2500,
"limitMin": 1,
"limitCurrency": "USD",
"limitUsd": 2500,
"limitMinUsd": 1,
"active": true,
"account": "0xAe58B89E84a625C8D0b7E630f40Cb163fcA73F01",
"currencyInfo": {
"currency": "USD",
"currencyValue": 1,
"updatedAt": "2026-10-09T09:12:04+00:00"
},
"bookmakerFixtureId": null,
"bookmakerMarketId": "10001",
"bookmakerOutcomeId": "475604749945647560845331314831514336920894613040458588818765764150561104610",
"meta": null
}
}
}
}{
"detail": "futureOutcomeId 0 with participantId 0 names no selection"
}{
"detail": "SportId '10' not allowed"
}{
"detail": "No odds found for given parameters"
}{
"detail": "Futures betslip is not yet available. ABP implements the OddsPAPI db-v2 futures identifier scheme only, and the feed still publishes the current-state one, so futures ingest is disabled (ODDSPAPI_FUTURES_ENABLED=false) and nothing is cached. This endpoint answers 501 rather than an empty 200 that would read as 'no odds'. Futures identifiers ARE validated here: a malformed request is a 400/422 even today."
}Authorizations
API key for authentication. Contact contact@55-tech.com to obtain a key.
Query Parameters
Future identifier in OddsPAPI's db-v2 form (e.g., 'id1012639310001'). A bare-integer id from the current feed is refused with a 400.
0 (default) for a participant-keyed market where the participant IS the selection; a real id (>= 100001) for a decomposed market (Yes/No, Over/Under).
The team or player you back (participant-keyed), or the entity a line is about (decomposed). Required (non-zero) when futureOutcomeId is 0.
Comma-separated bookmaker slugs. If omitted, uses all the client's configured bookmakers.
Response
Current odds and betslip metadata for a future — the shape served once futures are enabled; today this endpoint answers 501
The betslip response for a futures selection. Same shape as BetslipResponse with the selection swapped: futureId / futureOutcomeId / participantId and futureInfo instead of fixtureId / outcomeId / playerId and fixtureInfo. There is no playerId and no playerInfo.
"id1012639310001"
0
7193
"demo"
Future details (season, tournament, status, start/end time).
Outcome details. null for a participant-keyed market, which has no outcome row.
Live odds keyed by bookmaker, then by oddsId. Treat the oddsId as opaque — store it, do not parse it.