Tableau de bord ↗ العربية

Créez un paiement, redirigez l’acheteur vers le lien renvoyé, recevez la confirmation par webhook. C’est lahsab qui héberge la page de paiement, vous n’avez rien à construire. Commencez en sandbox : même API qu’en production, sans argent réel.

1. Créer un intent

POST /payments/intents avec un montant en dinars entiers (DZD, sans centimes). La réponse porte un checkoutUrl (le lien de paiement hébergé par lahsab), valable 48 heures.

Créer un intent
curl -X POST https://api.lahsab.com/payments/intents \
  -H "x-api-key: lsk_sandbox_CLE" \
  -H "content-type: application/json" \
  -d '{ "amount": 2500, "description": "Abonnement Premium", "customerRef": "user_abc123" }'

Réponse 201 :

{
  "id": "a7f3c2e1-9b4d-4e6a-8c1f-2d3e4f5a6b7c",
  "environment": "sandbox",
  "amount": 2500,
  "status": "pending",
  "checkoutUrl": "https://dashboard.lahsab.com/pay/a7f3c2e1-9b4d-4e6a-8c1f-2d3e4f5a6b7c",
  "expiresAt": "2026-07-13T10:00:00.000Z",
  "proofs": [],
  "createdAt": "2026-07-11T10:00:00.000Z"
}

2. Rediriger vers la page de paiement

Envoyez l’acheteur sur le checkoutUrl. La page hébergée par lahsab lui fait choisir son moyen de paiement (versement CCP ou BaridiMob), affiche les instructions et les coordonnées de ce moyen, et récolte la preuve de paiement (reçu ou capture). L’acheteur paie, téléverse sa preuve, et l’intent passe en proof_submitted, sans une ligne de code de votre côté.

3. Confirmer, puis recevoir le webhook

La confirmation « argent reçu » est manuelle, c’est le cœur du modèle : vérifiez sur votre compte que le virement est bien arrivé, puis cliquez Confirmer dans le tableau de bord. L’intent passe en confirmed et lahsab émet payment.confirmed vers votre endpoint. C’est votre signal pour accorder l’accès ou expédier.

pendingproof_submitted confirmedrejected
confirmed et rejected sont terminaux. expired est un terminal réservé.

Encaisser plus d’une fois

Un intent encaisse une somme, une fois. Pour vendre un abonnement, ne bouclez pas là-dessus : lahsab émet les factures, suit les impayés, et vous dit jusqu’à quand c’est payé, en un seul appel à POST /subscriptions. Là, l’événement d’accès n’est plus payment.confirmed mais invoice.paid.

Et ensuite ?