These developer docs are available in English only. View in English
Developer API Documentation
Reference documentation for the Soccerverse public APIs — Datacentre REST, GSP JSON-RPC, GraphQL subgraphs, the MCP server, realtime events and datapack assets.
These APIs are read-only: you can look at Soccerverse data, not change it. There is no API key and no sign-up.
Most apps should start with the Datacentre REST API. Use a /v1 bundle for page-sized reads: one club, player, user or page in a single call. Use /v1/gsp, a JSON-RPC proxy for the game-state processor (GSP), only when a JSON-RPC method has no REST equivalent.
The hosted APIs are on https://play.soccerverse.com (not soccerverse.com), except the MCP server and the datapack, which are on their own hosts.
If you run your own node, see Running your own node.
APIs and base URLs
| API | What it covers | Method | Base URL |
|---|---|---|---|
| Datacentre REST API | Start here. Clubs, players, users, market, fixtures, transfers, news, votes, leaderboards and shop data, for example /datacentre/clubs?club_id=50&per_page=5. | GET | https://play.soccerverse.com/datacentre |
Unified API (/v1) | A ready-made bundle for one club, player, user or page in a single call: /v1/club/50, /v1/player/1100, /v1/user/snailbrain, /v1/home, /v1/stats, /v1/transfer-market. Some responses are over 100 KB, and their layout can change. | GET | https://play.soccerverse.com/v1 |
| GSP JSON-RPC | Game-state read methods (seasons, leagues, squads, fixtures, transfers, votes and more) over JSON-RPC 2.0. Use it when the REST API has no equivalent. Answers mostly come from a cache that can lag the newest block. | POST | https://play.soccerverse.com/v1/gsp |
| Public subgraphs | GraphQL subgraphs for SVC/Democrit trading, Xaya chain stats, and shop, referral and pricing data (deployment IDs are on the page). | POST | https://play.soccerverse.com/graph/subgraphs/id/<deployment-id> |
| Soccerverse MCP | The MCP tool catalogue and the public Streamable HTTP endpoint, for AI clients. | POST | https://mcp.soccerverse.com/mcp |
| Realtime events | A live stream that says when something changed, such as a new block, a club or a player, so you know when to reload data. | GET | https://play.soccerverse.com/events |
| Datapack & assets | Datapack JSON structure, the customization and share flow, asset URL rules and cache behaviour. | GET | https://downloads.soccerverse.com/svpack/packv2/default.json |
Every /datacentre and /v1 route is listed in the machine-readable OpenAPI file.
Access and authentication
- Read-only. Use
GETfor REST,/v1and/events.POSTis only used to send read requests: JSON-RPC to/v1/gsp, GraphQL queries and MCP calls. - No API key. Just send a
User-Agentof your own, for examplemy-app/1.0. Cloudflare rejects the defaultUser-Agentof some libraries with403 error code: 1010; Python's built-inurllib(Python-urllib/3.x) is the common one. curl,requests, Nodefetch, Go, axios and wget work unchanged. ForPOSTrequests also sendContent-Type: application/json. - Fair use. Limits are per client IP address. Over a limit you get HTTP
429: wait a moment and try again./datacentreand/v1share about 20 requests per second (bursts of 40)./graphallows 5 per second (bursts of 10)./eventsallows 5 new connections per second (bursts of 10) and 50 open streams./v1/gspalso refuses (413) a request with more than 100 calls or more than about 256 KiB.
- Browsers. Pages on any website can call
/datacentre,/v1(including/v1/gsp),/graphand the datapack directly./eventsand MCP do not allow other websites, so call those from a server. - No trailing slash. Write
/v1/gsp, not/v1/gsp/, and/datacentre/clubs, not/datacentre/clubs/. With a trailing slash,/datacentre,/v1/gspand/graphrequests fail, and other/v1requests are redirected away fromplay.soccerverse.com.
Sample identifiers used throughout
| Entity | Sample value | Notes |
|---|---|---|
| Club | club_id=50 | Used for club, market, fixture and shop examples. In /v1 it is part of the path: /v1/club/50. |
| Player | player_id=1100 | Used for player lookup and history examples. In /v1: /v1/player/1100. |
| User | names=snailbrain | The parameter name depends on the endpoint: names= on /users and /users/detailed, name= on most others (for example /share_balances), and username= on /achievements. MCP tools use username or name: see Soccerverse MCP for each tool's parameters. In /v1 the name is part of the path: /v1/user/snailbrain. |
| Season | season_id=4 | Used for season examples. Some endpoints need a valid season id: to find the current season, read seasonId from /v1/bootstrap. |
Money and value scaling
These rules are for /datacentre, /v1 and GSP. The subgraphs use token units instead, each with its own scaling (for example, USD amounts have 6 decimals): see Public subgraphs.
- SVC amounts (balances, wages, values and SVC prices) are whole numbers in units of 1/10,000 SVC. Divide by
10000to get SVC:379894315586is 37,989,431.5586 SVC. This is the same on/datacentre,/v1and GSP (wherebalanceis an object withavailable,reservedandtotal). A few summary fields are already whole SVC, for exampleSVCTrades7dayVolSVCon/market. - USDC values that are already decimals.
svc2usdc(the USDC price of one SVC, for example0.0032) and fields such astotal_earnings_usdcare ordinary decimal numbers. Do not divide them. - Shop prices and referral spend are scaled. Shop prices are USDC times 1,000,000: every price on
/datacentre/shop/clubsand/v1/shop(pricePerPack,current_price, also insideshares, andpricing[].price). So isusd_spenton the referral leaderboards. Divide by1000000:335000is 0.335 USDC. - Everything else is a plain number. Ratings, ages, counts, percentages, timestamps and IDs are not scaled. Do not divide them. (One exception: game parameters whose names end in
-bpor-bpsare basis points — divide by 100 for a percentage.) - Some MCP tools already return human-readable text such as
37989431.56 SVC. Do not divide those.
Moved from the old URLs
These APIs used to be served from services.soccerverse.com and graph.soccerverse.com. Those hosts no longer work, and changing only the host name is not enough, because the paths changed too.
| Old address | New address |
|---|---|
https://services.soccerverse.com/api/<path> | https://play.soccerverse.com/datacentre/<path> |
https://services.soccerverse.com/gsp/ | https://play.soccerverse.com/v1/gsp |
https://graph.soccerverse.com/<name> | https://play.soccerverse.com/graph/subgraphs/id/<deployment-id> |
Running your own node
This section is for people who already run their own Soccerverse game-state processor (GSP) node. Everything above is hosted by Soccerverse. A node you run has a bare JSON-RPC interface, and none of the hosted extras exist on it: no /datacentre, /v1, /events or /graph.
- JSON-RPC. If you run the GSP Docker image, it serves JSON-RPC on port
8600(POSTrequests). It listens only inside its own container unless you start the node with--nogame_rpc_listen_locally. - Methods. About 80, including
getnullstateandwaitforchange, a long poll that returns when the newest block changes. A few are off by default: see the next point. Theget_*methods return the same state envelope as the hosted service. The GSP JSON-RPC page lists the methods and explains the envelope. - Switched off by default. From GSP v1.4.2,
--nounsafe_rpcis the default. It switches off the admin calls (such asstop,settargetblockandcheckdb) and a few large reads:get_freebench,get_all_users,get_player_idsandget_playerswith more than 100 ids. They only work if you start the node with--unsafe_rpc, and you should do that only on a private node that nobody else can reach. The hosted service keeps them off too. Older versions have them on by default, so start those with--nounsafe_rpcif anyone else can reach the node. The full list is on the GSP JSON-RPC page. - REST. The image also serves
GET /state(the same summary asgetnullstate) andGET /healthzon port8700, and nothing else.