MonCashAPIby FedtopupSe connecter

Démarrage rapide

Du compte au premier paiement confirmé, en cinq étapes.

  1. Créez votre compte sur la page de connexion avec Google, puis complétez votre profil.
  2. Activez une licence (payée une fois, par MonCash) : Démarrage, Croissance ou Illimité.
  3. 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.
  4. Créez un paiement depuis votre serveur et envoyez votre client vers payment_url.
  5. 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_url
import 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 adresse

Ré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 : status doit valoir succeeded et amount le 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.

Une question sur l’intégration ?