Client integration
Universal API — Casino Integration Guide
Integration guide — server-side API for live data, TV overlays, and iframe video embeds on your partner platform.
https://universeapi.storeGetting started
Before calling the API, Universal API will provision your partner account with:
- API key — send on every server-side request (keep it secret; never expose in browser or mobile bundles).
- Allowed domains — partner website domains that may embed the TV iframe (e.g.
partner.com,app.partner.com). - Subscription period — your key is valid between the start and end dates on your account.
API base URL: https://universeapi.store/api
All endpoints live under /api. JSON responses use application/json unless noted otherwise. Contact your account manager for key rotation, new domains, or subscription changes.
Authentication
Include your API key on every server-side request using one of the following headers:
X-API-Key: your-api-key
# or
Authorization: Bearer your-api-keyAccess control
Different routes use different checks:
| Route | Who calls it | Auth |
|---|---|---|
/api/* (games, state, results, embed mint) | Your backend | API key + active subscription + Allowed IPs (if configured) |
/ws?eventId=&apiKey= | Your backend | API key query + subscription + Allowed IPs (same as REST) |
/api/tv/player | End-user browser (iframe) | Embed token + tv=true + parent page domain in your allowed domains |
Server API requests are rejected if any of the following apply:
- API key is missing or invalid
- Your account is inactive or outside the subscription window
- Caller IP is not on your Admin Allowed IPs list (when that list is non-empty). Leave Allowed IPs empty to allow any source IP.
Proxy API and WebSocket calls through your backend and keep the key secret. Casino live push uses wss://universeapi.store/ws?eventId=…&apiKey=… (same IP rules as REST).
TV embed requests
To mint iframe embed tokens (POST /tv/games/:eventId/embed), also send:
X-TV-Client: trueThe browser iframe player validates the embedding site via Referer / Origin against your account's allowed domains. Register every production domain where users will load the iframe (including www variants if used).
Endpoints
All paths below are relative to https://universeapi.store/api.
| Method | Path | Purpose |
|---|---|---|
| GET | /health | Gateway health check |
| GET | /games | Game catalog |
| GET | /games/:eventId/state | Live snapshot (poll from backend) |
| WS | /ws?eventId=&apiKey= | Live state push (prefer over polling) |
| GET / POST | /games/:eventId/results, /results | Historical round results |
| GET | /tv/games/:eventId/state | Alias of /games/:eventId/state |
| POST | /tv/games/:eventId/embed | Mint short-lived iframe token (backend only) |
| GET | /tv/player | Browser iframe player (embed token + domain) |
Game catalog
/gamesAPI keyReturns every game available on your subscription.
GET https://universeapi.store/api/games
X-API-Key: your-api-key{
"games": [
{ "eventId": "99.0010", "eventName": "20-20 TEENPATTI" },
{ "eventId": "99.0018", "eventName": "DRAGON TIGER" }
]
}Live game state
/games/:eventId/stateAPI keyReturns the current live snapshot for one game — round timer, markets, cards, and result data when available.
GET https://universeapi.store/api/games/99.0010/state
X-API-Key: your-api-key{
"client": "Your Company Name",
"clientIp": "203.0.113.10",
"eventId": "99.0010",
"stale": false,
"freshnessMs": 280,
"data": {
"roundId": "123456789",
"status": "OPEN",
"roundStatus": "OPEN",
"leftSec": 12,
"marketArr": [ … ],
"cardsArr": { … },
"resultsArr": [ … ],
"updatedAt": "2026-05-24T11:00:00.000Z"
}
}Prefer WebSocket push for live screens: wss://universeapi.store/ws?eventId=99.0010&apiKey=YOUR_KEY (frames use type: "subscribed" then type: "state"). Poll this HTTP endpoint as a reconnect fallback (e.g. every 1–2 seconds). A 503 response means live data is temporarily unavailable or stale — retry after a short delay.
GET /tv/games/:eventId/state is an alias — same request and response.
Live demo
Real responses from the live casino feed, fetched through this site’s backend proxy (/api/public/uapi/*). The lobby and game pages on this site render exactly this data.
Casino API — live responses
idle · 0 msGET /api/public/uapi/games
…
Historical results
Fetch recent completed rounds for a game — winners, cards, and market outcomes. Use this to populate the "Recent results" panel in your live UI.
/games/:eventId/resultsAPI keyReturns recent completed rounds for the game in the path.
GET https://universeapi.store/api/games/99.0010/results
X-API-Key: your-api-keySame response from POST /results with body { "eventId": "99.0010" } or GET /results?eventId=99.0010.
{
"data": [
{
"roundId": "987654321",
"winner": "A",
"cards": { "A": ["H7", "D9"], "B": ["C3", "S5"] },
"results": [
{
"marketName": "Main",
"runners": [
{ "selectionId": "1", "result": "WIN" },
{ "selectionId": "2", "result": "LOSE" }
]
}
]
}
],
"meta": { "status": true, "message": "Success" }
}Poll when the user opens a game or after each round ends — every 10–30 seconds is usually enough. Returns 503 if historical results are temporarily unavailable.
TV & video
Embed the live video stream in an iframe on your site. Your backend mints a short-lived token; the browser loads the player URL — no API key in the iframe.
| Need | Endpoint | Used in |
|---|---|---|
| First-party streaming config | POST /public/tv/streaming | Public casino UI — returns iframeUrl (direct WebRTC player) |
| Video iframe URL | POST /api/tv/games/:eventId/embed | Your backend (returns embed path) |
| Video player page | GET /api/tv/player?embedToken=&tv=true | Browser iframe src (redirects to upstream WebRTC player) |
For timer, odds, and cards overlays, use Live game state — not the TV endpoints below.
/public/tv/streamingSession + first-party OriginReturns upstream WebRTC player config for the public casino UI at https://universeapi.store. Use iframeUrl as the iframe src — do not wrap it in another player page (nested iframes block WebRTC video).
POST https://universeapi.store/public/tv/streaming
Origin: https://universeapi.store
X-Session-Token: <from POST /public/session>
X-TV-Client: true
Content-Type: application/json
{ "eventId": "99.0010" }{
"data": {
"eventId": "99.0010",
"appName": "live",
"url": "livecdnplatin.com",
"streamingName": "GAME10",
"token": "…"
},
"iframeUrl": "https://player.universestudio.games/index.html?appName=live&streamingName=GAME10&url=livecdnplatin.com&token=…",
"playerUrl": "/public/tv/player?eventId=99.0010"
}Prefer iframeUrl for embedding. playerUrl is a legacy gateway redirect to the same upstream player.
Iframe video embed
Browsers cannot send X-API-Key on an iframe src. Use a two-step flow: your backend mints a short-lived embed token, then your frontend loads the player iframe with that token.
How iframe integration works
Browser on partner.com (live page)
↓ POST /your-backend/casino/tv/:eventId/embed
Your backend
↓ POST https://universeapi.store/api/tv/games/:eventId/embed + X-API-Key + X-TV-Client: true
Universal API
↓ { iframePath, expiresIn }
Your backend
↓ { iframeUrl: "https://universeapi.store/api/tv/player?..." }
Browser on partner.com
↓ <iframe src="iframeUrl"> (embedToken + Referer: partner.com)
Universal API player page → upstream video streamBackend requests embed token
POST /api/tv/games/:eventId/embed with API key + X-TV-Client: trueReturn iframe URL to frontend
iframePath — prefix with https://universeapi.store for the full URL.Browser loads iframe
expiresIn seconds — refresh before expiry./tv/games/:eventId/embedAPI key + X-TV-ClientCreates a short-lived embed token for one game. Call from your server only — never expose the API key in browser code.
POST https://universeapi.store/api/tv/games/99.0010/embed
Content-Type: application/json
X-API-Key: your-api-key
X-TV-Client: true{
"eventId": "99.0010",
"embedToken": "YkpY2RozaknDuLWGPR8cSbx0_SSnMnsMtK55fCo2ojw",
"expiresIn": 3600,
"iframePath": "/api/tv/player?eventId=99.0010&embedToken=YkpY2Roz...&tv=true"
}/tv/player?eventId=&embedToken=&tv=trueEmbed token + tv=true + domain allowlistProvider-hosted HTML player page. Use as iframe src on your whitelisted partner domain. The browser must send a Referer or Origin header matching one of your allowed domains (subdomains of a registered domain are accepted).
Do not set referrerpolicy="no-referrer" on the iframe — that blocks domain validation.
| Query param | Required | Description |
|---|---|---|
eventId | Yes | Game id (must match the token) |
embedToken | Yes | Token from POST /api/tv/games/:eventId/embed |
tv | Yes | Must be true |
Token refresh
Embed tokens expire after expiresIn seconds (default 3600). Refresh from your backend a few minutes before expiry — do not put the API key in browser code to call our embed endpoint directly.
let refreshTimer;
async function loadVideo(eventId) {
const res = await fetch(
`/your-backend/casino/tv/${encodeURIComponent(eventId)}/embed`,
{ method: "POST" }
);
const body = await res.json();
if (!res.ok || !body.iframeUrl) throw new Error(body.error ?? "Video unavailable");
document.getElementById("video-frame").src = body.iframeUrl;
clearTimeout(refreshTimer);
const refreshMs = Math.max((body.expiresIn - 300) * 1000, 60_000);
refreshTimer = setTimeout(() => loadVideo(eventId), refreshMs);
}HTML — live page with video iframe
<div class="uc-live-video">
<iframe
id="video-frame"
title="Live casino stream"
allow="autoplay; fullscreen"
referrerpolicy="strict-origin-when-cross-origin"
style="width:100%;aspect-ratio:16/9;border:0;border-radius:10px;background:#000"
></iframe>
<p id="video-error" class="uc-error" hidden></p>
</div>
<script>
async function loadVideo(eventId) {
const res = await fetch(
`/your-backend/casino/tv/${encodeURIComponent(eventId)}/embed`,
{ method: "POST" }
);
const body = await res.json();
if (!res.ok || !body.iframeUrl) {
document.getElementById("video-error").hidden = false;
document.getElementById("video-error").textContent =
body.error ?? "Video unavailable";
return;
}
document.getElementById("video-frame").src = body.iframeUrl;
}
loadVideo(new URLSearchParams(location.search).get("eventId"));
</script>Backend proxy — mint embed URL
router.post("/tv/:eventId/embed", async (req, res) => {
const { eventId } = req.params;
const r = await fetch(`https://universeapi.store/api/tv/games/${eventId}/embed`, {
method: "POST",
headers: {
"X-API-Key": process.env.UC_API_KEY,
"X-TV-Client": "true",
},
});
const body = await r.json();
if (!r.ok) {
res.status(r.status).json(body);
return;
}
// Prefix iframePath with provider base URL
const providerBaseUrl = process.env.UC_PROVIDER_BASE_URL ?? "https://universeapi.store";
res.json({
iframeUrl: `${providerBaseUrl}${body.iframePath}`,
expiresIn: body.expiresIn,
});
});Iframe troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Universe Casino logo stuck (no live video) | Double-nested iframe blocked WebRTC encrypted-media | Use iframeUrl from POST /public/tv/streaming directly, or GET /api/tv/player (redirects upstream). Add allow="autoplay; fullscreen; encrypted-media" on the iframe. |
| Blank iframe / error page | Expired or invalid embedToken | Call your backend embed proxy again and set a new iframe src |
| "Domain not whitelisted" in iframe | Parent page domain not in your allowed domains, or Referer blocked | Ask your account manager to add the embedding domain (e.g. partner.com). Remove no-referrer from the iframe. |
| 403 on embed POST | Subscription expired or account disabled | Contact support to renew or reactivate your account |
| 503 on embed POST | No stream configured for that game | Verify game is live; retry when streaming is available |
| 401 on embed POST | Missing X-TV-Client: true | Add header on server-side embed request |
Important: the TV player URL serves video only. Overlays come from Live game state.
Response fields
| Field | Description |
|---|---|
eventId | Game identifier (e.g. 99.0010) |
stale | true when the snapshot is outdated — treat as degraded data |
freshnessMs | Milliseconds since the snapshot was last updated |
data.roundId | Current round identifier |
data.status / data.roundStatus | Round phase (e.g. OPEN, CLOSED) |
data.leftSec | Seconds remaining in the current betting window |
data.marketArr | Markets and runner prices for the round |
data.cardsArr | Dealt cards keyed by market/runner |
data.resultsArr | Recent result entries when present in live snapshot |
data[].roundId | Round id from GET /api/games/:eventId/results |
data[].winner | Winning runner code for the round |
data[].cards | Card codes dealt in that round |
data[].results | Per-market runner outcomes (WIN / LOSE) |
Betting & wallet (seat API)
These endpoints let your platform place real bets on Universal API rounds. Player money always stays in your wallet: we call your callback URL to debit stake and credit winnings. All three endpoints use the same x-api-key header and respect your IP / domain whitelist.
Place a bet
/api/public/v1/betAPI keyPOST /api/public/v1/bet
x-api-key: <your key>
content-type: application/json
{
"userId": "player-1042",
"gameId": "99.0010",
"roundId": "1725312001",
"market": "Lucky 7",
"selection": "LOW",
"odds": 1.98,
"stake": 500,
"reference": "your-unique-txn-id"
}{ "status": "ok", "betId": "…", "reference": "your-unique-txn-id", "balance": 9500, "currency": "INR" }Idempotent: resending the same reference returns the original bet with duplicate: true — never double-debits.
Player balance
/api/public/v1/balanceAPI key{ "userId": "player-1042" }{ "status": "ok", "currency": "INR", "balance": 9500 }Bet history
/api/public/v1/bets?userId=&gameId=&limit=50API key{ "status": "ok", "count": 2, "bets": [
{ "operator_user_id": "player-1042", "game_id": "99.0010", "round_id": "1725312001",
"selection": "LOW", "odds": 1.98, "stake": 500, "payout": 990,
"status": "won", "reference": "your-unique-txn-id", "settled_at": "…" }
] }Method flexible: /me, /games and /bets answer to both GET and POST. Write endpoints (/bet, /balance, /cashout, /settle) are POST only and reply with a JSON method_not_allowed error (405) on GET — you will never get an HTML page back, so response.json() is always safe.
Your wallet callback
Set your callback base URL in the operator panel. We POST to <callback>/balance, <callback>/debit, <callback>/credit and <callback>/rollback.
{
"action": "debit",
"operatorId": "…",
"currency": "INR",
"userId": "player-1042",
"amount": 500,
"reference": "your-unique-txn-id",
"gameId": "99.0010",
"roundId": "1725312001",
"betId": "…",
"timestamp": "2026-09-02T23:10:00.000Z"
}Headers: x-universal-operator (your operator id) and x-universal-signature = HMAC-SHA256 of the raw body using your callback secret (hex). Verify it before touching balances.
const expected = crypto.createHmac("sha256", CALLBACK_SECRET)
.update(rawBody).digest("hex");
if (expected !== req.headers["x-universal-signature"]) return res.status(401).end();{ "status": "ok", "balance": 9500, "reference": "your-unique-txn-id" }Reply non-2xx or { "status": "failed" } to reject a debit (e.g. insufficient funds) — the bet is then rejected and logged in your panel. Settlement credits are sent automatically when the round result arrives; failed inserts trigger a rollback.
Balance maintain
Player funds always live in your wallet. We never hold or display a balance of our own — every stake, payout and refund is a call to your callback URL, so your ledger stays the single source of truth.
Money flow of one round
Bet placed
<callback>/debit with the stake and a unique reference. Deduct it and reply with the new balance.Round result
<callback>/credit with the payout and the same reference plus settlementRef. On a loss no call is made — the stake already left the wallet.Anything fails
<callback>/rollback with the original reference. Return the stake exactly once.Sync check
POST /api/public/v1/balance or read your own ledger to confirm both sides agree.Rules to keep balances correct
// store every reference you have already processed
const seen = await db.tx.findOne({ reference: body.reference, action: body.action });
if (seen) return res.json({ status: "ok", balance: seen.balanceAfter, reference: body.reference });
const balance = await wallet.apply(body.userId, body.action === "debit" ? -body.amount : body.amount);
await db.tx.insert({ reference: body.reference, action: body.action, balanceAfter: balance });
res.json({ status: "ok", balance, reference: body.reference });Never apply the same reference + action twice. Retries are normal (network timeouts) and must return the stored result, not a second debit or credit.
- Verify
x-universal-signaturebefore changing any balance. - Reply within 5 seconds; a timeout is treated as
callback_failedand the bet is rejected. - Always return the post-transaction balance in the same currency you registered.
- Reject with
{ "status": "failed", "error": "insufficient_funds" }instead of returning a negative balance. - Reconcile daily with
GET /api/public/v1/bets— stake and payout perreferenceshould match your ledger row for row.
GET /api/public/v1/bets?limit=500
// for each bet: ledger.debit(reference) === bet.stake
// bet.status === "won" ? ledger.credit(reference) === bet.payout : no credit rowErrors
Data endpoints reply with { "error": "message" }. Betting / wallet endpoints reply with { "status": "error", "code": "…", "message": "…" }.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_key | No x-api-key / Authorization header sent |
| 401 | invalid_key | Key unknown or deactivated |
| 403 | operator_disabled | Account disabled — contact support |
| 403 | ip_not_allowed | Calling IP is not whitelisted for this key |
| 403 | domain_not_allowed | Origin domain not whitelisted for this key |
| 402 | plan_expired | Monthly subscription has ended — renew to resume |
| 400 | bad_request | Invalid or missing body fields |
| 409 | round_closed | Betting is closed for that round |
| 424 | no_callback_url | Set your wallet callback URL in the operator panel |
| 502 | callback_failed | Your wallet endpoint was unreachable or errored |
| 402 | wallet_rejected | Your wallet declined the debit (e.g. low balance) |
| 404 | — | Unknown eventId — check the supported games list |
| 503 | — | Live data missing or stale — retry with backoff |
Integration guide
Recommended setup for a production integration.
Store credentials securely
Register embedding domains
Fetch the game list
GET /api/games once at startup (or cache with a long TTL) to build your game menu.Poll live state per game
GET /api/games/:eventId/state every 1–2 seconds from your backend and forward normalized data to your frontend.Handle degraded responses
503 or stale: true, show a "live data temporarily unavailable" state and retry with exponential backoff.Load recent results
GET /api/games/:eventId/results when the live page opens and refresh every 10–30 seconds for the results sidebar.Embed live video (optional)
expiresIn. See Iframe embed.Best practice: proxy all API calls through your own backend so the API key never reaches the browser. Only the short-lived embed token is passed to the iframe URL.
Game UI reference (HTML & CSS)
Copy the markup and styles below into your partner site. Bind odds from data.marketArr on live state and populate result modals from GET /api/games/:eventId/results. Download image assets from this site and host them on your server under the same /assets/ paths.
Assets: All files are served from this domain only (e.g. /assets/cards/H7_.png). Use Download to save files — no third-party links. After download, upload to your CDN keeping the path structure.
99.0010
20-20 TEENPATTI
99.0013
1DAY TEEN PATTI
99.0016
JOKER TEEN PATTI
99.0014
MUFLIS TEEN PATTI
99.0018
DRAGON TIGER
99.0019
20-20 DRAGON TIGER
99.0021
1 DAY DRAGON TIGER
99.0030
LUCKY 7
99.0005
AMAR AKBAR ANTHONY
99.0046
CARD RACE
99.0001
BACCARAT
99.0025
ANDAR BAHAR
99.0022
32 CARDS
99.0007
POKER
99.0041
DTL
20-20 TEENPATTI 99.0010
Runner tiles per market + dual-column result modal (Player A vs Player B).
Bind prices from data.marketArr. Map card codes from cardsArr to cardImageUrl(code).
Assets (download from this site)
| Asset | Path on your server | Download |
|---|---|---|
| Playing card | /assets/cards/{code}_.png | — |
| Hidden / back card | /assets/cards/null.png | Download |
| Result modal trophy styles | /assets/docs/trophy-icons.css | Download |
HTML — asset links & img tags
<link rel="stylesheet" href="/assets/docs/trophy-icons.css" />
<!-- Bind src from API card codes; paths are on your server after you download assets -->
<img src="/assets/cards/H7_.png" alt="Player A card" width="62" />
<img src="/assets/cards/S5_.png" alt="Player B card" width="62" />JavaScript — build image URLs from API codes
const ASSET_BASE = "https://your-domain.com";
function cardImageUrl(code) {
if (!code || code === "0") return `${ASSET_BASE}/assets/cards/null.png`;
return `${ASSET_BASE}/assets/cards/${code}_.png`;
}
// After download: host files under /assets/ on your serverLive odds / markets UI
<div class="uc-markets-scroll">
<section class="uc-market">
<header class="uc-market-header">
<strong class="uc-market-title">PAIR PLUS A</strong>
<span class="uc-market-minmax">Min/Max: 100 - 25000</span>
</header>
<div class="uc-market-body">
<div class="uc-runners-row uc-runners-row-two">
<div class="uc-runner">
<span class="uc-runner-name">Pair A</span>
<div class="uc-odds-box">
<div class="uc-odds-price">2.5</div>
<div class="uc-odds-size">100</div>
</div>
</div>
<div class="uc-runner">
<span class="uc-runner-name">Pair B</span>
<div class="uc-odds-box">
<div class="uc-odds-price">2.5</div>
<div class="uc-odds-size">100</div>
</div>
</div>
</div>
</div>
</section>
<section class="uc-market">
<header class="uc-market-header">
<strong class="uc-market-title">WINNER</strong>
<span class="uc-market-minmax">Min/Max: 100 - 100000</span>
</header>
<div class="uc-market-body">
<div class="uc-runners-row uc-runners-row-two">
<div class="uc-runner">
<span class="uc-runner-name">Player A</span>
<div class="uc-odds-box">
<div class="uc-odds-price">1.98</div>
<div class="uc-odds-size">500</div>
</div>
</div>
<div class="uc-runner">
<span class="uc-runner-name">Player B</span>
<div class="uc-odds-box">
<div class="uc-odds-price">1.98</div>
<div class="uc-odds-size">500</div>
</div>
</div>
</div>
</div>
</section>
</div>CSS — odds panel
:root,
[data-theme="light"] {
--casino-page-bg: var(--ifm-background-color);
--casino-shell-bg: #000;
--casino-markets-bg: #ededed;
--casino-market-header-bg: #000;
--casino-market-header-text: #fff;
--casino-market-body-bg: #fff;
--casino-text: #243a48;
--casino-text-muted: var(--ifm-color-emphasis-600);
--casino-runners-bg: linear-gradient(
90deg,
rgb(153 199 241) 0%,
rgb(138 189 216 / 50%) 49%,
rgb(146 198 246) 100%
);
--casino-odds-bg: rgba(114, 187, 239, 0.5);
--casino-odds-text: #111;
--casino-odds-shadow: 0 2px 7px 1px #67828be6;
--casino-back-bg: #72bbef;
--casino-lay-bg: #faa9ba;
--casino-sportbook-bg: #fff;
--casino-sportbook-border: #ccc;
--casino-results-bg: #000;
--casino-results-text: #fff;
--casino-results-muted: #ccc;
--casino-modal-bg: #fff;
--casino-modal-header-bg: #000;
--casino-modal-header-text: #fff;
--casino-modal-text: #243a48;
--casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
--casino-modal-backdrop: rgba(0, 0, 0, 0.5);
--casino-card-border: #000;
--casino-link: #243a48;
}
[data-theme="dark"] {
--casino-page-bg: var(--ifm-background-color);
--casino-shell-bg: #0d1117;
--casino-markets-bg: var(--ifm-background-color);
--casino-market-header-bg: #161b22;
--casino-market-header-text: var(--ifm-font-color-base);
--casino-market-body-bg: var(--ifm-background-surface-color);
--casino-text: var(--ifm-font-color-base);
--casino-text-muted: var(--ifm-color-emphasis-500);
--casino-runners-bg: linear-gradient(
90deg,
rgb(36 58 72) 0%,
rgb(28 45 56 / 70%) 49%,
rgb(36 58 72) 100%
);
--casino-odds-bg: rgba(114, 187, 239, 0.22);
--casino-odds-text: var(--ifm-font-color-base);
--casino-odds-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
--casino-back-bg: #72bbef;
--casino-lay-bg: #faa9ba;
--casino-sportbook-bg: var(--ifm-background-surface-color);
--casino-sportbook-border: var(--ifm-color-emphasis-300);
--casino-results-bg: #161b22;
--casino-results-text: var(--ifm-font-color-base);
--casino-results-muted: var(--ifm-color-emphasis-500);
--casino-modal-bg: var(--ifm-background-surface-color);
--casino-modal-header-bg: #161b22;
--casino-modal-header-text: var(--ifm-font-color-base);
--casino-modal-text: var(--ifm-font-color-base);
--casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.55);
--casino-modal-backdrop: rgba(0, 0, 0, 0.72);
--casino-card-border: var(--ifm-color-emphasis-400);
--casino-link: var(--ifm-color-primary-light);
}
/**
* Flattened markets panel styles (from CasinoLiveGame styles.module.css).
* Use with the HTML templates in docs — pair with casino-variables.css.
*/
.uc-markets-scroll {
background: var(--casino-markets-bg);
}
.uc-market {
margin-bottom: 3px;
}
.uc-market-header {
padding: 4px 8px;
font-size: 12px;
font-weight: 700;
background: var(--casino-market-header-bg);
color: var(--casino-market-header-text);
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
}
.uc-market-title {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.uc-market-minmax {
font-size: 11px;
font-weight: 400;
opacity: 0.85;
flex-shrink: 0;
white-space: nowrap;
}
.uc-market-body {
position: relative;
background: var(--casino-market-body-bg);
border-bottom-left-radius: 6px;
}
.uc-suspended-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
font-weight: 700;
text-transform: uppercase;
color: #fff;
background: rgba(0, 0, 0, 0.65);
border: 2px solid #666;
z-index: 1;
}
.uc-runners-row {
display: flex;
background: var(--casino-runners-bg);
padding: 6px 4px 10px;
gap: 4px;
}
.uc-runners-row-two .uc-runner {
flex: 1 1 50%;
max-width: 50%;
}
.uc-runners-row-three .uc-runner {
flex: 1 1 33.333%;
max-width: 33.333%;
}
.uc-runners-row-stacked {
flex-direction: column;
gap: 6px;
padding: 6px 8px 10px;
}
.uc-runners-row-stacked .uc-runner {
flex: 0 0 auto;
width: 100%;
max-width: 100%;
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.uc-runner {
display: flex;
flex-direction: column;
align-items: center;
min-width: 0;
padding: 0 2px;
}
.uc-runner-name {
font-size: 11px;
font-weight: 700;
color: var(--casino-text);
margin-bottom: 4px;
text-align: center;
line-height: 1.15;
min-height: 26px;
display: flex;
align-items: flex-end;
justify-content: center;
}
.uc-odds-box {
width: 100%;
max-width: 150px;
min-width: 72px;
border-radius: 5px;
padding: 4px 2px;
background: var(--casino-odds-bg);
box-shadow: var(--casino-odds-shadow);
color: var(--casino-odds-text);
text-align: center;
font-weight: 600;
}
.uc-odds-price {
font-size: 13px;
line-height: 1.2;
}
.uc-odds-size {
font-size: 11px;
font-weight: 400;
opacity: 0.85;
line-height: 1.2;
}
/* Back / lay table (1 Day Teen Patti, 1 Day Dragon Tiger) */
.uc-sportbook-table {
width: 100%;
border-collapse: collapse;
background: var(--casino-sportbook-bg);
table-layout: fixed;
}
.uc-sportbook-table th,
.uc-sportbook-table td {
border-top: 1px solid var(--casino-sportbook-border);
vertical-align: middle;
}
.uc-back-cell {
background: var(--casino-back-bg);
text-align: center;
}
.uc-lay-cell {
background: var(--casino-lay-bg);
text-align: center;
}Result modal UI
<div style="margin-bottom: 80px;">
<div class="modal-title p-2">
<h6 class="text-right round-id"><b>Round Id:</b> 952705064335</h6>
</div>
<div class="col-12 col-md-6 col-xs-12 paati_boxs">
<h6>Player A</h6>
<div class="card-Img-box">
<img src="/assets/cards/H7_.png" alt="Player A card 1" />
<img src="/assets/cards/D9_.png" alt="Player A card 2" />
<img src="/assets/cards/C3_.png" alt="Player A card 3" />
</div>
<div class="btn winner-team WinnerA">Winner</div>
</div>
<div class="col-12 col-md-6 col-xs-12 paati_boxs">
<h6>Player B</h6>
<div class="card-Img-box">
<img src="/assets/cards/S5_.png" alt="Player B card 1" />
<img src="/assets/cards/H2_.png" alt="Player B card 2" />
<img src="/assets/cards/D8_.png" alt="Player B card 3" />
</div>
</div>
<div class="clearfix"></div>
<div class="col-md-12 col-xs-12 all-market-winner">
<h6 class="text-center fw-bold">WINNER</h6>
<div class="dual-column-market-row">
<div class="card-Img-box sectionA p-1">
<i class="fa fa-trophy winner-icon" aria-hidden="true"></i>
<span class="teen-market-runner-name">PLAYER A</span>
</div>
<div class="card-Img-box sectionB p-1">
<i class="fa fa-trophy loser-icon" aria-hidden="true"></i>
<span class="teen-market-runner-name">PLAYER B</span>
</div>
</div>
</div>
</div>CSS — result modal
:root,
[data-theme="light"] {
--casino-page-bg: var(--ifm-background-color);
--casino-shell-bg: #000;
--casino-markets-bg: #ededed;
--casino-market-header-bg: #000;
--casino-market-header-text: #fff;
--casino-market-body-bg: #fff;
--casino-text: #243a48;
--casino-text-muted: var(--ifm-color-emphasis-600);
--casino-runners-bg: linear-gradient(
90deg,
rgb(153 199 241) 0%,
rgb(138 189 216 / 50%) 49%,
rgb(146 198 246) 100%
);
--casino-odds-bg: rgba(114, 187, 239, 0.5);
--casino-odds-text: #111;
--casino-odds-shadow: 0 2px 7px 1px #67828be6;
--casino-back-bg: #72bbef;
--casino-lay-bg: #faa9ba;
--casino-sportbook-bg: #fff;
--casino-sportbook-border: #ccc;
--casino-results-bg: #000;
--casino-results-text: #fff;
--casino-results-muted: #ccc;
--casino-modal-bg: #fff;
--casino-modal-header-bg: #000;
--casino-modal-header-text: #fff;
--casino-modal-text: #243a48;
--casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.25);
--casino-modal-backdrop: rgba(0, 0, 0, 0.5);
--casino-card-border: #000;
--casino-link: #243a48;
}
[data-theme="dark"] {
--casino-page-bg: var(--ifm-background-color);
--casino-shell-bg: #0d1117;
--casino-markets-bg: var(--ifm-background-color);
--casino-market-header-bg: #161b22;
--casino-market-header-text: var(--ifm-font-color-base);
--casino-market-body-bg: var(--ifm-background-surface-color);
--casino-text: var(--ifm-font-color-base);
--casino-text-muted: var(--ifm-color-emphasis-500);
--casino-runners-bg: linear-gradient(
90deg,
rgb(36 58 72) 0%,
rgb(28 45 56 / 70%) 49%,
rgb(36 58 72) 100%
);
--casino-odds-bg: rgba(114, 187, 239, 0.22);
--casino-odds-text: var(--ifm-font-color-base);
--casino-odds-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
--casino-back-bg: #72bbef;
--casino-lay-bg: #faa9ba;
--casino-sportbook-bg: var(--ifm-background-surface-color);
--casino-sportbook-border: var(--ifm-color-emphasis-300);
--casino-results-bg: #161b22;
--casino-results-text: var(--ifm-font-color-base);
--casino-results-muted: var(--ifm-color-emphasis-500);
--casino-modal-bg: var(--ifm-background-surface-color);
--casino-modal-header-bg: #161b22;
--casino-modal-header-text: var(--ifm-font-color-base);
--casino-modal-text: var(--ifm-font-color-base);
--casino-modal-shadow: 0 8px 32px rgba(0, 0, 0, 0.55);
--casino-modal-backdrop: rgba(0, 0, 0, 0.72);
--casino-card-border: var(--ifm-color-emphasis-400);
--casino-link: var(--ifm-color-primary-light);
}
/**
* Flattened markets panel styles (from CasinoLiveGame styles.module.css).
* Use with the HTML templates in docs — pair with casino-variables.css.
*/
.uc-markets-scroll {
background: var(--casino-markets-bg);
}
.uc-market {
margin-bottom: 3px;
}
.uc-market-header {
padding: 4px 8px;
font-size: 12px;
font-weight: 700;
background: var(--casino-market-header-bg);
color: var(--casino-market-header-text);
display: flex;
justify-content: space-between;
align-items: center;
gap: 8px;
}
.uc-market-title {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.uc-market-minmax {
font-size: 11px;
font-weight: 400;
opacity: 0.85;
flex-shrink: 0;
white-space: nowrap;
}
.uc-market-body {
position: relative;
background: var(--casino-market-body-bg);
border-bottom-left-radius: 6px;
}
.uc-suspended-overlay {
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 22px;
font-weight: 700;
text-transform: uppercase;
color: #fff;
background: rgba(0, 0, 0, 0.65);
border: 2px solid #666;
z-index: 1;
}
.uc-runners-row {
display: flex;
background: var(--casino-runners-bg);
padding: 6px 4px 10px;
gap: 4px;
}
.uc-runners-row-two .uc-runner {
flex: 1 1 50%;
max-width: 50%;
}
.uc-runners-row-three .uc-runner {
flex: 1 1 33.333%;
max-width: 33.333%;
}
.uc-runners-row-stacked {
flex-direction: column;
gap: 6px;
padding: 6px 8px 10px;
}
.uc-runners-row-stacked .uc-runner {
flex: 0 0 auto;
width: 100%;
max-width: 100%;
flex-direction: row;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.uc-runner {
display: flex;
flex-direction: column;
align-items: center;
min-width: 0;
padding: 0 2px;
}
.uc-runner-name {
font-size: 11px;
font-weight: 700;
color: var(--casino-text);
margin-bottom: 4px;
text-align: center;
line-height: 1.15;
min-height: 26px;
display: flex;
align-items: flex-end;
justify-content: center;
}
.uc-odds-box {
width: 100%;
max-width: 150px;
min-width: 72px;
border-radius: 5px;
padding: 4px 2px;
background: var(--casino-odds-bg);
box-shadow: var(--casino-odds-shadow);
color: var(--casino-odds-text);
text-align: center;
font-weight: 600;
}
.uc-odds-price {
font-size: 13px;
line-height: 1.2;
}
.uc-odds-size {
font-size: 11px;
font-weight: 400;
opacity: 0.85;
line-height: 1.2;
}
/* Back / lay table (1 Day Teen Patti, 1 Day Dragon Tiger) */
.uc-sportbook-table {
width: 100%;
border-collapse: collapse;
background: var(--casino-sportbook-bg);
table-layout: fixed;
}
.uc-sportbook-table th,
.uc-sportbook-table td {
border-top: 1px solid var(--casino-sportbook-border);
vertical-align: middle;
}
.uc-back-cell {
background: var(--casino-back-bg);
text-align: center;
}
.uc-lay-cell {
background: var(--casino-lay-bg);
text-align: center;
}
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css');
/* 20-20 Teen Patti result modal — Wazeer app-results / #resultModal */
.teenPattiResultModalRoot {
font-family: Tahoma, Helvetica, sans-serif;
}
.teenPattiResultModalRoot .modal-dialog {
width: 100%;
max-width: 560px;
margin: 0 auto;
}
.teenPattiResultModalRoot .modal-content {
background: #fff;
border-radius: 6px;
overflow: hidden;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.35);
}
.teenPattiResultModalRoot .bet-slip-head {
display: flex;
align-items: center;
justify-content: space-between;
background: linear-gradient(-180deg, #000 0%, #000 100%);
color: #fff;
padding: 8px 12px;
border: 0;
}
.teenPattiResultModalRoot .bet-slip-head .modal-title {
margin: 0;
font-size: 15px;
font-weight: 700;
text-transform: capitalize;
}
.teenPattiResultModalRoot .bet-slip-head .modal-title b {
font-weight: 700;
}
.teenPattiResultModalRoot .bet-slip-head .close {
float: none;
padding: 0;
margin: 0;
background: transparent;
border: 0;
color: #fff;
opacity: 1;
font-size: 24px;
line-height: 1;
cursor: pointer;
text-shadow: none;
}
.teenPattiResultModalRoot .modal-body {
padding: 8px 12px 16px;
max-height: 80vh;
overflow-y: auto;
text-align: left;
}
.teenPattiResultModalRoot .body-bottom {
margin-bottom: 40px;
}
.teenPattiResultModalRoot .modal-title.p-2 {
padding: 8px;
margin: 0;
}
.teenPattiResultModalRoot .round-id {
margin: 0;
font-size: 14px;
font-weight: 700;
text-align: right;
color: #243a48;
}
.teenPattiResultModalRoot .round-id b {
font-weight: 700;
}
.teenPattiResultModalRoot .paati_boxs {
width: 50%;
float: left;
box-sizing: border-box;
padding: 0 4px;
text-align: center;
}
.teenPattiResultModalRoot .paati_boxs h6 {
margin: 0 0 8px;
font-size: 16px;
font-weight: 700;
}
.teenPattiResultModalRoot .card-Img-box {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.teenPattiResultModalRoot .card-Img-box img {
width: 62px;
height: auto;
border: 1px solid #000;
border-radius: 17px;
margin: 6px;
}
.teenPattiResultModalRoot .all-market-winner .sectionA.p-1,
.teenPattiResultModalRoot .all-market-winner .sectionB.p-1 {
padding: 4px;
min-height: 28px;
align-items: center;
justify-content: center;
gap: 3px;
}
.teenPattiResultModalRoot .teen-market-runner-name {
margin-left: 3px;
font-size: 12px;
font-weight: 700;
color: #243a48;
line-height: 1.2;
text-transform: uppercase;
}
.teenPattiResultModalRoot .winner-icon {
animation: wazeerTeenPattiWinnerPulse 1.5s infinite;
border-radius: 50%;
color: #1d7f1e;
margin-left: 0;
font-size: 14px;
flex-shrink: 0;
}
.teenPattiResultModalRoot .loser-icon {
animation: wazeerTeenPattiWinnerPulse 1.5s infinite;
border-radius: 50%;
color: #ca1010;
transform: rotate(180deg);
margin-left: 0;
font-size: 14px;
flex-shrink: 0;
}
.teenPattiResultModalRoot .winner-team {
background: #28a745;
padding: 5px 10px;
color: #fff;
font-size: 20px;
font-weight: 700;
display: block;
margin: 10px auto;
width: fit-content;
border: 0;
border-radius: 4px;
}
.teenPattiResultModalRoot .clearfix {
clear: both;
border-top: 1px solid #ccc;
}
.teenPattiResultModalRoot .all-market-winner {
border-bottom: 1px solid #ccc;
padding: 10px 0;
}
.teenPattiResultModalRoot .all-market-winner .text-center.fw-bold {
text-align: center;
font-size: 12px;
font-weight: 700;
margin-bottom: 8px;
line-height: 1.3;
color: #243a48;
}
.teenPattiResultModalRoot .all-market-winner .sectionA,
.teenPattiResultModalRoot .all-market-winner .sectionB {
width: 50%;
display: inline-flex;
text-align: center;
font-size: 12px;
vertical-align: top;
box-sizing: border-box;
align-items: center;
justify-content: center;
}
@keyframes wazeerTeenPattiWinnerPulse {
0% {
box-shadow: 0 0 0 0 rgba(29, 127, 30, 0.6);
}
70% {
box-shadow: 0 0 0 10px rgba(29, 127, 30, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(29, 127, 30, 0);
}
}
@media only screen and (max-width: 767px) {
.teenPattiResultModalRoot .paati_boxs {
width: 100%;
float: none;
margin: 5px 0;
padding: 0;
}
.teenPattiResultModalRoot .paati_boxs h6 {
font-size: 18px;
}
.teenPattiResultModalRoot .card-Img-box img {
width: 50px;
border-radius: 14px;
}
}
/* Lucky 7 result modal — stacked full-width runner rows */
.lucky7ResultModalRoot .lucky7-body-bottom {
margin-bottom: 80px;
}
.lucky7ResultModalRoot .lucky7-card-box {
float: none;
width: 100%;
max-width: none;
margin: 0 auto 8px;
padding: 0;
text-align: center;
}
.lucky7ResultModalRoot .lucky7-card-box + .clearfix {
border-top: 0;
}
@media only screen and (max-width: 767px) {
.lucky7ResultModalRoot .lucky7-card-box {
max-width: 100%;
}
}
/* 1 Day Teen Patti result modal */
.oneDayTeenPattiResultModalRoot .one-day-teen-body-bottom {
margin-bottom: 80px;
}
.oneDayTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
display: block;
margin: 8px auto 0;
}
.oneDayTeenPattiResultModalRoot .winner-team {
display: block;
margin: 8px auto 0;
}
/* Joker Teen Patti result modal */
.jokerTeenPattiResultModalRoot .joker-teen-body-bottom {
margin-bottom: 80px;
}
.jokerTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
display: block;
margin: 8px auto 0;
}
.jokerTeenPattiResultModalRoot .winner-team {
display: block;
margin: 8px auto 0;
}
/* Muflis Teen Patti result modal */
.muflisTeenPattiResultModalRoot .muflis-teen-body-bottom {
margin-bottom: 0;
}
.muflisTeenPattiResultModalRoot .card-Img-box .btn.winner-team {
display: block;
margin: 8px auto 0;
width: fit-content;
}
/* Card Race result modal */
.cardRaceResultModalRoot .card-race-body-bottom {
margin-bottom: 0;
}
.cardRaceResultModalRoot .showall-card {
list-style: none;
padding: 6px 4px;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
border-bottom: 1px solid #eee;
}
.cardRaceResultModalRoot .showall-card .ms-1 {
margin-left: 2px;
display: inline-flex;
}
.cardRaceResultModalRoot .showall-card .imgClassModal {
width: 32px;
height: auto;
border: 1px solid #000;
border-radius: 8px;
}
.cardRaceResultModalRoot .modal-title.p-2[style*='float'] {
float: left;
width: 100%;
}
.cardRaceResultModalRoot .modal-title.p-2[style*='float'] + .paati_boxs {
clear: both;
}
/* Amar Akbar Anthony result modal */
.aaaResultModalRoot .aaa-body-bottom {
margin-bottom: 0;
}
.dragonTiger2020ResultModalRoot .dragon-tiger-body-bottom {
margin-bottom: 80px;
}
.dragonTiger2020ResultModalRoot .winner-team {
display: block;
margin: 8px auto 0;
}
/* 1 Day Dragon Tiger result modal */
.oneDayDragonTigerResultModalRoot .showall-card {
list-style: none;
padding: 8px 4px;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
border-bottom: 1px solid #eee;
}
.oneDayDragonTigerResultModalRoot .showall-card .mr-2 {
margin-right: 8px;
font-weight: 700;
font-size: 14px;
color: #243a48;
}
.oneDayDragonTigerResultModalRoot .showall-card .ms-1 {
margin-left: 3px;
}
.oneDayDragonTigerResultModalRoot .showall-card .imgClassModal {
width: 42px;
height: auto;
border: 1px solid #000;
border-radius: 12px;
}
/* Baccarat result modal */
.baccaratResultModalRoot .winner-team {
display: block;
margin: 8px auto 0;
}
/* Andar Bahar result modal */
.andarBaharResultModalRoot .andar-bahar-body-bottom {
margin-bottom: 80px;
}
.andarBaharResultModalRoot .showall-card {
list-style: none;
padding: 8px 4px;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
border-bottom: 1px solid #eee;
}
.andarBaharResultModalRoot .showall-card .mr-2 {
margin-right: 8px;
font-weight: 700;
font-size: 14px;
color: #243a48;
display: flex;
align-items: center;
}
.andarBaharResultModalRoot .showall-card .andar-bahar-card-item {
margin-left: 3px;
}
.andarBaharResultModalRoot .showall-card img {
width: 42px;
height: auto;
border: 1px solid #000;
border-radius: 12px;
}
/* 32 Cards result modal */
.cards32ResultModalRoot .cards32-body-bottom {
margin-bottom: 80px;
}
.cards32ResultModalRoot .cards32-round-id {
float: none;
width: 100%;
clear: both;
}
.cards32ResultModalRoot .cards32-round-id-clear {
border-top: 0;
clear: both;
}
.cards32ResultModalRoot .cards32-player-box {
float: none;
width: 100%;
max-width: none;
padding: 0;
clear: both;
}
.cards32ResultModalRoot .showall-card {
list-style: none;
padding: 8px 4px;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
border-bottom: 1px solid #eee;
}
.cards32ResultModalRoot .showall-card .mr-2 {
margin-right: 8px;
font-weight: 700;
font-size: 14px;
color: #243a48;
}
.cards32ResultModalRoot .showall-card .cards32-card-item {
margin-left: 3px;
}
.cards32ResultModalRoot .showall-card .imgClassModal {
width: 42px;
height: auto;
border: 1px solid #000;
border-radius: 12px;
}
.cards32ResultModalRoot .showall-card .me-1 {
margin-right: 4px;
}
/* 20-20 Poker result modal */
.pokerResultModalRoot .poker-body-bottom {
margin-bottom: 80px;
}
.pokerResultModalRoot .poker-round-id {
float: none;
width: 100%;
clear: both;
}
.pokerResultModalRoot .poker-round-id-clear {
border-top: 0;
clear: both;
}
.pokerResultModalRoot .poker-card-box {
float: none;
width: 100%;
max-width: none;
padding: 0;
clear: both;
}
.pokerResultModalRoot .showall-card {
list-style: none;
padding: 8px 4px;
margin: 0;
display: flex;
flex-wrap: wrap;
align-items: center;
border-bottom: 1px solid #eee;
}
.pokerResultModalRoot .showall-card b {
font-weight: 700;
font-size: 14px;
color: #243a48;
}
.pokerResultModalRoot .showall-card .ms-1 {
margin-left: 4px;
}
.pokerResultModalRoot .showall-card .imgClassModal {
width: 42px;
height: auto;
border: 1px solid #000;
border-radius: 12px;
}Supported games
| eventId | Game name |
|---|---|
99.0010 | 20-20 TEENPATTI |
99.0030 | LUCKY 7 |
99.0013 | 1DAY TEEN PATTI |
99.0016 | JOKER TEEN PATTI |
99.0019 | 20-20 DRAGON TIGER |
99.0001 | BACCARAT |
99.0025 | ANDAR BAHAR |
99.0022 | 32 CARDS |
99.0007 | POKER |
99.0041 | DTL |
99.0021 | 1 DAY DRAGON TIGER |
99.0014 | MUFLIS TEEN PATTI |
99.0046 | CARD RACE |
99.0005 | AMAR AKBAR ANTHONY |
99.0018 | DRAGON TIGER |
88.0019 | LUCKY 0 TO 9 |
88.0020 | DREAM CATCHER |
88.0021 | HEADS & TAILS |
88.0030 | VIMAAN |
88.0023 | BALLOON |