Tchin Docs

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
  • Yas

    free-money-senegal
    Accepté
  • Expresso

    expresso-senegal
    Accepté
  • Wizall

    wizall-senegal
    Accepté
  • Orange Money

    orange-money-senegal

    validation dans une autre application

    Refusé
  • Wave

    wave-senegal

    validation dans une autre application

    Refusé
  • Djamo

    djamo-senegal

    validation dans une autre application

    Refusé

Côte d’Ivoire

CI
  • MTN

    mtn-ci
    Accepté
  • Moov

    moov-ci
    Accepté
  • Orange Money

    orange-money-ci

    code USSD à composer

    Refusé
  • Wave

    wave-ci

    validation dans une autre application

    Refusé
  • Djamo

    djamo-ci

    validation dans une autre application

    Refusé

Bénin

BJ
  • Moov

    moov-benin
    Accepté
  • MTN

    mtn-benin
    Accepté
  • Celtiis Cash

    celtiis-benin
    Accepté

Burkina Faso

BF
  • Moov

    moov-burkina
    Accepté
  • Orange Money

    orange-money-burkina

    code USSD à composer

    Refusé

Togo

TG
  • Yas

    t-money-togo
    Accepté
  • Moov

    moov-togo
    Accepté

Mali

ML
  • Orange Money

    orange-money-mali
    Accepté
  • Moov

    moov-mali
    Accepté

Cameroun

CM
  • MTN

    mtn-cameroun
    Accepté

Vous pouvez aussi demander cette liste au moment d'afficher votre formulaire, pour ne proposer que des choix valides :

cURL
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
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"
      }'
ChampObligatoireDétail
plan_nameouiCe que voit le client dans l'email de rappel.
amountouiMontant par échéance, en FCFA. Minimum 200.
intervalouimonthly, quarterly, biannual, yearly.
country · methodouiDoivent figurer dans la grille ci-dessus.
customer_phoneouiLe numéro qui sera débité à chaque échéance.
customer_emailnonNécessaire si vous voulez le rappel avant échéance.
external_refnonVotre propre identifiant, renvoyé tel quel partout.
remind_emailnonRappel au client 3 jours avant. Activé par défaut.
fees_on_customernonFrais Tchin à la charge du client. Par défaut, réglage de l'application.
callback_urlnonOù recevoir les événements. Par défaut, le webhook de l'application.
envnontest ou live.

Réponse — 201

JSON
{
  "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

JSON
{
  "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"]
}
POST /api/v1/subscriptions Essayer
Vos clés se trouvent dans votre espace, onglet API.

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

StatutCe que ça veut dire
pendingCréé, en attente de la toute première validation du client.
activeEn cours. next_charge_at donne la prochaine échéance.
past_dueUne échéance a échoué. Le client dispose de 3 jours pour régulariser ; nous relançons une fois par jour.
expiredLes 3 jours sont passés sans paiement. Plus aucune tentative.
cancelledRé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énementQuand
subscription.activatedLe client a validé la souscription. C'est le feu vert pour ouvrir son accès.
subscription.chargedUne é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.expiredDélai de grâce dépassé. Coupez l'accès.
subscription.cancelledRésiliation. Coupez à la fin de la période payée.
subscription.activation_failedLa toute première validation n'a jamais abouti.
JSON — exemple d’événement
{
  "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
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

AppelCe qu'il renvoie
GET /subscriptionsVos abonnements. Filtrable par ?status=active.
GET /subscriptions/{reference}Le détail d'un abonnement.
GET /subscriptions/{reference}/chargesL'historique des échéances, tentative par tentative.
POST /subscriptions/{reference}/cancelRésiliation.
GET /api/v1/subscriptions Lister vos abonnements
Vos clés se trouvent dans votre espace, onglet API.

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".
Base API https://tchin.tech/api/v1 Retour au sommaire

Connexion / Inscription

En vous inscrivant, vous acceptez notre politique de confidentialité.

Entrez le code

Code envoyé à .