Démarrage rapide
Du compte au premier paiement confirmé, en cinq étapes.
- Créez votre compte sur la page de connexion avec Google, puis complétez votre profil.
- Activez une licence (payée une fois, par MonCash) : Démarrage, Croissance ou Illimité.
- Créez un projet, puis une clé secrète dans la page API. La clé n’est affichée qu’une fois : rangez-la dans une variable d’environnement de votre serveur, par exemple
MONCASHAPI_SECRET_KEY. - Créez un paiement depuis votre serveur et envoyez votre client vers
payment_url. - Attendez la confirmation : le webhook
payment.succeeded, ou une lecture du paiement par l’API.
1. Créer un paiement
curl https://moncashapi.fedtopup.com/api/v1/payments \
-H "Authorization: Bearer $MONCASHAPI_SECRET_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: commande-1042" \
-d '{
"amount": 1000,
"reference": "CMD-1042",
"description": "Commande 1042",
"return_url": "https://votre-site.com/merci"
}'// Côté serveur (Node 18+, Deno, Bun, fonctions « edge »). Jamais dans une page web.
const reponse = await fetch("https://moncashapi.fedtopup.com/api/v1/payments", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MONCASHAPI_SECRET_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "commande-1042",
},
body: JSON.stringify({
amount: 1000,
reference: "CMD-1042",
description: "Commande 1042",
return_url: "https://votre-site.com/merci",
}),
});
const paiement = await reponse.json();
if (!reponse.ok) {
throw new Error(`${paiement.error.code} — ${paiement.error.request_id}`);
}
// Envoyez votre client vers paiement.payment_urlimport express from "express";
const app = express();
app.post("/payer/:commande", async (req, res) => {
const reponse = await fetch("https://moncashapi.fedtopup.com/api/v1/payments", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MONCASHAPI_SECRET_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": `commande-${req.params.commande}`,
},
body: JSON.stringify({
amount: 1000,
reference: `CMD-${req.params.commande}`,
return_url: "https://votre-site.com/merci",
}),
});
const paiement = await reponse.json();
if (!reponse.ok) return res.status(502).json({ erreur: paiement.error.code });
res.redirect(303, paiement.payment_url);
});<?php
$ch = curl_init("https://moncashapi.fedtopup.com/api/v1/payments");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("MONCASHAPI_SECRET_KEY"),
"Content-Type: application/json",
"Idempotency-Key: commande-1042",
],
CURLOPT_POSTFIELDS => json_encode([
"amount" => 1000,
"reference" => "CMD-1042",
"description" => "Commande 1042",
"return_url" => "https://votre-site.com/merci",
]),
]);
$paiement = json_decode(curl_exec($ch), true);
$statut = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($statut >= 400) {
throw new Exception($paiement["error"]["code"] . " — " . $paiement["error"]["request_id"]);
}
header("Location: " . $paiement["payment_url"], true, 303);import os
import requests
reponse = requests.post(
"https://moncashapi.fedtopup.com/api/v1/payments",
headers={
"Authorization": f"Bearer {os.environ['MONCASHAPI_SECRET_KEY']}",
"Idempotency-Key": "commande-1042",
},
json={
"amount": 1000,
"reference": "CMD-1042",
"description": "Commande 1042",
"return_url": "https://votre-site.com/merci",
},
timeout=20,
)
paiement = reponse.json()
if not reponse.ok:
raise RuntimeError(f"{paiement['error']['code']} — {paiement['error']['request_id']}")
print(paiement["payment_url"]) # envoyez votre client à cette adresseRéponse (201) :
{
"id": "pay_3f9c1a7e52b04d6a81c0",
"object": "payment",
"status": "pending",
"amount": 1000,
"fee": 29,
"total": 1029,
"currency": "HTG",
"reference": "CMD-1042",
"description": "Commande 1042",
"customer_phone": null,
"payment_url": "https://moncashapi.fedtopup.com/payment/pay_3f9c1a7e52b04d6a81c0",
"return_url": "https://votre-site.com/merci",
"metadata": {},
"project_id": "prj_5d2a9c4e1b7f4a0c8e3d6f1a2b4c5d6e",
"late": false,
"created_at": "2026-09-30T14:32:07.412Z",
"expires_at": "2026-09-30T15:02:07.412Z",
"paid_at": null
}2. Envoyer le client payer
Redirigez votre client vers payment_url. Il y voit le montant, puis règle sur la page sécurisée de MonCash. Pour l’envoyer directement sur MonCash sans page intermédiaire, ajoutez ?direct=1 à l’adresse.
Après le paiement, il revient sur la page de paiement, puis sur votre return_url (avec les paramètres payment_id, status et reference).
Le retour du client sur votre site ne prouve pas le paiement : n’importe qui peut ouvrir cette adresse. Livrez seulement après l’étape 3.
3. Confirmer le paiement
Deux façons sûres, à combiner :
- Le webhook
payment.succeeded, envoyé à votre serveur et signé. Voir Webhooks. - La lecture du paiement avec votre clé secrète :
statusdoit valoirsucceededetamountle montant attendu.
curl https://moncashapi.fedtopup.com/api/v1/payments/pay_3f9c1a7e52b04d6a81c0 \
-H "Authorization: Bearer $MONCASHAPI_SECRET_KEY"// Dans une page web : clé PUBLIABLE uniquement (pk_live_…).
// Elle ne sait lire que le statut d'un paiement de votre projet.
const reponse = await fetch(`https://moncashapi.fedtopup.com/api/v1/payments/${paiementId}`, {
headers: { Authorization: "Bearer pk_live_VOTRE_CLE_PUBLIABLE" },
});
const paiement = await reponse.json();
if (paiement.status === "succeeded") {
// Affichez « Paiement reçu ». La livraison, elle, se décide sur votre serveur.
}const reponse = await fetch(`https://moncashapi.fedtopup.com/api/v1/payments/${paiementId}`, {
headers: { Authorization: `Bearer ${process.env.MONCASHAPI_SECRET_KEY}` },
});
const paiement = await reponse.json();
if (reponse.ok && paiement.status === "succeeded" && paiement.amount === montantAttendu) {
// Le paiement est réglé, du bon montant : livrez la commande paiement.reference
}<?php
$ch = curl_init("https://moncashapi.fedtopup.com/api/v1/payments/" . rawurlencode($paiementId));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("MONCASHAPI_SECRET_KEY")],
]);
$paiement = json_decode(curl_exec($ch), true);
curl_close($ch);
if (($paiement["status"] ?? "") === "succeeded" && $paiement["amount"] == $montantAttendu) {
// Le paiement est réglé, du bon montant : livrez la commande $paiement["reference"]
}import os
import requests
reponse = requests.get(
f"https://moncashapi.fedtopup.com/api/v1/payments/{paiement_id}",
headers={"Authorization": f"Bearer {os.environ['MONCASHAPI_SECRET_KEY']}"},
timeout=20,
)
paiement = reponse.json()
if reponse.ok and paiement["status"] == "succeeded" and paiement["amount"] == montant_attendu:
... # le paiement est réglé, du bon montant : livrez la commande paiement["reference"]4. Retirer votre solde
Depuis le tableau de bord (« Retirer ») ou par l’API. Voir Retraits.