Abonnements récurrents
Vous encaissez un montant fixe tous les mois, tous les 3 mois, tous les 6 mois ou une fois par an, sans que votre client ait à refaire la démarche. Il valide une seule fois, à la souscription ; ensuite chaque échéance part toute seule et vous êtes prévenu du résultat.
À lire avant d'intégrer. En mobile money, un prélèvement automatique n'est possible qu'avec les opérateurs qui envoient une demande de confirmation sur le téléphone. Ceux qui exigent un code USSD composé par le client (Orange Money Côte d'Ivoire et Burkina) ou un passage par une autre application (Wave, Djamo) réclament sa présence à chaque échéance : ils sont refusés à la souscription. Le tableau ci-dessous fait foi.
Moyens acceptés, pays par pays
Cette grille est la seule qui compte : l'API refuse tout moyen absent de la colonne de gauche. Elle est générée depuis notre configuration, elle ne peut donc pas être périmée.
Sénégal
SN-
Accepté
Yas
free-money-senegal -
Accepté
Expresso
expresso-senegal -
Accepté
Wizall
wizall-senegal -
Refusé
Orange Money
orange-money-senegalvalidation dans une autre application
-
Refusé
Wave
wave-senegalvalidation dans une autre application
-
Refusé
Djamo
djamo-senegalvalidation dans une autre application
Côte d’Ivoire
CI-
Accepté
MTN
mtn-ci -
Accepté
Moov
moov-ci -
Refusé
Orange Money
orange-money-cicode USSD à composer
-
Refusé
Wave
wave-civalidation dans une autre application
-
Refusé
Djamo
djamo-civalidation dans une autre application
Bénin
BJ-
Accepté
Moov
moov-benin -
Accepté
MTN
mtn-benin -
Accepté
Celtiis Cash
celtiis-benin
Burkina Faso
BF-
Accepté
Moov
moov-burkina -
Refusé
Orange Money
orange-money-burkinacode USSD à composer
Togo
TG-
Accepté
Yas
t-money-togo -
Accepté
Moov
moov-togo
Mali
ML-
Accepté
Orange Money
orange-money-mali -
Accepté
Moov
moov-mali
Cameroun
CM-
Accepté
MTN
mtn-cameroun
Vous pouvez aussi demander cette liste au moment d'afficher votre formulaire, pour ne proposer que des choix valides :
curl -H "TCHIN-PUBLIC-KEY: tchin_pk_xxxxxxxx" \
-H "TCHIN-PRIVATE-KEY: tchin_sk_xxxxxxxx" \
"https://tchin.tech/api/v1/methods?for=subscription"
Chaque moyen renvoyé porte désormais subscription_eligible. Sans le paramètre
for=subscription, l'endpoint /methods renvoie tous les moyens et vous
filtrez vous-même sur ce champ.
Le premier paiement enregistre le moyen
Il n'existe pas de « jeton de carte » en mobile money. Ce que nous enregistrons, c'est le triplet
pays + opérateur + numéro. Pour être sûrs qu'il répond vraiment, le tout premier paiement
est majoré de 10 FCFA. Le client paie donc montant + 10 une seule fois,
à la souscription ; toutes les échéances suivantes sont au montant exact.
Ces 10 FCFA couvrent la vérification et ne sont pas remboursés — aucun remboursement n'est géré sur les abonnements. Annoncez-le sur votre page de souscription.
Créer un abonnement
curl -X POST https://tchin.tech/api/v1/subscriptions \
-H "TCHIN-PUBLIC-KEY: tchin_pk_xxxxxxxx" \
-H "TCHIN-PRIVATE-KEY: tchin_sk_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"plan_name": "Streamy Premium",
"amount": 2000,
"interval": "monthly",
"country": "TG",
"method": "t-money-togo",
"customer_phone": "90123456",
"customer_name": "Awa Diop",
"customer_email": "awa@example.com",
"external_ref": "CLI-8842",
"remind_email": true,
"callback_url": "https://votre-site.com/webhook/tchin"
}'
| Champ | Obligatoire | Détail |
|---|---|---|
plan_name | oui | Ce que voit le client dans l'email de rappel. |
amount | oui | Montant par échéance, en FCFA. Minimum 200. |
interval | oui | monthly, quarterly, biannual, yearly. |
country · method | oui | Doivent figurer dans la grille ci-dessus. |
customer_phone | oui | Le numéro qui sera débité à chaque échéance. |
customer_email | non | Nécessaire si vous voulez le rappel avant échéance. |
external_ref | non | Votre propre identifiant, renvoyé tel quel partout. |
remind_email | non | Rappel au client 3 jours avant. Activé par défaut. |
fees_on_customer | non | Frais Tchin à la charge du client. Par défaut, réglage de l'application. |
callback_url | non | Où recevoir les événements. Par défaut, le webhook de l'application. |
env | non | test ou live. |
Réponse — 201
{
"success": true,
"message": "Demande de confirmation envoyée au client. L’abonnement s’activera dès qu’il aura validé.",
"subscription": {
"reference": "sub_9f2ad91c4e77b0c31a5d",
"external_ref": "CLI-8842",
"plan": "Streamy Premium",
"amount": 2000,
"interval": "monthly",
"interval_label": "Tous les mois",
"status": "pending",
"currency": "XOF",
"customer": { "name": "Awa Diop", "email": "awa@example.com", "phone": "90123456" },
"method": { "country": "TG", "operator": "t-money-togo" },
"charges_count": 0,
"next_charge_at": null,
"mode": "live"
},
"first_charge": {
"amount": 2010,
"setup_fee": 10,
"note": "Les frais d’enregistrement vérifient le moyen de paiement. Ils ne sont pas remboursés."
}
}
L'abonnement naît en pending. Une demande de confirmation part sur le téléphone du client.
Il valide avec son code secret : l'abonnement passe active et vous recevez
subscription.activated.
Réponse — 422, moyen non éligible
{
"success": false,
"message": "Ce moyen de paiement ne permet pas le prélèvement automatique : il exige la présence du client à chaque échéance.",
"chargeable_methods": ["mtn-ci", "moov-ci"]
}
/api/v1/subscriptions
Essayer
Utilisez vos clés de test : en mode test aucun argent ne circule. Vos clés restent dans ce navigateur — elles ne sont ni enregistrées ni transmises à un tiers. Dans votre intégration réelle, les clés doivent rester sur votre serveur, jamais dans une page.
Le cycle de vie
| Statut | Ce que ça veut dire |
|---|---|
pending | Créé, en attente de la toute première validation du client. |
active | En cours. next_charge_at donne la prochaine échéance. |
past_due | Une échéance a échoué. Le client dispose de 3 jours pour régulariser ; nous relançons une fois par jour. |
expired | Les 3 jours sont passés sans paiement. Plus aucune tentative. |
cancelled | Résilié par vous. La période déjà payée reste acquise au client. |
Ce que vous recevez
Chaque événement part vers votre callback_url, signé comme les webhooks de
paiement — voir la page Webhooks
pour la vérification de la signature. Vérifiez-la toujours : c'est elle qui prouve que l'appel vient de nous.
| Événement | Quand |
|---|---|
subscription.activated | Le client a validé la souscription. C'est le feu vert pour ouvrir son accès. |
subscription.charged | Une échéance a été payée. Prolongez son accès. |
subscription.payment_failed | Échéance refusée. Le délai de grâce court ; ne coupez pas encore. |
subscription.expired | Délai de grâce dépassé. Coupez l'accès. |
subscription.cancelled | Résiliation. Coupez à la fin de la période payée. |
subscription.activation_failed | La toute première validation n'a jamais abouti. |
{
"event": "subscription.charged",
"reference": "sub_9f2ad91c4e77b0c31a5d",
"status": "active",
"amount": 2000,
"currency": "XOF",
"mode": "live",
"timestamp": 1786000000,
"signature": "3f9c1e…",
"subscription": { "next_charge_at": "2026-10-14T09:00:00+00:00", "charges_count": 3, "...": "..." }
}
Résilier
curl -X POST https://tchin.tech/api/v1/subscriptions/sub_9f2ad91c4e77b0c31a5d/cancel \
-H "TCHIN-PUBLIC-KEY: tchin_pk_xxxxxxxx" \
-H "TCHIN-PRIVATE-KEY: tchin_sk_xxxxxxxx" \
-d '{"reason":"Demande du client"}'
La résiliation est immédiate : plus aucun prélèvement. Aucun remboursement n'est effectué —
si le client a payé le mois en cours, il en garde le bénéfice jusqu'au terme. À vous de couper
l'accès à la bonne date, que next_charge_at vous donnait avant la résiliation.
Suivre un abonnement
| Appel | Ce qu'il renvoie |
|---|---|
GET /subscriptions | Vos abonnements. Filtrable par ?status=active. |
GET /subscriptions/{reference} | Le détail d'un abonnement. |
GET /subscriptions/{reference}/charges | L'historique des échéances, tentative par tentative. |
POST /subscriptions/{reference}/cancel | Résiliation. |
/api/v1/subscriptions
Lister vos abonnements
Utilisez vos clés de test : en mode test aucun argent ne circule. Vos clés restent dans ce navigateur — elles ne sont ni enregistrées ni transmises à un tiers. Dans votre intégration réelle, les clés doivent rester sur votre serveur, jamais dans une page.
Le rappel avant échéance
Si remind_email est actif et que vous nous avez donné l'email du client, nous lui écrivons
3 jours avant chaque prélèvement : le plan, le montant, la date et le numéro qui sera débité.
Un débit qui tombe sans prévenir, c'est une réclamation — et souvent une résiliation.
L'email renvoie le client vers vous pour toute résiliation : c'est chez vous qu'il s'est abonné, c'est chez vous qu'il arrête.
Bon à savoir
- Chaque échéance est un encaissement ordinaire : elle apparaît dans vos transactions et suit votre grille de frais habituelle.
- Un prélèvement n'est jamais instantané : nous envoyons la demande, le client valide. Attendez le webhook, ne présumez rien de la réponse à la création.
- Si le numéro du client change, résiliez et créez un nouvel abonnement : le moyen enregistré ne se modifie pas.
- En mode
test, aucun argent ne circule et les webhooks portent"mode": "test".