LiaDéveloppeurs

Référence du serveur

L'application API utilise ses propres appels de serveur avec sa clé secrète. Vérifiez les sessions, listez les produits, confirmez, livrez et remboursez les charges, payez les récompenses depuis votre pool, envoyez des notifications, vérifiez les publicités et listez les tables publiques.

#Bases

Adresse de basehttps://api.lialabs.org/api/apps/v1
AuthentificationAuthorization: Bearer <your key>, votre clé de test (lia_test_…) ou clé en direct (lia_live_…)
CorpsJSON, avec Content-Type: application/json
MontantsDans $LIA, en nombres, à 6 décimales
TempsMillisecondes depuis 1970 (UTC)

Appelez-le uniquement depuis votre serveur. Votre clé est un secret : ne la mettez jamais sur votre page.

curl https://api.lialabs.org/api/apps/v1/pool \
  -H "Authorization: Bearer $LIA_KEY"

Un petit assistant utilisé dans les exemples ci-dessous :

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;
}

#Clés et modes

Une clé ne voit jamais que son propre application, et seulement son propre mode : la clé de test voit les sessions de test, les paiements, les joueurs et les publicités ; la clé de production voit les versions de production. Quelque chose de l'autre mode est not_found (ou valid: false). Voir Test et live.

#Erreurs

Les erreurs répondent avec un statut 4xx et un corps avec un error code, parfois avec plus de champs :

{ "error": "pool_empty", "pool": 3.5 }
StatutCodeQuand
401bad_keyAucune clé, une clé de forme incorrecte, une clé inconnue, une clé active alors que votre application n''ne pas être en direct, ou toute touche pendant qu'il's'est mis en pause.

Chaque point de terminaison liste le sien. Tous les codes sont dans Codes d'erreur.

#Sessions

#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"
}'
Ouvrir dans le playground

Vérifie un jeton de session de Lia.init() ou Lia.session(), et vous dit à qui elle appartient.

POST /api/apps/v1/session/verify
Authorization: Bearer lia_live_…
Content-Type: application/json

{ "session": "lias_eyJhcHAiOi…" }
ChampType
sessionchaîneLe jeton de la page.

Réponses 200 de toute façon :

{ "valid": true, "playerId": "p_3f9c0a6d1b2e4f5a6b7c", "mode": "live", "exp": 1761998400000 }
{ "valid": false }

Un jeton est valide lorsqu'il a été signé par Lia, il'pour votre application et votre clé'le mode, et il n''ne pas être terminé (15 minutes après sa création).

#Produits

#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"
Ouvrir dans le playground

Ce que votre application vend, aux prix de Lia'ses enregistrements. Seuls les produits actifs, du plus économique au plus cher.

{
  "products": [
    { "id": "extra-lives", "name": "3 extra lives", "price": 5, "active": true },
    { "id": "gold-pack", "name": "Gold pack", "price": 25, "active": true }
  ]
}

#Frais

Une charge est un paiement sur Lia'la feuille de paiement. Voir Paiements.

L'objet de charge :

ChampType
idchaîneAimer ch_9b1f….
playerIdchaîneQui a payé.
productIdchaîneCe qu'ils ont payé.
amountnombreCe qu'ils ont payé, en $LIA.
statuschaînepaid, delivered ou refunded.
modechaînetest ou live.
createdAtnombreQuand il a été payé.
deliveredAtnombre ou nullQuand vous l'avez livré.
refundedAtnombre ou nullQuand il a été remboursé.

#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"
Ouvrir dans le playground

Cette charge est-elle réelle, payée et de qui ? Toujours vérifiez ici avant de livrer : ne prenez jamais la page'ou un webhook'mot pour le dire.

{
  "charge": {
    "id": "ch_9b1f4c2e7a0d5b8f3e6a1c4d",
    "playerId": "p_3f9c0a6d1b2e4f5a6b7c",
    "productId": "extra-lives",
    "amount": 5,
    "status": "paid",
    "mode": "live",
    "createdAt": 1761998400000,
    "deliveredAt": null,
    "refundedAt": null
  }
}
StatutCodeQuand
404not_foundAucune telle charge pour votre application dans votre clé'le mode.

#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'
Ouvrir dans le playground

Marque une charge livrée, une fois que vous'vous avez donné à la personne ce qu'elle a acheté. Sans danger de répéter : livrer une charge livrée ne change rien et répond de la même manière. Aucun corps.

{ "charge": { "id": "ch_9b1f…", "status": "delivered", "deliveredAt": 1761998405000, "…": "…" } }
StatutCodeQuand
404not_foundAucune telle charge dans votre clé'le mode.
409refundedIl a été remboursé, donc ne'ne pas le livrer. Le corps contient le charge aussi.

#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'
Ouvrir dans le playground

Rend la $LIA à la personne, lorsque vous pouvez'ne pas livrer ce qu'ils ont acheté. Fonctionne sur une charge payée ou livrée. Sécurisé pour être répété : rembourser une charge déjà remboursée répond avec celle-ci et ne paie rien de plus. Aucun corps.

{ "charge": { "id": "ch_9b1f…", "status": "refunded", "refundedAt": 1761998410000, "…": "…" } }

Le prix complet revient à la personne'votre solde, en mode en direct, hors de Lia'sa part et votre part. Un charge.refunded le webhook est envoyé.

StatutCodeQuand
404not_foundAucune telle charge dans votre clé'le mode.

#Récompenses

Voir Pools de récompenses.

#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"
}'
Ouvrir dans le playground

Payer un joueur depuis votre application'le pool de récompenses, une fois par clé.

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"
}
ChampType
playerIdchaîneLe joueur à payer.
amountnombreDans $LIA, plus de 0 et au plus 10,000, à 6 décimales.
keychaîneÀ vous, 1 à 128 de lettres, chiffres, _, ., : et -. Une clé paie une fois, pour toujours. Sans elle, le Idempotency-Key l'en-tête est utilisé.
reasonchaîneOptionnel, jusqu'à 80 caractères (plus long est tronqué). Affiché dans le joueur'activité sous votre application'le nom.

Payé :

{ "status": "paid", "amount": 25, "pool": 975 }

La même clé paie à nouveau rien et répond avec ce que la première a payé :

{ "status": "duplicate", "amount": 25, "pool": 975 }

pool est ce que's restants dans votre réserve de récompenses, et le montant maximum qu'un joueur peut obtenir par jour.'utilisé et la limite quotidienne ne'ne s'applique pas.

StatutCodeQuand
400bad_amountamount n'est pas't un nombre supérieur à 0 et jusqu'à 10,000.
400bad_key_fieldkey est manquant ou pas dans la bonne forme.
404unknown_playerAucun joueur tel dans votre application.
409pool_emptyLe pool n'est pas'ne pas tenir amount. Le corps a pool, quoi's durée de vie
429daily_limitCela ferait passer le joueur au-delà de votre application'la limite quotidienne par joueur (en $LIA, par jour UTC). Le corps a dailyCapPerPlayer.

A reward.paid le webhook est envoyé pour chaque récompense payée (pas pour les doublons).

#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"
Ouvrir dans le playground

Quoi's restants.

{ "balance": 975, "dailyCapPerPlayer": 50, "mode": "live" }

dailyCapPerPlayer est 0 quand il y'le non plafond quotidien. balance est le pool en direct, aussi quand vous demandez avec votre clé de test.

#Notifications

Voir Notifications.

#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"
}'
Ouvrir dans le playground

Envoie une notification à un joueur qui les a autorisés. Cela s'affiche sous votre application'le nom et ouvre votre application avec votre 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" }
ChampType
playerIdchaîneÀ qui informer.
textchaîne1 à 180 caractères. Les espaces et les sauts de ligne deviennent des espaces simples. Aucun lien, numéro de téléphone ou mot utilisé dans des escroqueries.
startParamchaîneOptionnel. 1 à 64 lettres, chiffres, _ et -. Votre page le lit depuis Lia.startParam.

Envoyé :

{ "sent": true, "pushed": true }

pushed est false quand il a atteint Lia'la sonnette mais pas le téléphone (la personne a Lia'pousseurs éteints).

StatutCodeQuand
400bad_textVide, trop long, ou non autorisé. Lorsqu'il'ce que dit le texte, problem est link, phone ou scam.
400bad_start_paramstartParam n'est pas'ne pas être dans la bonne forme.
403notifications_offVotre application ne peut pas envoyer de notifications (son nombre quotidien est 0).
403not_allowedCe joueur n'a pas'n'autorisez pas votre application'les notifications.
404unknown_playerAucun joueur tel, ou pas un de votre clé'le mode (une clé de test n'atteint que vos testeurs).
429rate_limitedUne limite a été atteinte. Pour votre application'ses propres limites le corps a retryAt, lorsque vous pouvez réessayer.

#Publicités

Voir Publicités.

#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"
}'
Ouvrir dans le playground

Cette publicité a-t-elle vraiment été regardée, et par qui ? Vérifiez avant de donner quoi que ce soit pour une vidéo récompensée.

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 }
ChampType
adIdchaîneL'id de Lia.showAd().
playerIdchaîneLe joueur auquel elle a été montrée. Vérifiez-le'celui qui pose la question.
formatchaîne ou null"rewarded", "rewardedInterstitial", "interstitial", "banner" ou "native" (null pour les publicités avant SDK 1.7). Seulement "rewarded" et "rewardedInterstitial" valent une récompense.
watchedbooléenRegardé jusqu'à la fin (ou, pour une publicité interstitielle, bannière ou native, affiché).
watchedAtnombre ou nullQuand.

Demandez avec la clé du mode dans lequel l'annonce a été affichée : une annonce en mode test (toujours l'une de Google'côté, les bannières de test, jamais comptées dans les revenus) est not_found à la clé live.

Lia n'a pas'ne pas marquer une publicité comme utilisée lorsque vous la vérifiez, donc payez chaque adId une fois vous-même (utilisez ad:<adId> en tant que clé de récompense).

StatutCodeQuand
404not_foundAucune telle publicité pour votre application dans votre clé'le mode.

#Lobby

Tables publiques que n'importe qui sur Lia peut trouver. Lia ne conserve que la liste : votre serveur gère la table. Voir Tables publiques.

L'objet tableau :

ChampType
idchaîneVotre table'id.
gamechaîneVotre application'id.
hostobjet{ name }: l'hôte's Lia nom d'utilisateur.
seats, takennombreNombre total de sièges, et pris.
titlechaîne ou nullFiltré comme tout ce que les gens lisent sur Lia.
stake, potnombreDans LIA, pour l'affichage.
createdAt, expiresAtnombre

#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
}'
Ouvrir dans le playground

Liste une table qui'attend les joueurs, ou met à jour sa liste (il garde sa place dans la liste). Référez-le à nouveau chaque fois que le nombre de places change.

{ "tableId": "t8k2d", "hostPlayerId": "p_3f9c0a6d1b2e4f5a6b7c", "seats": 2, "taken": 1, "title": "Quick game", "stake": 5, "expiresIn": 900 }
ChampType
tableIdchaîneÀ vous, 1 à 57 de lettres, chiffres, _ et - (assez court pour tenir dans le startParam lobby-<id>).
hostPlayerIdchaîneLe joueur qui l'héberge.
seatsnombreOptionnel. 2 à 10, 2 par défaut.
takennombreOptionnel. Places occupées, l'hôte'inclus : 1 à seats, 1 par défaut.
titlechaîneOptionnel, jusqu'à 40 caractères.
stake, potnombreOptionnel. Dans LIA, 0 à 10,000, affichés dans la liste uniquement. Lia ne'ne pas tenir ou déplacer : fixez des piquets avec votre propre produit.
expiresInnombreOptionnel. Secondes pendant lesquelles la liste est affichée, 60 à 3600, 1800 par défaut.
{ "listed": true, "tableId": "t8k2d", "seats": 2, "taken": 1, "expiresAt": 1761999300000 }

Quand taken atteint seats, le tableau est retiré de la liste, et la réponse est { "listed": false }.

StatutCodeQuand
400bad_table_id, bad_seats, bad_taken, bad_title, bad_amount, bad_expires_inUn champ n''ça ne marche pas.
404unknown_playerAucun hôte tel dans votre application.
429too_many_tablesL'hôte a déjà 3 tables ouvertes dans votre application. Le corps a 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"
Ouvrir dans le playground

Votre application'les tables ouvertes dans votre clé'le mode, du plus récent au plus ancien, jusqu'à 200 : chaque hôte'avec les blocs laissés de côté (cela'pour chaque joueur'sa propre vue).

{ "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"
}'
Ouvrir dans le playground

Assoit un joueur à une table listée, avant que votre serveur ne les laisse entrer. Lia refuse les personnes bloquées par l'hôte ou qui ont bloqué l'hôte. Lorsque le dernier siège est pris, la table quitte la liste.

{ "playerId": "p_8a1e0c4d2b7f9e3a5c6d" }
{ "seated": true, "taken": 2, "seats": 2, "full": true }
StatutCodeQuand
404unknown_playerAucun joueur tel dans votre application.
404not_foundLe tableau n''ne pas être listé, a pris fin, ou l'hôte et le joueur se sont bloqués mutuellement.
409fullChaque siège est occupé.
409own_tableLe joueur est l'hôte.

#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'
Ouvrir dans le playground

Prend un tableau hors de la liste, lorsqu'une partie commence ou se ferme. Sécurisé à répéter.

{ "removed": true }

removed est false quand il n'était pas'ne pas être listé.

#Nouvelle tentative

Envoyer un Idempotency-Key l'en-tête avec chaque POST, et la même à chaque nouvelle tentative de cette requête. Une tentative de nouvelle fois ne fait jamais rien deux fois, et répond comme l'a fait la première requête.

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." }
  • N'importe quelle clé que vous voulez, 1 à 128 de lettres, chiffres, _, -, . et :. Un UUID par opération est correct.
  • La première requête s'exécute. Si cela réussit (2xx), sa réponse est conservée pendant 24 heures, et une nouvelle tentative avec la même clé et le même corps obtient à nouveau cette réponse, avec l'en-tête Idempotent-Replayed: true.
  • Un refus ne conserve rien (4xx ou 5xx), vous pouvez ainsi corriger la cause et réessayer avec la même clé.
  • La même clé avec un corps différent est 422 idempotency_key_reused.
  • La même clé pendant que la première est toujours en cours est 409 idempotency_key_in_use avec Retry-After: 1. Réessayez, et vous obtenez le premier'votre réponse.
  • Les clés sont votre application'son, et les modes test et en direct les conservent séparés. La même clé sur un autre point de terminaison est une autre clé.

Sans l'en-tête, la plupart des points de terminaison sont toujours sûrs à réessayer : les lectures ne changent rien, la livraison et le remboursement sont sûrs à répéter, et les récompenses sont payées une seule fois par key. Les notifications sont l'exception : sans l'en-tête, un réessai envoie à nouveau la notification.

Traduit automatiquement. L'anglais est la source de vérité. Lire en anglais

Tapez pour rechercher sur toutes les pages, méthodes et points de terminaison.