Référence du serveur
Serveur API
Copier la page
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 base | https://api.lialabs.org/api/apps/v1 |
| Authentification | Authorization: Bearer <your key>, votre clé de test (lia_test_…) ou clé en direct (lia_live_…) |
| Corps | JSON, avec Content-Type: application/json |
| Montants | Dans $LIA, en nombres, à 6 décimales |
| Temps | Millisecondes 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 :
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 }| Statut | Code | Quand |
|---|---|---|
| 401 | bad_key | Aucune 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"
}'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…" }| Champ | Type | |
|---|---|---|
session | chaîne | Le 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"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 :
| Champ | Type | |
|---|---|---|
id | chaîne | Aimer ch_9b1f…. |
playerId | chaîne | Qui a payé. |
productId | chaîne | Ce qu'ils ont payé. |
amount | nombre | Ce qu'ils ont payé, en $LIA. |
status | chaîne | paid, delivered ou refunded. |
mode | chaîne | test ou live. |
createdAt | nombre | Quand il a été payé. |
deliveredAt | nombre ou null | Quand vous l'avez livré. |
refundedAt | nombre ou null | Quand 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"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
}
}| Statut | Code | Quand |
|---|---|---|
| 404 | not_found | Aucune 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'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, "…": "…" } }| Statut | Code | Quand |
|---|---|---|
| 404 | not_found | Aucune telle charge dans votre clé'le mode. |
| 409 | refunded | Il 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'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é.
| Statut | Code | Quand |
|---|---|---|
| 404 | not_found | Aucune 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"
}'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"
}| Champ | Type | |
|---|---|---|
playerId | chaîne | Le joueur à payer. |
amount | nombre | Dans $LIA, plus de 0 et au plus 10,000, à 6 décimales. |
key | chaî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é. |
reason | chaîne | Optionnel, 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.
| Statut | Code | Quand |
|---|---|---|
| 400 | bad_amount | amount n'est pas't un nombre supérieur à 0 et jusqu'à 10,000. |
| 400 | bad_key_field | key est manquant ou pas dans la bonne forme. |
| 404 | unknown_player | Aucun joueur tel dans votre application. |
| 409 | pool_empty | Le pool n'est pas'ne pas tenir amount. Le corps a pool, quoi's durée de vie |
| 429 | daily_limit | Cela 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"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"
}'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" }| Champ | Type | |
|---|---|---|
playerId | chaîne | À qui informer. |
text | chaîne | 1 à 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. |
startParam | chaîne | Optionnel. 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).
| Statut | Code | Quand |
|---|---|---|
| 400 | bad_text | Vide, trop long, ou non autorisé. Lorsqu'il'ce que dit le texte, problem est link, phone ou scam. |
| 400 | bad_start_param | startParam n'est pas'ne pas être dans la bonne forme. |
| 403 | notifications_off | Votre application ne peut pas envoyer de notifications (son nombre quotidien est 0). |
| 403 | not_allowed | Ce joueur n'a pas'n'autorisez pas votre application'les notifications. |
| 404 | unknown_player | Aucun joueur tel, ou pas un de votre clé'le mode (une clé de test n'atteint que vos testeurs). |
| 429 | rate_limited | Une 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"
}'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 }| Champ | Type | |
|---|---|---|
adId | chaîne | L'id de Lia.showAd(). |
playerId | chaîne | Le joueur auquel elle a été montrée. Vérifiez-le'celui qui pose la question. |
format | chaî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. |
watched | booléen | Regardé jusqu'à la fin (ou, pour une publicité interstitielle, bannière ou native, affiché). |
watchedAt | nombre ou null | Quand. |
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).
| Statut | Code | Quand |
|---|---|---|
| 404 | not_found | Aucune 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 :
| Champ | Type | |
|---|---|---|
id | chaîne | Votre table'id. |
game | chaîne | Votre application'id. |
host | objet | { name }: l'hôte's Lia nom d'utilisateur. |
seats, taken | nombre | Nombre total de sièges, et pris. |
title | chaîne ou null | Filtré comme tout ce que les gens lisent sur Lia. |
stake, pot | nombre | Dans LIA, pour l'affichage. |
createdAt, expiresAt | nombre |
#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
}'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 }| Champ | Type | |
|---|---|---|
tableId | chaîne | À vous, 1 à 57 de lettres, chiffres, _ et - (assez court pour tenir dans le startParam lobby-<id>). |
hostPlayerId | chaîne | Le joueur qui l'héberge. |
seats | nombre | Optionnel. 2 à 10, 2 par défaut. |
taken | nombre | Optionnel. Places occupées, l'hôte'inclus : 1 à seats, 1 par défaut. |
title | chaîne | Optionnel, jusqu'à 40 caractères. |
stake, pot | nombre | Optionnel. 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. |
expiresIn | nombre | Optionnel. 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 }.
| Statut | Code | Quand |
|---|---|---|
| 400 | bad_table_id, bad_seats, bad_taken, bad_title, bad_amount, bad_expires_in | Un champ n''ça ne marche pas. |
| 404 | unknown_player | Aucun hôte tel dans votre application. |
| 429 | too_many_tables | L'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"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"
}'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 }| Statut | Code | Quand |
|---|---|---|
| 404 | unknown_player | Aucun joueur tel dans votre application. |
| 404 | not_found | Le tableau n''ne pas être listé, a pris fin, ou l'hôte et le joueur se sont bloqués mutuellement. |
| 409 | full | Chaque siège est occupé. |
| 409 | own_table | Le 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'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_useavecRetry-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