Referencia del servidor
Servidor API
Copiar página
El API de tu aplicación hace llamadas a su propio servidor con su clave secreta. Verifica sesiones, lista productos, confirma, entrega y reembolsa cargos, paga recompensas desde tu fondo, envía notificaciones, revisa anuncios y lista tablas públicas.
#Conceptos básicos
| Dirección base | https://api.lialabs.org/api/apps/v1 |
| Autenticación | Authorization: Bearer <your key>, tu clave de prueba (lia_test_…) o clave en vivo (lia_live_…) |
| Cuerpos | JSON, con Content-Type: application/json |
| Importes | En $LIA, como números, a 6 decimales |
| Horas | Milisegundos desde 1970 (UTC) |
Llámelo solo desde su servidor. Su clave es un secreto: nunca la coloque en su página.
curl https://api.lialabs.org/api/apps/v1/pool \
-H "Authorization: Bearer $LIA_KEY"Un pequeño ayudante usado en los ejemplos a continuación:
const LIA = "https://api.lialabs.org/api/apps/v1";
export async function lia(method, path, body) {
const res = await fetch(LIA + path, {
method,
headers: { Authorization: `Bearer ${process.env.LIA_KEY}`, "Content-Type": "application/json" },
body: body === undefined ? undefined : JSON.stringify(body),
});
const data = await res.json();
if (!res.ok) throw Object.assign(new Error(data.error), { status: res.status, data });
return data;
}#Claves y modos
Una clave solo ve su propia aplicación, y solo su propio modo: la clave de prueba ve sesiones de prueba, cargos, jugadores y anuncios; la clave en vivo ve los de producción. Algo del otro modo es not_found (o valid: false. Ver Prueba y producción.
#Errores
Los errores responden con un estado 4xx y un cuerpo con un error código, a veces con más campos:
{ "error": "pool_empty", "pool": 3.5 }| Estado | Código | Cuándo |
|---|---|---|
| 401 | bad_key | Sin clave, una clave en la forma equivocada, una clave desconocida, una clave activa mientras tu aplicación no'no está en vivo, o cualquier tecla mientras esté'su pausa. |
Cada punto final lista el suyo propio. Todo el código está en Códigos de error.
#Sesiones
#POST/session/verify
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/session/verify' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"session": "lias_example_session"
}'Verifica un token de sesión de Lia.init() o Lia.session(), y te dice de quién es.
POST /api/apps/v1/session/verify
Authorization: Bearer lia_live_…
Content-Type: application/json
{ "session": "lias_eyJhcHAiOi…" }| Campo | Tipo | |
|---|---|---|
session | cadena | El token de la página. |
Respuestas 200 de cualquier manera:
{ "valid": true, "playerId": "p_3f9c0a6d1b2e4f5a6b7c", "mode": "live", "exp": 1761998400000 }{ "valid": false }Un token es válido cuando Lia lo firmó, es'para tu aplicación y tu clave'tu modo, y no'finalizado (15 minutos después de que se creó).
#Productos
#GET/products
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request GET 'https://api.lialabs.org/api/apps/v1/products' \
--header "Authorization: Bearer $LIA_KEY"Lo que su aplicación vende, a los precios en Lia'los registros. Solo productos activos, de menor a mayor precio.
{
"products": [
{ "id": "extra-lives", "name": "3 extra lives", "price": 5, "active": true },
{ "id": "gold-pack", "name": "Gold pack", "price": 25, "active": true }
]
}#Cargos
Un cargo es un pago en Lia'la nómina. Véase Pagos.
El objeto de tarifa:
| Campo | Tipo | |
|---|---|---|
id | cadena | Me gusta ch_9b1f…. |
playerId | cadena | Quién pagó. |
productId | cadena | Lo que pagaron. |
amount | número | Lo que pagaron, en $LIA. |
status | cadena | paid, delivered o refunded. |
mode | cadena | test o live. |
createdAt | número | Cuándo se pagó. |
deliveredAt | número o nulo | Cuándo lo entregaste. |
refundedAt | número o nulo | Cuándo se devolvió. |
#GET/charges/:id
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request GET 'https://api.lialabs.org/api/apps/v1/charges/id_example' \
--header "Authorization: Bearer $LIA_KEY"¿Esta carga es real, pagada y de quién? Siempre verifique aquí antes de entregar: nunca tome la página'o un webhook'la palabra para ello.
{
"charge": {
"id": "ch_9b1f4c2e7a0d5b8f3e6a1c4d",
"playerId": "p_3f9c0a6d1b2e4f5a6b7c",
"productId": "extra-lives",
"amount": 5,
"status": "paid",
"mode": "live",
"createdAt": 1761998400000,
"deliveredAt": null,
"refundedAt": null
}
}| Estado | Código | Cuándo |
|---|---|---|
| 404 | not_found | No hay tal cargo para tu aplicación en tu clave'tu modo. |
#POST/charges/:id/deliver
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/charges/id_example/deliver' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Idempotency-Key: example-request-1'Marca un cargo entregado, una vez que'se han dado al usuario lo que compró. Seguro de repetir: entregar una carga entregada no cambia nada y responde lo mismo. No hay cuerpo.
{ "charge": { "id": "ch_9b1f…", "status": "delivered", "deliveredAt": 1761998405000, "…": "…" } }| Estado | Código | Cuándo |
|---|---|---|
| 404 | not_found | No hay tal cargo en tu clave'tu modo. |
| 409 | refunded | Fue reembolsado, así que no'entregarlo. El cuerpo tiene el charge también. |
#POST/charges/:id/refund
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/charges/id_example/refund' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Idempotency-Key: example-request-1'Devuelve $LIA a la persona, cuando puedas'entregarlo. Funciona en un cargo pagado o entregado. Seguro de repetir: reembolsar un cargo reembolsado responde con él y no paga nada más. Sin cuerpo.
{ "charge": { "id": "ch_9b1f…", "status": "refunded", "refundedAt": 1761998410000, "…": "…" } }El precio completo vuelve a la persona's saldo, en modo en vivo, fuera de Lia'su parte y su porción. Un charge.refunded el webhook se envía.
| Estado | Código | Cuándo |
|---|---|---|
| 404 | not_found | No hay tal cargo en tu clave'tu modo. |
#Recompensas
#POST/rewards
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/rewards' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"playerId": "player_example",
"amount": 1,
"key": "reward-example-1",
"reason": "Level completed"
}'Paga a un jugador desde tu aplicación'el fondo de recompensas, una vez por clave.
POST /api/apps/v1/rewards
Authorization: Bearer lia_live_…
Content-Type: application/json
{
"playerId": "p_3f9c0a6d1b2e4f5a6b7c",
"amount": 25,
"key": "tournament-2026-11-01:p_3f9c0a6d1b2e4f5a6b7c",
"reason": "Weekly tournament, 1st place"
}| Campo | Tipo | |
|---|---|---|
playerId | cadena | El jugador a pagar. |
amount | número | En $LIA, más de 0 y como máximo 10,000, a 6 decimales. |
key | cadena | Tuyo, 1 a 128 de letras, dígitos, _, ., : y -. Una clave paga una vez, para siempre. Sin ella, el Idempotency-Key se utiliza el encabezado. |
reason | cadena | Opcional, hasta 80 caracteres (más largo se corta). Mostrado en el jugador's actividad bajo tu aplicación'tu nombre. |
Pagado:
{ "status": "paid", "amount": 25, "pool": 975 }La misma clave vuelve a pagar nada y responde con lo que pagó la primera:
{ "status": "duplicate", "amount": 25, "pool": 975 }pool es lo que'te queda en tu bote después de eso. En modo de prueba el premio es ficticio: el bote no'usado y el límite diario no't aplicar.
| Estado | Código | Cuándo |
|---|---|---|
| 400 | bad_amount | amount no't un número superior a 0 y hasta 10,000. |
| 400 | bad_key_field | key falta o no tiene la forma correcta. |
| 404 | unknown_player | No hay tal jugador en tu aplicación. |
| 409 | pool_empty | La piscina no'sostener amount. El cuerpo tiene pool, qué'te queda. |
| 429 | daily_limit | Esto llevaría al jugador fuera de tu aplicación'el límite diario por jugador (en $LIA, por UTC día). El cuerpo tiene dailyCapPerPlayer. |
A reward.paid el webhook se envía por cada recompensa pagada (no por duplicados).
#GET/pool
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request GET 'https://api.lialabs.org/api/apps/v1/pool' \
--header "Authorization: Bearer $LIA_KEY"¿Qué'te queda en tu bote de recompensas, y la cantidad máxima que un jugador puede obtener de él en un día.
{ "balance": 975, "dailyCapPerPlayer": 50, "mode": "live" }dailyCapPerPlayer es 0 cuando allí'tu no tiene límite diario. balance es el fondo en vivo, también cuando pregunta con su clave de prueba.
#Notificaciones
Ver Notificaciones.
#POST/notifications
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/notifications' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"playerId": "player_example",
"text": "Ready for another round?",
"startParam": "round_2"
}'Envía una notificación a un jugador que lo permitió. Se muestra bajo tu app'tu nombre y abre tu aplicación con tu startParam.
POST /api/apps/v1/notifications
Authorization: Bearer lia_live_…
Content-Type: application/json
{ "playerId": "p_3f9c0a6d1b2e4f5a6b7c", "text": "It's your move against @amara.", "startParam": "match-8k2d" }| Campo | Tipo | |
|---|---|---|
playerId | cadena | A quién notificar. |
text | cadena | 1 a 180 caracteres. Los espacios y los saltos de línea se convierten en espacios simples. Sin enlaces, números de teléfono o palabras utilizadas en estafas. |
startParam | cadena | Opcional. 1 a 64 de letras, dígitos, _ y -. Su página lo lee desde Lia.startParam. |
Enviado:
{ "sent": true, "pushed": true }pushed es false cuando llegó a Lia's timbre pero no el teléfono (la persona tiene Lia'empuja hacia atrás).
| Estado | Código | Cuándo |
|---|---|---|
| 400 | bad_text | Vacío, demasiado largo o no permitido. Cuando'lo que dice el texto, problem es link, phone o scam. |
| 400 | bad_start_param | startParam no'en la forma correcta. |
| 403 | notifications_off | Tu app no puede enviar notificaciones (su número diario es 0). |
| 403 | not_allowed | Este jugador no't permitido su aplicación'notificaciones, o las detuvieron. |
| 404 | unknown_player | No hay tal jugador, o no uno de tu clave'tu modo alcanza (una clave de prueba solo alcanza a tus probadores). |
| 429 | rate_limited | Se alcanzó un límite. Para tu aplicación'propios límites el cuerpo tiene retryAt, cuando puedas intentarlo de nuevo. |
#Anuncios
Ver Anuncios.
#POST/ads/verify
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/ads/verify' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"adId": "ad_example"
}'¿Este anuncio fue realmente visto, y por quién? Comprueba antes de dar algo por un video recompensado.
POST /api/apps/v1/ads/verify
Authorization: Bearer lia_live_…
Content-Type: application/json
{ "adId": "ad_8e1c4b0f2a9d47c6b3e15a07" }{ "adId": "ad_8e1c4b0f2a9d47c6b3e15a07", "playerId": "p_3f9c0a6d1b2e4f5a6b7c", "format": "rewarded", "watched": true, "watchedAt": 1761998400000 }| Campo | Tipo | |
|---|---|---|
adId | cadena | El id de Lia.showAd(). |
playerId | cadena | El jugador al que se le mostró. Revísalo'la persona que pregunta. |
format | cadena o nulo | "rewarded", "rewardedInterstitial", "interstitial", "banner" o "native" (nulo para anuncios antes de SDK 1.7). Solo "rewarded" y "rewardedInterstitial" valen una recompensa. |
watched | booleano | Visto hasta el final (o, para un anuncio intersticial, de banner o nativo, mostrado). |
watchedAt | número o nulo | Cuándo |
Pregunte con la clave del modo en que se mostró el anuncio: un anuncio de modo de prueba (siempre uno de Google'sus anuncios de prueba, nunca contados para ingresos) es not_found al teclado en vivo.
Lia no puede'no marcar un anuncio como usado cuando lo verifica, por lo que paga cada adId una vez que te autentiques (usa ad:<adId> como clave de recompensa).
| Estado | Código | Cuándo |
|---|---|---|
| 404 | not_found | No hay tal anuncio para tu aplicación en tu clave'tu modo. |
#Lobby
Mesas públicas que cualquiera en Lia puede encontrar. Lia mantiene solo el listado: su servidor ejecuta la mesa. Vea Mesas públicas.
El objeto de la tabla:
| Campo | Tipo | |
|---|---|---|
id | cadena | Su tabla's id. |
game | cadena | Tu app's id. |
host | objeto | { name }: el anfitrión's Lia nombre de usuario. |
seats, taken | número | Asientos totales, y ocupados. |
title | cadena o nulo | Filtrado como todo lo que leen las personas en Lia. |
stake, pot | número | En LIA, para mostrar. |
createdAt, expiresAt | número |
#POST/lobby/tables
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/lobby/tables' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"tableId": "table_example",
"hostPlayerId": "player_example",
"seats": 2,
"taken": 1,
"title": "A friendly game",
"stake": 1,
"pot": 1,
"expiresIn": 1800
}'Lista una mesa que'esperando jugadores, o actualiza su lista (mantiene su lugar en la lista). Vuelva a listarla cada vez que cambien sus asientos.
{ "tableId": "t8k2d", "hostPlayerId": "p_3f9c0a6d1b2e4f5a6b7c", "seats": 2, "taken": 1, "title": "Quick game", "stake": 5, "expiresIn": 900 }| Campo | Tipo | |
|---|---|---|
tableId | cadena | Tuyo, 1 a 57 de letras, dígitos, _ y - (lo suficientemente corto para que quepa en el startParam lobby-<id>). |
hostPlayerId | cadena | El jugador anfitrión. |
seats | número | Opcional. 2 a 10, 2 por defecto. |
taken | número | Opcional. Asientos llenos, el anfitrión's incluido: 1 a seats, 1 por defecto. |
title | cadena | Opcional, hasta 40 caracteres. |
stake, pot | número | Opcional. En LIA, 0 a 10,000, mostrado en la lista solo. Lia no'sostener o moverlos: estacas de cargo con su propio producto. |
expiresIn | número | Opcional. Segundos que dura el listado, 60 a 3600, 1800 por defecto. |
{ "listed": true, "tableId": "t8k2d", "seats": 2, "taken": 1, "expiresAt": 1761999300000 }Cuándo taken llega seats, la tabla se elimina de la lista en su lugar, y la respuesta es { "listed": false }.
| Estado | Código | Cuándo |
|---|---|---|
| 400 | bad_table_id, bad_seats, bad_taken, bad_title, bad_amount, bad_expires_in | Un campo no'ajustar. |
| 404 | unknown_player | No hay tal host en tu aplicación. |
| 429 | too_many_tables | El host ya tiene 3 mesas abiertas en tu aplicación. El cuerpo tiene max. |
#GET/lobby/tables
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request GET 'https://api.lialabs.org/api/apps/v1/lobby/tables' \
--header "Authorization: Bearer $LIA_KEY"Tu app'tablas abiertas en tu clave'tu modo, más reciente primero, hasta 200: cada anfitrión's, con bloques aparte (esos'para cada jugador'su propia vista).
{ "tables": [{ "id": "t8k2d", "game": "your-app", "host": { "name": "amara" }, "seats": 2, "taken": 1, "title": "Quick game", "stake": 5, "pot": 0, "createdAt": 1761998400000, "expiresAt": 1761999300000 }] }#POST/lobby/tables/:id/sit
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request POST 'https://api.lialabs.org/api/apps/v1/lobby/tables/id_example/sit' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example-request-1' \
--data-raw '{
"playerId": "player_example"
}'Asienta a un jugador en una mesa listada, antes de que tu servidor lo deje entrar. Lia rechaza a personas que el anfitrión bloqueó o que bloquearon al anfitrión. Cuando se ocupa el último asiento, la mesa sale de la lista.
{ "playerId": "p_8a1e0c4d2b7f9e3a5c6d" }{ "seated": true, "taken": 2, "seats": 2, "full": true }| Estado | Código | Cuándo |
|---|---|---|
| 404 | unknown_player | No hay tal jugador en tu aplicación. |
| 404 | not_found | La tabla no'no está listado, ha terminado, o el anfitrión y el jugador se bloquearon mutuamente. |
| 409 | full | Cada asiento está ocupado. |
| 409 | own_table | El jugador es el anfitrión. |
#DELETE/lobby/tables/:id
# Set LIA_KEY on your server. Reuse Idempotency-Key only for the same request.
curl --request DELETE 'https://api.lialabs.org/api/apps/v1/lobby/tables/id_example' \
--header "Authorization: Bearer $LIA_KEY" \
--header 'Idempotency-Key: example-request-1'Toma una tabla fuera de la lista, cuando su juego comienza o se cierra. Es seguro repetirlo.
{ "removed": true }removed es false cuando no lo'no está listado.
#Reintentando
Enviar un Idempotency-Key encabezado con cada POST, y el mismo una vez en cada repetición de esa solicitud. Una repetición luego nunca hace nada dos veces, y responde como lo hizo la primera solicitud.
POST /api/apps/v1/notifications
Authorization: Bearer lia_live_…
Content-Type: application/json
Idempotency-Key: 6f1c2a9e-0b7d-4c35-9e1a-2d8f4b7c3a10
{ "playerId": "p_3f9c0a6d1b2e4f5a6b7c", "text": "It's your move." }- Cualquier clave que quieras, 1 a 128 de letras, dígitos,
_,-,.y:. Un UUID por operación es correcto. - La primera solicitud se ejecuta. Si tiene éxito (2xx), su respuesta se guarda durante 24 horas, y un reintento con la misma clave y el mismo cuerpo obtiene esa respuesta nuevamente, con el encabezado
Idempotent-Replayed: true. - Una negación no conserva nada (4xx o 5xx), por lo que puede corregir la causa y reintentar con la misma clave.
- La misma clave con un cuerpo diferente es
422 idempotency_key_reused. - La misma clave mientras la primera aún se ejecuta es
409 idempotency_key_in_useconRetry-After: 1. Reintenta, y obtienes la primera's respuesta. - Las claves son su aplicación'propio, y los modos de prueba y en vivo los mantienen separados. La misma clave en otro punto de conexión es otra clave.
Sin el encabezado, la mayoría de los puntos finales aún son seguros para reintentar: las lecturas no cambian nada, entregar y reembolsar son seguros para repetir, y las recompensas se pagan una vez por key. Las notificaciones son la excepción: sin el encabezado, un reintentó envía la notificación nuevamente.
Traducido automáticamente. El inglés es la fuente de verdad. Leer en inglés