Partner Integration API
The Partner Integration API follows a float model: a partner — a casino, a bookmaker, or an app — funds a float account at Yoyo Market (hereinafter “Yoyo”) and, with an API key, places bets on behalf of its own users in Yoyo prediction markets.
Each partner user is identified by an external_user_id and is automatically mapped to a Yoyo sub-account. The stake of every bet is funded from the float, and the resulting positions go into the shared LMSR AMM pool.
How It Works
- The partner funds the float. The float account holds the partner's undistributed funds.
- A bet arrives with an
external_user_id. The identifier is resolved to a Yoyo sub-account, which is created on the user's first bet. - The stake is debited from the float. The trade is then executed for that sub-account.
- The position goes into the shared LMSR pool. See Positions and Markets for what a position in a market is.
- A sale credits the payout to the sub-account. The payout stays there and can fund further bets, or be read through Get User State.
Onboarding
- Registration. Yoyo registers the partner and links a float account to it.
- Funding. The partner tops the float account up with a normal deposit (crypto or card).
- Key issue. The partner receives access to the B2B bot and issues an API key once with
/gen_key. The key is shown a single time and is never reissued — keep it secret. - Integration. The partner integrates the endpoints listed below.
Authentication
Every request requires the X-Partner-Key header:
X-Partner-Key: pk_xxxxxxxxxxxxxxxxxxxxxxxx
| Status | Code | Description |
|---|---|---|
| 401 | NO_PARTNER_KEY | The X-Partner-Key header is missing. |
| 401 | INVALID_PARTNER_KEY | The key is wrong, or the partner is disabled. |
Base URL
https://api.yoyo.market
Confirm the host for your environment. It is not the platform base URL used by the rest of the API Reference.
Units and Concepts
| Field | Description |
|---|---|
*_kopecks | Kopecks. 1 RUB = 100 kopecks. |
shares | Position shares. 100 = 1 token. |
avg_price_bps | Entry price in basis points. 10000 = 1 RUB. |
fee_bps | Fee in basis points. |
side | "yes" or "no". |
external_user_id | Identifier of the user in the partner's own system. |
client_bet_id | The partner's unique idempotency key. |
Monetary fields on these endpoints are integers. See Money Format for the platform-wide money conventions.
The rest of the docs name these scales differently: what this page calls shares is the integer those pages call shares in cents, and both count 100 units to one whole share or token. Prices there run on the same 0–10000 range, described as probability rather than in basis points — see Prices and Probability.
Idempotency
The pair (partner, client_bet_id) is unique. After a network error or a timeout, repeat the request with the same client_bet_id:
- If the bet already went through, the response is
already_accepted— no second trade is executed and the float is not debited a second time. - If the previous attempt never executed, the reservation was released and the retry proceeds normally.
Error Format
All endpoints share one error envelope:
{
"error": {
"code": "BET_LIMIT",
"message": "amount_kopecks 500000 exceeds partner max bet 100000"
}
}
See Error Handling for the full list of partner error codes.
Endpoints
| Endpoint | Path | Description |
|---|---|---|
| Place Bet | POST /api/v1/partner/bets | Place a bet for a partner user, funded from the float. |
| Sell Position | POST /api/v1/partner/sell | Sell shares of a position and credit the payout to the sub-account. |
| Get Float Balance | GET /api/v1/partner/balance | Read the float balance and the total balance of all sub-accounts. |
| Get User State | GET /api/v1/partner/users/{external_user_id} | Read a partner user's balance and open positions. |
The rest of the platform API is documented in the API Reference.