LiaDesarrolladores

Referencia del servidor

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 basehttps://api.lialabs.org/api/apps/v1
AutenticaciónAuthorization: Bearer <your key>, tu clave de prueba (lia_test_…) o clave en vivo (lia_live_…)
CuerposJSON, con Content-Type: application/json
ImportesEn $LIA, como números, a 6 decimales
HorasMilisegundos 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:

lia.js
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 }
EstadoCódigoCuándo
401bad_keySin 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"
}'
Abrir en playground

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…" }
CampoTipo
sessioncadenaEl 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"
Abrir en playground

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:

CampoTipo
idcadenaMe gusta ch_9b1f….
playerIdcadenaQuién pagó.
productIdcadenaLo que pagaron.
amountnúmeroLo que pagaron, en $LIA.
statuscadenapaid, delivered o refunded.
modecadenatest o live.
createdAtnúmeroCuándo se pagó.
deliveredAtnúmero o nuloCuándo lo entregaste.
refundedAtnúmero o nuloCuá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"
Abrir en playground

¿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
  }
}
EstadoCódigoCuándo
404not_foundNo 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'
Abrir en playground

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, "…": "…" } }
EstadoCódigoCuándo
404not_foundNo hay tal cargo en tu clave'tu modo.
409refundedFue 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'
Abrir en playground

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.

EstadoCódigoCuándo
404not_foundNo hay tal cargo en tu clave'tu modo.

#Recompensas

Ver Bolsas de 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"
}'
Abrir en playground

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"
}
CampoTipo
playerIdcadenaEl jugador a pagar.
amountnúmeroEn $LIA, más de 0 y como máximo 10,000, a 6 decimales.
keycadenaTuyo, 1 a 128 de letras, dígitos, _, ., : y -. Una clave paga una vez, para siempre. Sin ella, el Idempotency-Key se utiliza el encabezado.
reasoncadenaOpcional, 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.

EstadoCódigoCuándo
400bad_amountamount no't un número superior a 0 y hasta 10,000.
400bad_key_fieldkey falta o no tiene la forma correcta.
404unknown_playerNo hay tal jugador en tu aplicación.
409pool_emptyLa piscina no'sostener amount. El cuerpo tiene pool, qué'te queda.
429daily_limitEsto 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"
Abrir en playground

¿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"
}'
Abrir en playground

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" }
CampoTipo
playerIdcadenaA quién notificar.
textcadena1 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.
startParamcadenaOpcional. 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).

EstadoCódigoCuándo
400bad_textVacío, demasiado largo o no permitido. Cuando'lo que dice el texto, problem es link, phone o scam.
400bad_start_paramstartParam no'en la forma correcta.
403notifications_offTu app no puede enviar notificaciones (su número diario es 0).
403not_allowedEste jugador no't permitido su aplicación'notificaciones, o las detuvieron.
404unknown_playerNo hay tal jugador, o no uno de tu clave'tu modo alcanza (una clave de prueba solo alcanza a tus probadores).
429rate_limitedSe 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"
}'
Abrir en playground

¿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 }
CampoTipo
adIdcadenaEl id de Lia.showAd().
playerIdcadenaEl jugador al que se le mostró. Revísalo'la persona que pregunta.
formatcadena o nulo"rewarded", "rewardedInterstitial", "interstitial", "banner" o "native" (nulo para anuncios antes de SDK 1.7). Solo "rewarded" y "rewardedInterstitial" valen una recompensa.
watchedbooleanoVisto hasta el final (o, para un anuncio intersticial, de banner o nativo, mostrado).
watchedAtnúmero o nuloCuá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).

EstadoCódigoCuándo
404not_foundNo 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:

CampoTipo
idcadenaSu tabla's id.
gamecadenaTu app's id.
hostobjeto{ name }: el anfitrión's Lia nombre de usuario.
seats, takennúmeroAsientos totales, y ocupados.
titlecadena o nuloFiltrado como todo lo que leen las personas en Lia.
stake, potnúmeroEn LIA, para mostrar.
createdAt, expiresAtnú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
}'
Abrir en playground

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 }
CampoTipo
tableIdcadenaTuyo, 1 a 57 de letras, dígitos, _ y - (lo suficientemente corto para que quepa en el startParam lobby-<id>).
hostPlayerIdcadenaEl jugador anfitrión.
seatsnúmeroOpcional. 2 a 10, 2 por defecto.
takennúmeroOpcional. Asientos llenos, el anfitrión's incluido: 1 a seats, 1 por defecto.
titlecadenaOpcional, hasta 40 caracteres.
stake, potnúmeroOpcional. En LIA, 0 a 10,000, mostrado en la lista solo. Lia no'sostener o moverlos: estacas de cargo con su propio producto.
expiresInnúmeroOpcional. 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 }.

EstadoCódigoCuándo
400bad_table_id, bad_seats, bad_taken, bad_title, bad_amount, bad_expires_inUn campo no'ajustar.
404unknown_playerNo hay tal host en tu aplicación.
429too_many_tablesEl 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"
Abrir en playground

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"
}'
Abrir en playground

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 }
EstadoCódigoCuándo
404unknown_playerNo hay tal jugador en tu aplicación.
404not_foundLa tabla no'no está listado, ha terminado, o el anfitrión y el jugador se bloquearon mutuamente.
409fullCada asiento está ocupado.
409own_tableEl 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'
Abrir en playground

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_use con Retry-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

Escribe para buscar en cada página, método y punto final.