Skip to main content
Loading market data…
SoccerverseSoccerverse

Datacentre REST API

The Soccerverse Datacentre REST API: read endpoints for clubs, players, users, market, fixtures, transfers, news and leaderboards, with request examples.

Base URL and access

  • Public base URL: https://services.soccerverse.com/api
  • Live OpenAPI source: GET /openapi.json
  • All documented routes are GET.
  • Some protected/test environments require a Cloudflare bypass header. Use the placeholder only; never commit or print the value:
-H "x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET"

Common response and money notes

  • Paged endpoints generally return { page, per_page, total, total_pages, items }.
  • Some data endpoints return raw arrays; dump endpoints often return { meta, data } or a file download.
  • Money/SVC values from REST/MySQL are raw scaled integers unless the endpoint explicitly says otherwise. Divide raw money fields by 10000 to present SVC. Example: 1234567 raw = 123.4567 SVC. Do not divide fields that are already documented as USD, USDC, percentages, counts, ratings, ages, timestamps, or prices from a dump that explicitly says it is converted.
  • Array filters are accepted as query parameters by FastAPI; examples here use one value, e.g. club_id=50, player_id=1100, names=snailbrain.

Quick start

# Health check
curl -sS \
  -H "x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET" \
  "https://services.soccerverse.com/api/healthz" | jq .

# Club lookup using the sample club_id
curl -sS \
  -H "x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET" \
  "https://services.soccerverse.com/api/clubs?club_id=50&per_page=5" | jq .items[0]

# Player lookup using the sample player_id
curl -sS \
  -H "x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET" \
  "https://services.soccerverse.com/api/players?player_id=1100&per_page=5" | jq .items[0]

# User lookup using the sample username
curl -sS \
  -H "x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET" \
  "https://services.soccerverse.com/api/users/detailed?names=snailbrain&per_page=5" | jq .items[0]

System

Operational health of the public Datacentre app.

MethodPathPurposeMain query/path parameters
GET/healthzHealth CheckNone

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/healthz' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/healthz", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Do not document or expose /metrics; it is intentionally excluded from the public app.

Clubs

Club market, detailed club records, job postings and weekly club balance sheets.

MethodPathPurposeMain query/path parameters
GET/clubsRetrieve influence market data for clubspage integer default 1
per_page PerPageOptions default 20
sort_by ClubsSortBy
sort_order string default asc
club_id array[integer]
country_id string
owned string
manager_locked integer
balance_min integer
balance_max integer
GET/clubs/detailedRetrieve detailed data for clubspage integer default 1
per_page PerPageOptions default 20
sort_by ClubsSortBy
sort_order string default asc
club_id array[integer]
country_id string
owned string
manager_locked integer
available integer
league_id integer
division integer
has_job_posting integer
balance_min integer
balance_max integer
division_start_min integer
division_start_max integer
fans_start_min integer
fans_start_max integer
fans_current_min integer
fans_current_max integer
stadium_size_start_min integer
stadium_size_start_max integer
stadium_size_current_min integer
stadium_size_current_max integer
stadium_id_min integer
stadium_id_max integer
value_min integer
value_max integer
rating_start_min integer
rating_start_max integer
default_formation_min integer
default_formation_max integer
penalty_taker_min integer
penalty_taker_max integer
transfers_in_min integer
transfers_in_max integer
transfers_out_min integer
transfers_out_max integer
GET/clubs/{club_id}/jobRetrieve job posting details for a specific clubclub_id (required) integer
GET/club_balance_sheet/weeksGet club balance sheet entries by game weekclub_id (required) integer
season_id (required) integer

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/clubs?club_id=50&per_page=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/clubs?club_id=50&per_page=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.
  • /clubs/{club_id}/job returns 404 when the club has no public job posting; that is a valid no-job result, not proof the route is broken.

Players

Player search/detail, historical transfers/loans/morale and combined player history.

MethodPathPurposeMain query/path parameters
GET/playersRetrieve list of soccer playerspage integer default 1
per_page PerPageOptions default 20
sort_by PlayersSortBy
sort_order string default asc
age_min integer
age_max integer
age integer
player_id array[integer]
wages_min integer
wages_max integer
rating_min integer
rating_max integer
value_min integer
value_max integer
country_id string
owned string
positions string
club_id integer
allow_transfer integer
allow_renew integer
GET/players/detailedRetrieve detailed soccer player datapage integer default 1
per_page PerPageOptions default 20
sort_by PlayersSortBy
sort_order string default asc
age_min integer
age_max integer
age integer
player_id array[integer]
wages_min integer
wages_max integer
contract_min integer
contract_max integer
rating_min integer
rating_max integer
rating_gk_min integer
rating_gk_max integer
rating_tackling_min integer
rating_tackling_max integer
rating_passing_min integer
rating_passing_max integer
rating_shooting_min integer
rating_shooting_max integer
rating_aggression_min integer
rating_aggression_max integer
rating_stamina_min integer
rating_stamina_max integer
value_min integer
value_max integer
desired_contract_min integer
desired_contract_max integer
country_id string
owned string
positions string
club_id integer
include_loaned boolean default False
allow_transfer integer
allow_renew integer
fitness integer
retired integer
morale integer
injured integer
injury_id integer
position integer
multi_position integer
ability_gk integer
ability_tackling integer
ability_passing integer
ability_shooting integer
banned integer
cup_tied integer
yellow_cards integer
red_cards integer
agent_name string
loan_offered string
loan_offer_accepted string
loaned_to_club string
GET/player/history/{player_id}Retrieve player historyplayer_id (required) integer
GET/players/morale_history/{player_id}Get morale change history for a playerplayer_id (required) integer
limit integer default 10
GET/player/transfer_historyRetrieve transfer historyseason_id integer
club_id integer
player_id integer
GET/players/loan_historyRetrieve loan historyseason_id integer
club_id integer

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/players?player_id=1100&per_page=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/players?player_id=1100&per_page=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.

Users/profile

User lookup, profile/trading details, achievements and balance-sheet/earnings views.

MethodPathPurposeMain query/path parameters
GET/usersGet user list and basic datapage integer default 1
per_page PerPageOptions default 20
sort_by UsersSortBy
sort_order string default asc
name_prefix string
names array[string]
GET/users/detailedGet detailed user and trading datapage integer default 1
per_page PerPageOptions default 20
sort_by UsersDetailedSortBy
sort_order string default asc
name_prefix string
names array[string]
buy_volume_min integer
buy_volume_max integer
sell_volume_min integer
sell_volume_max integer
total_volume_min integer
total_volume_max integer
GET/achievementsGet user achievements statususername (required) string
GET/user_activityGet user activity statsname string
GET/user_balance_sheetGet user balance sheet entriespage integer default 1
per_page PerPageOptionsExtended default 50
name (required) string
from_time integer
to_time integer
GET/user_balance_sheet/earningsGet aggregated SVC earningsname (required) string
GET/user_balance_sheet/weeksGet weekly aggregated user balance sheetspage integer default 1
per_page integer default 10
name (required) string

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/users/detailed?names=snailbrain&per_page=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/users/detailed?names=snailbrain&per_page=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.

Reference/leagues/countries

Reference country/league data and current league-table snapshots.

MethodPathPurposeMain query/path parameters
GET/countriesRetrieve data for countriessort_by CountriesSortBy
sort_order string default desc
country_id string
GET/leaguesRetrieve data for leagues (with 5-min cache)page integer default 1
per_page PerPageOptions default 20
sort_by LeaguesSortBy
sort_order string default asc
country_id string
division integer
league_id integer
season_id integer
GET/league_tablesGet league table standingsleague_id integer
country_id string
division integer
season_id integer
GET/dumps/leaguesAll national leagues for the current seasonNone
GET/dumps/league_tablesLeague tables for all divisions, optionally filtered to Division 1 by countrycountry_ids array[string]

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/countries?country_id=ENG' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/countries?country_id=ENG", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • League IDs are season-specific; prefer country_id + division + season_id when linking historical data.

Market/trading

Market overview, account/share balances, recent trades, leader/rich lists and trading graphs.

MethodPathPurposeMain query/path parameters
GET/marketObtain overall market metricsNone
GET/tickerGet ticker dataNone
GET/rich_listRetrieve the richest userspage integer default 1
per_page PerPageOptions default 20
name string
sort_by RichListSortBy default total_networth
sort_order string default desc
GET/best_managersGet best managers datapage integer default 1
per_page PerPageOptions default 20
sort_by BestManagersSortBy default rank_a_ranking
sort_order string default asc
name string
GET/share/transactionsRetrieve share transactions for a username (required) string
GET/share_balance_by_user_clubGet share balance for a specific user and clubname (required) string
club_id (required) integer
GET/share_balancesRetrieve influence balancespage integer default 1
per_page PerPageOptions default 20
sort_by ShareBalancesSortBy
sort_order string default asc
club_id integer
player_id integer
name string
share_type string
countries boolean default False
leagues boolean default False
country_id string
league_id integer
has_manager boolean
has_agent boolean
manager_last_active_unix_min integer
manager_last_active_unix_max integer
agent_last_active_unix_min integer
agent_last_active_unix_max integer
GET/share_balances/detailedRetrieve detailed influence balances with position and earningspage integer default 1
per_page integer default 20
name (required) string
share_type string
has_manager boolean
has_agent boolean
manager_last_active_unix_min integer
manager_last_active_unix_max integer
agent_last_active_unix_min integer
agent_last_active_unix_max integer
GET/share_trade_historyRetrieve share trade historypage integer default 1
per_page integer default 50
name string
club_id integer
player_id integer
sort_by string
sort_order string default desc
GET/share_trade_history/allGet last 20 tradesNone
GET/trading_graphRetrieve aggregated trading dataclub_id integer
player_id integer
time_range (required) TimeRangeEnum
GET/trading_graph/allRetrieve daily and monthly payouts dataNone

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/market' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/market", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.

Datacentre dumps/snapshots

Pre-calculated bulk snapshots for earnings, pack deals and order books. These can be larger than normal paged API responses.

MethodPathPurposeMain query/path parameters
GET/dumps/club_earningsPre-calculated club earnings for buyersNone
GET/dumps/club_earnings_lightSimplified club earnings (club_id → SVC per influence per season)None
GET/dumps/club_packsClub pack dealsNone
GET/dumps/club_seller_opportunitiesPre-calculated club seller opportunitiesNone
GET/dumps/player_earningsPlayer earnings and ROI analysisthreshold (required) integer
country string
division integer
min_rating integer
max_rating integer
position string
min_age integer
max_age integer
min_buyable integer
min_match_time number
max_match_time number
sort string default payback
order string default asc
page integer default 1
limit integer default 100
GET/dumps/share_ordersAll share orders (clubs + players combined)None
GET/dumps/share_orders/clubsClub share orders (optionally filtered by ID)ids array[integer]
GET/dumps/share_orders/playersPlayer share orders (optionally filtered by ID)ids array[integer]
GET/dumps/share_orders/jsonDownload share_orders as JSONNone
GET/dumps/share_orders/csvDownload share_orders as CSVNone

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/dumps/player_earnings?threshold=10&limit=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/dumps/player_earnings?threshold=10&limit=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.
  • Dump endpoints can be large; prefer filtered endpoints (ids, threshold, limit) where available.
  • /dumps/share_orders/csv returns CSV and /dumps/share_orders/json returns a downloadable JSON file rather than the normal paged wrapper.

Shop datacentre

Pack-sale data for clubs in the shop/datacentre flow.

MethodPathPurposeMain query/path parameters
GET/shop/clubsRetrieve pack-sale data for clubspage integer default 1
per_page integer default 20
tiers array[integer]
country_ids array[string]
club_ids array[integer]
pricePerPack_min integer
pricePerPack_max integer
sort_by ShopClubsSortBy
sort_order string default asc

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/shop/clubs?club_ids=50&per_page=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/shop/clubs?club_ids=50&per_page=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Use per_page/filters where available to keep responses small and cache-friendly.

Transfers

Recent completed transfers and transfer-count summaries.

MethodPathPurposeMain query/path parameters
GET/transfers/basicGet latest completed transfersNone
GET/transfers/countsGet transfer counts for a club in a seasonclub_id (required) integer
season_id (required) integer

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/transfers/basic' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/transfers/basic", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.

Fixtures/commentary

Fixture commentary, match events, player stats and tactics snapshots.

MethodPathPurposeMain query/path parameters
GET/commentary/match_commentary/{fixture_id}Get match commentary for a fixturefixture_id (required) integer
GET/commentary/match_events/{fixture_id}Get match events for a fixturefixture_id (required) integer
GET/fixture_history/players/{fixture_id}Get fixture player data for a fixturefixture_id (required) integer
GET/fixture_history/tactics/{fixture_id}Get fixture tactics data for a fixturefixture_id (required) integer

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/commentary/match_commentary/1' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/commentary/match_commentary/1", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Use a real fixture_id; examples here use fixture 1 as a stable reference value.

Messages/news

Blockchain/game messages/news filtered by season, country, competition or club.

MethodPathPurposeMain query/path parameters
GET/messagesGet messages from the blockchainseason_id (required) integer
country_id string
comp_id integer
club_id integer
limit integer

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/messages?season_id=1&club_id=50&limit=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/messages?season_id=1&club_id=50&limit=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • season_id is required; add limit to avoid very large responses.

Leaderboards

Earnings and referral leaderboards.

MethodPathPurposeMain query/path parameters
GET/leaderboards/earningsGet top 10 earners leaderboarddays integer default 30
GET/leaderboards/referrals/allGet top 20 referrers for all timeNone
GET/leaderboards/referrals/time-rangeGet top 50 referrers within a specific time rangeNone

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/leaderboards/earnings?days=30' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/leaderboards/earnings?days=30", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Check whether money-like fields are raw scaled integers and divide by 10000 only for raw SVC/money fields.

Votes/proposals

Active and historical proposal/vote views plus graph data.

MethodPathPurposeMain query/path parameters
GET/proposals/activeGet currently active proposalspage integer default 1
per_page integer default 100
proposal_type string
share_type string
stage_filter string
club_id integer
player_id integer
name string
GET/proposals/graphGet daily proposal completion counts for graphingdays_back integer default 30
GET/proposals/historicalGet proposals that ended in the last N days with daily statisticsdays_back integer default 7
proposal_type string
share_type string
club_id integer
player_id integer
name string

Example curl:

curl -sS \
  -H 'x-cf-bypass-secret: $CLOUDFLARE_BYPASS_SECRET' \
  'https://services.soccerverse.com/api/proposals/active?club_id=50&per_page=5' | jq .

Example Python:

import os
import requests

headers = {}
if os.getenv("CLOUDFLARE_BYPASS_SECRET"):
    headers["x-cf-bypass-secret"] = os.environ["CLOUDFLARE_BYPASS_SECRET"]

response = requests.get("https://services.soccerverse.com/api/proposals/active?club_id=50&per_page=5", headers=headers, timeout=30)
response.raise_for_status()
print(response.json())

Pitfalls:

  • Active proposal lists may legitimately be empty for a specific club/player.

Our Partners