Skip to content

Référence API checkout ministry ​

Base : https://paymentdev-api.akieni.tech/api/v1

Les partenaires déjà branchés sur le cash-in historique (apiKey, init-checkout, partners/payments) restent sur un contrat déprécié, distinct de celui-ci : Cash-in déprécié.

En-têtes communs :

http
Authorization: Bearer sk_test_…
Content-Type: application/json

POST /checkout/sessions ​

Crée une session de paiement. En-tête obligatoire : Idempotency-Key.

Corps de requête ​

ChampTypeObligatoireDescription
order_idstring, 1-200OuiIdentifiant dossier unique par application
amountentier > 0OuiMontant dû en unités mineures ISO 4217 (voir ci-dessous).
currencycode ISO 4217NonDéfaut XAF. Mobile money et agence : XAF uniquement. Paiement carte : devises supportées ci-dessous.
mode"hosted" | "embedded"NonDéfaut hosted
tenant_idUUIDConditionnelObligatoire avec clé scope platform
service_codestring, 1-50NonCode catalogue régie actif
descriptionstring, 1-200NonLibellé citoyen sur le checkout
notestring, 1-500NonNote interne régie, invisible citoyen
customer{ name?, email?, phone? }NonCoordonnées pour le reçu
customer_idstring, 1-200NonIdentifiant client opaque côté SI
metadataobjet string→stringNonMax 20 clés, clé max 64 car., valeur max 500 car. ; renvoyé dans webhooks
success_urlURL, max 2048NonRetour après paiement réussi
cancel_urlURL, max 2048NonRetour après abandon

Réponse 201 ​

ChampTypeDescription
idstringIdentifiant session (chs_…)
order_idstringEcho order_id
amountentierMontant dû
currencystringDevise session (ISO 4217)
statusenumopen, completed, expired, cancelled, failed
paidbooleantrue uniquement si status = completed
payment_refstringRéférence 16 chiffres (paiement agence)
checkout_urlURLPage checkout hébergée
embed_checkout_urlURL | nullIframe embed si mode = embedded
mode"hosted" | "embedded"Mode effectif
client_secretstring | nullSecret embed (une fois, si embedded)
expires_atstring ISO 8601TTL session (24 h par défaut)

Codes HTTP : 201, 400, 401, 409, 422, 429 (generic.rate_limited, 30 req/min/application).

Montants : unités mineures (obligatoire) ​

amount n'est jamais un montant « humain » en euros ou dollars. C'est toujours l'entier ISO 4217 en plus petite unité de la devise (currency).

DeviseDécimalesamount pour 100 unités majeuresAffichage citoyen
XAF0100 → 100 FCFA ; 5000 → 5 000 FCFAIdentique à amount (pas de centimes)
EUR210000 → 100,00 EURCentimes ÷ 100
USD210000 → 100,00 USDIdem
JPY0100 → 100 JPYIdentique à amount

Piège fréquent : { "amount": 100, "currency": "EUR" } = 1,00 EUR (100 centimes), pas 100 EUR. Pour 100 EUR : { "amount": 10000, "currency": "EUR" }.

Le mode XAF (mobile money, agence) est inchangé : amount: 5000 reste 5 000 FCFA.

Devises acceptées ​

UsageDevises
DéfautXAF
Mobile money, agenceXAF
Paiement par carte (offer_id: paddle)USD, EUR, GBP, AUD, CAD, CHF, DKK, NOK, SEK, PLN, HUF, CZK, RON, BGN, MXN, BRL, ARS, CLP, COP, PEN, INR, SGD, HKD, TWD, KRW, JPY, NZD, ZAR, ILS, TRY, AED, SAR, THB, MYR, PHP, IDR, VND

Devise hors liste : 422 generic.validation_failed (« The currency is not supported. »). Détail carte : Paiement par carte.

GET /checkout/sessions/ ​

Retourne une session par identifiant. Même forme de réponse que la création.

Query optionnelle tenant_id (UUID) : contexte clé plateforme.

Codes HTTP : 200, 401, 404.

GET /checkout/sessions ​

Liste paginée : { items[], page, page_size, total }.

Paramètres query ​

ParamètreTypeDescription
order_idstring, 1-200Filtre identifiant dossier
statusenum sessionopen, completed, expired, cancelled, failed
customer_idstring, 1-200Filtre client opaque
payment_refstring, 1-16Filtre référence agence
tenant_idUUIDContexte clé plateforme
pageentier ≥ 1Défaut 1
page_sizeentier 1-100Défaut selon configuration

Codes HTTP : 200, 400, 401.

POST /checkout/sessions/{id}/cancel ​

Annule une session encore open et non payée. Corps vide.

Réponse 200 : même forme que la session, avec status: cancelled, paid: false.

Webhook associé : checkout.cancelled (livraison asynchrone, at-least-once).

Codes HTTP : 200, 401, 404, 409 (session déjà terminale).

POST /checkout/sessions/verify-completion ​

Vérifie un jeton éphémère émis après paiement embed. Usage synchrone côté SI ; le webhook reste le filet durable.

Corps de requête ​

ChampTypeObligatoireDescription
completion_tokenstring, min 1OuiJeton cpt_… reçu via SDK
tenant_idUUIDConditionnelRequis pour corréler une clé plateforme à la régie cible

Réponse 200 ​

ChampTypeDescription
session_idstringIdentifiant session
order_idstringIdentifiant dossier
statusenum sessionÉtat courant
paidbooleantrue si status = completed
notice_idUUIDNotice de paiement
tenant_idUUIDRégie
metadataobjet | nullMétadonnées session
service_codestring | nullCode service si résolu
service_labelstring | nullLibellé service si résolu

Jeton : TTL ~10 min, usage unique. Rejeu idempotent après consommation → 200 avec état courant.

Codes HTTP : 200, 401, 403, 404 (checkout.completion_token_not_found), 409 (checkout.completion_token_consumed), 410 (checkout.completion_token_expired).

Exemple curl (création hosted, XAF) ​

bash
curl -sS -X POST "https://paymentdev-api.akieni.tech/api/v1/checkout/sessions" \
  -H "Authorization: Bearer sk_test_XXXX" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: CJ-2026-88421" \
  -d '{
    "order_id": "CJ-2026-88421",
    "amount": 5000,
    "description": "Casier judiciaire - Demande n° 88421",
    "service_code": "casier_judiciaire",
    "metadata": { "tribunal": "Brazzaville" }
  }'

Exemple curl (création hosted, EUR carte) ​

bash
curl -sS -X POST "https://paymentdev-api.akieni.tech/api/v1/checkout/sessions" \
  -H "Authorization: Bearer sk_test_XXXX" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: DIASPORA-2026-100" \
  -d '{
    "order_id": "DIASPORA-2026-100",
    "amount": 10000,
    "currency": "EUR",
    "description": "Paiement diaspora - 100,00 EUR"
  }'

amount: 10000 + currency: EUR = 100,00 EUR. Ne pas envoyer 100 pour viser cent euros.

Plateforme d'orchestration de paiement DPI. Les fonds ne transitent pas par Epayment.