Documentación
Referencia de la API
Todo lo que necesitás para integrar resultados de mesas en vivo: autenticación, endpoints, límites de uso y ejemplos en curl, JavaScript y Python.
Introducción
Croupier mantiene una única conexión WebSocket a mesas de casino en vivo y normaliza cada resultado en Redis. Tu integración nunca toca ese WebSocket: hablás con una API REST simple, autenticada con una clave, con cuota y rate limiting predecibles.
- • Todos los endpoints de datos son
GETy devuelven JSON. - • La base URL en producción es
https://api.getcroupier.live(ajustá al dominio real de tu despliegue). - • Los últimos 20 resultados de cada mesa quedan cacheados; no hay historial más largo por endpoint.
Autenticación
Cada request a la API de datos lleva tu clave en el header X-API-Key. No hay OAuth ni tokens temporales para este canal: la clave es estática hasta que la rotás vos mismo desde el dashboard.
X-API-Key: ppb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Conseguís tu clave iniciando sesión con Google y activando un plan con acceso a la API. Se muestra una sola vez al crearla o rotarla — guardala en un gestor de secretos, no en el código.
Obtener una API keyCategorías
Cada mesa pertenece a una categoría (tableType del proveedor, ej. ROULETTE). El catálogo soportado por el protocolo tiene 32 categorías, pero solo las que el operador del bridge habilitó están realmente cacheadas con datos — pedir una categoría del catálogo que no está activa devuelve 403, no datos vacíos.
GET /v1/categories
Categorías activas en esta instancia ahora mismo. Son las únicas que van a devolver datos.
GET /v1/categories/catalog
Las 32 categorías que el protocolo soporta, activas o no. Útil para saber qué pedir si tu plan las habilita más adelante.
Endpoints
/v1/categoriesCategorías habilitadas en esta instancia.
{
"categories": ["ROULETTE", "MEGAWHEEL"],
"timestamp": "2026-07-17T20:02:51Z"
}/v1/categories/catalogCatálogo completo de categorías soportadas por el protocolo.
{
"categories": ["AMERICANROULETTE", "ANDARBAHAR", "..."],
"timestamp": "2026-07-17T20:02:51Z"
}/v1/categories/{category}/tablesMesas disponibles dentro de una categoría, con su metadata.
| Parámetro | Tipo | Descripción |
|---|---|---|
| category* | path | Ej. ROULETTE. Debe estar en /v1/categories. |
{
"category": "ROULETTE",
"tables": [
{
"tableId": "204",
"tableName": "Mega Roulette",
"category": "ROULETTE",
"tableSubtype": "megaroulette",
"updated_at": "2026-07-17T20:02:51Z"
}
],
"timestamp": "2026-07-17T20:02:51Z"
}/v1/tablesEquivalente a /v1/categories/{category}/tables, con la categoría como query param.
| Parámetro | Tipo | Descripción |
|---|---|---|
| category* | query | Ej. ?category=ROULETTE |
/v1/categories/{category}/tables/{table_id}/resultsLos últimos resultados normalizados de una mesa.
| Parámetro | Tipo | Descripción |
|---|---|---|
| category* | path | Categoría de la mesa. |
| table_id* | path | ID de la mesa, ej. 204. |
{
"tableId": "204",
"category": "ROULETTE",
"tableName": "Mega Roulette",
"tableSubtype": "megaroulette",
"dealerName": "Normand",
"tableOpen": true,
"totalSeatedPlayers": 600,
"lastResults": [
{ "time": "Jul 17, 2026 4:02:51 PM", "result": "31",
"color": "black", "gameId": "15973291921" }
],
"timestamp": "2026-07-17T20:02:51Z"
}/v1/tables/{table_id}/resultsEquivalente al anterior, con la categoría como query param.
| Parámetro | Tipo | Descripción |
|---|---|---|
| table_id* | path | ID de la mesa. |
| category* | query | Categoría de la mesa. |
/v1/me/usageTu consumo actual: cuota mensual/total, rate limit y plan.
{
"monthly_used": 12500,
"monthly_quota": 50000,
"total_used": null,
"total_quota": null,
"requests_per_minute": 120,
"plan_slug": "vip_monthly",
"subscription_ends_at": "2026-08-17T00:00:00Z",
"api_key_prefix": "ppb_a1b2c3d4"
}Rate limiting y cuotas
Cada clave tiene dos límites independientes, definidos por tu plan:
- Requests por minuto — ventana fija de 60s. Superarla devuelve
429. - Cuota mensual (y total, opcional) — se resetea el día 1 de cada mes. Agotarla devuelve
402.
Consultá tu consumo en cualquier momento con GET /v1/me/usage — no gasta cuota de la API de datos.
Códigos de error
| Código | Nombre | Causa |
|---|---|---|
| 401 | Unauthorized | Falta el header X-API-Key, la clave no existe, está inactiva o expiró. |
| 402 | Payment Required | Se agotó la cuota mensual o total de la clave. |
| 403 | Forbidden | Tu plan no incluye acceso a la API, o pediste una categoría no habilitada en esta instancia. |
| 404 | Not Found | La mesa no existe en esa categoría, o todavía no hay resultados cacheados. |
| 422 | Unprocessable Entity | La categoría enviada no existe en el catálogo (32 tipos soportados). |
| 429 | Too Many Requests | Superaste el límite de requests por minuto de tu clave. |
Ejemplos de código
curl "https://api.getcroupier.live/v1/tables/204/results?category=ROULETTE" \ -H "X-API-Key: ppb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
const res = await fetch(
"https://api.getcroupier.live/v1/tables/204/results?category=ROULETTE",
{ headers: { "X-API-Key": process.env.CROUPIER_API_KEY } }
);
if (!res.ok) throw new Error(`API error ${res.status}`);
const data = await res.json();
console.log(data.lastResults[0]);import requests
res = requests.get(
"https://api.getcroupier.live/v1/tables/204/results",
params={"category": "ROULETTE"},
headers={"X-API-Key": "ppb_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"},
timeout=5,
)
res.raise_for_status()
data = res.json()
print(data["lastResults"][0])Buenas prácticas
- No hagas polling más rápido que la mesa gira. Cada mesa actualiza cada 20–60s según el juego; pedir cada segundo solo gasta tu cuota sin datos nuevos.
- Deduplicá por gameId. Es el identificador estable de cada resultado; usalo como clave si guardás resultados en tu propia base.
- Manejá 429 y 402 con backoff. Ambos son esperables en producción, no errores de tu integración — reintentá con espera exponencial, no en loop.
- Nunca expongas tu X-API-Key en el cliente. Hacé el fetch desde tu backend; si necesitás mostrar datos en un frontend, proxéalos vos mismo.