API : solde, licences, retraits et factures
LanaChat est payé à partir d’un solde prépayé en dollars US : les licences (une par compte Telegram, 30 jours) et une commission sur les ventes nettes sont déduites de ce solde. Vous le rechargez avec des dépôts en crypto. Les gains d’affiliation peuvent être retirés. Chaque point de terminaison de facturation nécessite un token owner : dans les exemples, $LANACHAT_TOKEN en contient un.
Endpoints #
| Method | Path | Description | Permission | Status |
|---|---|---|---|---|
| GET | /billing/balance | Le solde, les ventes nettes du mois et le palier de commission | owner | Planned |
| GET | /billing/ledger | Tous les mouvements : dépôts, licences, commission, remboursements | owner | Planned |
| GET | /billing/ledger.csv | Le même grand livre au format CSV (from=, to=) | owner | Planned |
| GET | /billing/deposit-addresses | Une adresse de dépôt par blockchain (avec un mémo sur Solana) | owner | Planned |
| GET | /billing/deposits | Dépôts et leurs confirmations | owner | Planned |
| GET | /billing/licences | Licences en stock et assignées, avec jours restants | owner | Planned |
| POST | /billing/licences/buy | Acheter des licences : une seule ou un pack de 10, 25 ou 50 | owner | Planned |
| POST | /billing/licences/assign | Attribuer une licence du stock à un compte | owner | Planned |
| POST | /billing/licences/unassign | Reprendre une licence en stock avec ses jours restants | owner | Planned |
| PATCH | /billing/licences/auto-renew | Activer ou désactiver le renouvellement automatique pour un compte | owner | Planned |
| GET | /billing/withdrawals | Retraits d’affiliés et leur statut | owner | Planned |
| POST | /billing/withdrawals | Demander un retrait des gains d’affiliation (à partir de $500) | owner | Planned |
| GET | /billing/invoices | Relevés mensuels (year=) | owner | Planned |
| GET | /billing/invoices/{id}.pdf | Un relevé au format PDF | owner | Planned |
| PUT | /billing/details | Nom de l’entreprise, adresse et numéro de TVA sur les relevés | owner | Planned |
Prix en un tableau #
| Quoi | Prix |
|---|---|
| Une licence (un compte Telegram, 30 jours) | $19 |
| Pack de 10 licences | $170 |
| Pack de 25 licences | $375 |
| Pack de 50 licences | $650 |
| Commission jusqu’à $30k de ventes nettes dans le mois | 12% des ventes AI, 4% des ventes manuelles |
| Commission de $30k à $100k | 10% et 3% |
| Commission au-delà de $100k | 8% et 2% |
Le compteur correspond aux ventes nettes de tout l’espace de travail dans le mois calendaire ; il se réinitialise le 1er. Les Telegram Stars comptent pour $0.013 chacun dans les ventes nettes.
L’objet solde #
{
"balance_cents": 48210,
"month": "2026-10",
"net_sales_cents": 1870400,
"tier": { "up_to_cents": 3000000, "ai_rate_bp": 1200, "manual_rate_bp": 300 },
"licences": { "in_stock": 4, "assigned": 11, "expiring_7d": 2 },
"low_balance": false
}
| Champ | Type | Description |
|---|---|---|
balance_cents | entier | Solde prépayé, en cents US |
month | chaîne | Mois calendaire comptabilisé, YYYY-MM |
net_sales_cents | entier | Ventes nettes de l’espace de travail ce mois |
tier | objet | Palier actuel : plafond up_to_cents, taux AI et taux manuel en points de base |
licences | objet | Licences in_stock, assigned, et celles finissant dans 7 jours (expiring_7d) |
low_balance | booléen | true quand le solde ne couvre pas les 7 prochains jours de licences |
Les taux sont en points de base : 1200 correspond à 12%.
L’objet ligne du grand livre #
Chaque ligne de Billing › Activity dans la Console.
{
"id": "led_90211",
"at": "2026-10-06T14:40:00Z",
"kind": "licences",
"label": "Licences · pack of 10",
"amount_cents": -17000,
"balance_after_cents": 31210
}
| Champ | Type | Description |
|---|---|---|
id | chaîne | La ligne |
at | chaîne | ISO 8601, UTC |
kind | chaîne | deposit, licences, commission, refund, affiliate ou other |
label | chaîne | Texte de la ligne, comme dans la Console |
amount_cents | entier | Positif quand de l’argent entre, négatif quand il sort |
balance_after_cents | entier | Solde après cette ligne |
Une ligne commission correspond à une vente : la Console affiche le fan, le palier, qui a envoyé l’offre (AI ou manuel), comment le net a été calculé ("12,500 ★ × $0.013") et le taux.
L’objet dépôt #
{
"id": "dep_4",
"at": "2026-10-06T13:52:00Z",
"chain": "usdt-tron",
"sent_cents": 100000,
"fee_cents": 1000,
"credited_cents": 99000,
"status": "pending",
"confirmations": "12/19"
}
| Champ | Type | Description |
|---|---|---|
id | chaîne | Le dépôt |
at | chaîne | Date de réception, ISO 8601 |
chain | chaîne | usdc-eth, usdc-sol, usdt-sol, usdt-tron ou usdt-eth |
sent_cents, fee_cents, credited_cents | entier | Montant envoyé, frais, montant crédité au solde |
status | chaîne | pending puis confirmed |
confirmations | chaîne | Confirmations réseau comptées, pendant le statut pending |
USDC sur Ethereum est crédité 1:1 sans frais. Chaque autre blockchain applique 1% de frais : le dépôt est converti en USDC (ERC20) à l’arrivée. Le minimum est $25 par recharge.
L’objet licence #
{
"account_id": "acc_1001",
"creator_id": "cr_lea",
"days_left": 18,
"expires_at": "2026-10-24T09:00:00Z",
"auto_renew": true
}
| Champ | Type | Description |
|---|---|---|
account_id | chaîne | Le compte Telegram sur lequel la licence est active |
creator_id | chaîne | Sa créatrice |
days_left | entier | Jours restants avant expiration, sur 30 |
expires_at | chaîne | Date d’expiration |
auto_renew | booléen | Renouvellement automatique depuis le stock (ou achat d’une licence simple) à l’expiration |
Les licences en stock sont comptées, non listées individuellement : chacune garde ses jours restants (30 pour une neuve).
L’objet retrait #
{ "id": "wd_118", "status": "pending_review", "amount_cents": 50000, "requested_at": "2026-10-06T15:00:00Z", "tx_hash": null }
| Champ | Type | Description |
|---|---|---|
id | chaîne | Le retrait |
status | chaîne | pending_review, sent (avec tx_hash) ou rejected avec une raison |
amount_cents | entier | Montant demandé, au moins 50000 ($500) |
requested_at | chaîne | ISO 8601, UTC |
tx_hash | chaîne ou null | La transaction, une fois envoyée |
L’objet facture #
{
"id": "LC-2026-09",
"month": "2026-09",
"licences_cents": 22800,
"commission_cents": 930000,
"total_cents": 952800,
"status": "paid",
"pdf_url": "https://api.lanachat.ai/v1/billing/invoices/LC-2026-09.pdf"
}
| Champ | Type | Description |
|---|---|---|
id | chaîne | Numéro du relevé, LC-YYYY-MM |
month | chaîne | Mois couvert |
licences_cents, commission_cents, total_cents | entier | Licences, commission et total du mois |
status | chaîne | Payé, en cours (mois actuel) ou échoué |
pdf_url | chaîne | PDF du relevé |
Solde et grand livre #
Obtenir le solde #
GET /billing/balance · owner
curl https://api.lanachat.ai/v1/billing/balance \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse est l’objet solde.
Lister le grand livre #
GET /billing/ledger · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
from, to | chaîne | Non | Jours YYYY-MM-DD, UTC, inclus |
limit, cursor | nombre, chaîne | Non | Pagination |
curl "https://api.lanachat.ai/v1/billing/ledger?from=2026-10-01&to=2026-10-06" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{ "id": "led_90211", "at": "2026-10-06T14:40:00Z", "kind": "licences", "label": "Licences · pack of 10", "amount_cents": -17000, "balance_after_cents": 31210 },
{ "id": "led_90207", "at": "2026-10-06T13:20:00Z", "kind": "commission", "label": "Lea · Marco", "amount_cents": -468, "balance_after_cents": 48210 },
{ "id": "led_90150", "at": "2026-10-05T09:02:00Z", "kind": "deposit", "label": "Deposit · USDC on Ethereum", "amount_cents": 300000, "balance_after_cents": 48678 }
],
"next_cursor": "eyJpZCI6ImxlZF85MDE0OSJ9"
}
Exporter le grand livre en CSV #
GET /billing/ledger.csv · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
from, to | chaîne | Non | Jours YYYY-MM-DD, UTC |
curl "https://api.lanachat.ai/v1/billing/ledger.csv?from=2026-09-01&to=2026-09-30" \
-H "Authorization: Bearer $LANACHAT_TOKEN" -o ledger-2026-09.csv
Les mêmes lignes que Export CSV dans Billing › Activity, prêtes pour votre comptable.
Dépôts #
Obtenir les adresses de dépôt #
GET /billing/deposit-addresses · owner
curl https://api.lanachat.ai/v1/billing/deposit-addresses \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse donne une adresse par blockchain (Ethereum, Solana, Tron) et, pour Solana, le mémo.
Attention Sur Solana, un dépôt envoyé sans mémo ne peut pas être rattaché à votre espace de travail. Envoyez toujours l’adresse et le mémo.
Vous pouvez envoyer des USDC sur Ethereum (ERC20), USDC sur Solana, USDT sur Solana, USDT sur Tron (TRC20) ou USDT sur Ethereum (ERC20). Les frais réseau de votre transfert sont à votre charge.
Lister les dépôts #
GET /billing/deposits · owner
curl https://api.lanachat.ai/v1/billing/deposits \
-H "Authorization: Bearer $LANACHAT_TOKEN"
{
"data": [
{ "id": "dep_4", "at": "2026-10-06T13:52:00Z", "chain": "usdt-tron", "sent_cents": 100000, "fee_cents": 1000, "credited_cents": 99000, "status": "pending", "confirmations": "12/19" },
{ "id": "dep_3", "at": "2026-10-05T09:02:00Z", "chain": "usdc-eth", "sent_cents": 300000, "fee_cents": 0, "credited_cents": 300000, "status": "confirmed", "confirmations": null }
],
"next_cursor": null
}
Le solde est crédité automatiquement quand un dépôt est confirmed ; il apparaît alors aussi comme une ligne deposit dans le grand livre.
Licences #
Lister les licences #
GET /billing/licences · owner
curl https://api.lanachat.ai/v1/billing/licences \
-H "Authorization: Bearer $LANACHAT_TOKEN"
La réponse donne les licences en stock et un objet licence par compte assigné, avec ses jours restants.
Acheter des licences #
POST /billing/licences/buy · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
pack | entier | Oui | 1 (simple, $19), 10 ($170), 25 ($375) ou 50 ($650) |
qty | entier | Oui | Nombre de packs |
curl -X POST https://api.lanachat.ai/v1/billing/licences/buy \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"pack": 10, "qty": 1}'
{ "licences_added": 10, "amount_cents": 17000, "balance_cents": 31210, "ledger_id": "led_90211" }
Les licences vont immédiatement dans votre stock. Un solde insuffisant répond 402 (insufficient_balance). Les licences en stock n’expirent jamais, et les licences achetées ne sont pas remboursables.
Assigner une licence #
POST /billing/licences/assign · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
account_id | chaîne | Oui | Le compte Telegram qui reçoit une licence |
curl -X POST https://api.lanachat.ai/v1/billing/licences/assign \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"account_id": "acc_1001"}'
La réponse est l’objet licence du compte. La licence du stock avec le moins de jours restants est utilisée en premier : ses jours restants, ou 30 jours si elle est neuve. Le renouvellement automatique est activé par défaut.
Reprendre une licence #
POST /billing/licences/unassign · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
account_id | chaîne | Oui | Le compte qui rend sa licence |
curl -X POST https://api.lanachat.ai/v1/billing/licences/unassign \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"account_id": "acc_1001"}'
La licence retourne dans votre stock avec ses jours restants. L’IA cesse de répondre sur ce compte immédiatement. Pour déplacer une licence vers un autre compte, reprenez-la puis assignez-la : elle conserve ses jours, gratuitement.
Activer ou désactiver le renouvellement automatique #
PATCH /billing/licences/auto-renew · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
account_id | chaîne | Oui | Le compte |
auto_renew | booléen | Oui | true pour renouveler à l’expiration |
curl -X PATCH https://api.lanachat.ai/v1/billing/licences/auto-renew \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"account_id": "acc_1001", "auto_renew": false}'
À l’expiration, le renouvellement automatique prend d’abord une licence dans votre stock, ou achète une licence simple ($19) si le stock est vide. Il ne peut pas acheter sans solde : surveillez low_balance ou le webhook billing.low_balance webhook.
Retraits d’affiliés #
Lister les retraits #
GET /billing/withdrawals · owner
curl https://api.lanachat.ai/v1/billing/withdrawals \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Une liste d’objets retrait, du plus récent au plus ancien.
Demander un retrait #
POST /billing/withdrawals · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
amount_cents | entier | Oui | Au moins 50000 ($500), au maximum disponible à retirer |
curl -X POST https://api.lanachat.ai/v1/billing/withdrawals \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"amount_cents": 50000}'
{ "id": "wd_118", "status": "pending_review", "amount_cents": 50000, "requested_at": "2026-10-06T15:00:00Z", "tx_hash": null }
Les gains sont envoyés en USDC au portefeuille enregistré, 7 jours après la fin du mois. Seuls les gains d’affiliation peuvent être retirés, jamais le solde prépayé. Une demande inférieure à $500 est refusée.
Relevés #
Lister les relevés #
GET /billing/invoices · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
year | entier | Non | Par exemple 2026 |
curl "https://api.lanachat.ai/v1/billing/invoices?year=2026" \
-H "Authorization: Bearer $LANACHAT_TOKEN"
Un objet facture par mois.
Télécharger un relevé #
GET /billing/invoices/{id}.pdf · owner
curl https://api.lanachat.ai/v1/billing/invoices/LC-2026-09.pdf \
-H "Authorization: Bearer $LANACHAT_TOKEN" -o LC-2026-09.pdf
Attention Vérifiez vos relevés. Une erreur de facturation doit être signalée dans les 60 jours suivant le relevé qui la montre ; passé ce délai, le relevé est définitif.
Définir les détails de facturation #
PUT /billing/details · owner
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
company | chaîne | Non | Nom de l’entreprise |
email | chaîne | Non | E-mail de facturation |
address, city, postal, country | chaîne | Non | Adresse postale |
vat | chaîne | Non | Numéro de TVA |
curl -X PUT https://api.lanachat.ai/v1/billing/details \
-H "Authorization: Bearer $LANACHAT_TOKEN" \
-H "Content-Type: application/json" \
-d '{"company": "Mia Agency Ltd", "email": "[email protected]", "address": "12 Market Street", "city": "Dublin", "postal": "D02 X285", "country": "IE", "vat": "IE1234567T"}'
Les mêmes champs que dans Billing › Billing details. Les relevés portent ces informations. Le PUT remplace tout : un champ omis est vidé.