Konbit
Konbit Pay · API

API peman Konbit

Ankese yon peman depi wallet Konbit kliyan ou yo. Entegre l ak kèk liy, sandbox gratis.

Kijan sa mache

Sèvè ou kreye yon entansyon peman. Kliyan an peye l nan app Konbit li ak PIN li. Ou resevwa yon webhook siyen epi ou livre sèvis dijital ou.

1. Kreye yon entansyon

Yon apèl sèvè ak montan an. Ou resevwa yon lyen peman ak yon id.

2. Kliyan an peye

Li ouvri lyen an, konfime ak PIN li. Pa gen frè pou li: li peye montan ki parèt la.

3. Yo notifye w

Yon webhook siyen konfime peman an. Ou livre sèvis la. Lajan an rive sou balans Konbit ou.

Montan yo an inite minè

amountMinor se yon antye nan pi piti inite a : 10000 = 100,00 DOP. Pa janm mete desimal.

1 · Kòmanse

Kòmanse nan 5 minit

Twa etap: sèvè ou kreye yon entansyon, kliyan an peye l nan Konbit, sèvè ou konfime peman an anvan ou livre. Men apèl konplè a ak repons reyèl la, ak anotasyon.

curl -X POST https://app.getkonbit.com/api/v1/payment_intents \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: order-123" \
  -H "Content-Type: application/json" \
  -d '{"amountMinor":10000,"description":"Order 123","metadata":{"orderId":"order-123"},"returnUrl":"https://mon-site.com/merci"}'
Repons
{
  "id": "5Qx0u5gexpnqsw6qQhks",       // konbitRef — gardez-le
  "status": "REQUIRES_PAYMENT",
  "amountMinor": 10000,               // 100,00 DOP
  "currency": "DOP",
  "feeMinor": 200,                    // notre commission
  "code": "562183",                   // saisie manuelle / QR
  "checkoutUrl": "https://app.getkonbit.com/pay/5Qx0u5gexpnqsw6qQhks",
  "expiresAtMs": 1783710307539        // millisecondes
}

checkoutUrl: paj kote kliyan an peye. code: antre alamen / QR. feeMinor: komisyon nou, deja retire sou balans ou (kliyan an peye amountMinor). expiresAtMs: apre sa entansyon an vin EXPIRED.

⚠ returnUrl SE PA yon prèv peman

Redireksyon sou returnUrl fèt nan navigatè kliyan an epi yo ka fo l (se annik louvri URL la). PA JANM livre sèvis ou sou baz retou a sèlman. Toujou konfime bò sèvè a: webhook siyen oswa yon GET sou estati a.

2 · Aksè

Jwenn aksè ou

De nivo, prezante ak onètte.

Kle tès — imedya

Jenere yon kle sk_test_ anwo: valab 7 jou, sandbox, SAN webhook. Pafè pou eksplore API a ak polling. Pa gen lajan reyèl k ap deplase.

Kle machann — anndan 24 è

Ekri nou ak konpayi ou ak ka itilizasyon ou. Nou kreye yon machann dedye: kle pèsistan + webhook siyen. Nou reponn anjeneral anndan 24 è travay. (Machann ap ka fè l poukont yo pita; jodi a se nou ki louvri l, pou konfòmite.)

Kenbe sekrè a sekrè

Kle sk_ la parèt YON sèl fwa epi li viv sèlman bò sèvè a: pa janm nan yon navigatè, yon app mobil, yon depo Git oswa yon URL. Sere l nan yon jesyonè sekrè. Konpwomèt? Mande yon wotasyon: ansyen an revoke lapoula.

Sandbox

Jenere yon kle tès

Eseye kounye a, san kont. Yon kle tès ki valab 7 jou, an mòd sandbox.

Peye yon entansyon tès (sandbox)

Pa bezwen kont Konbit: rele POST /v1/test/pay ak id entansyon an. Konbit similye yon peyè sandbox, mete entansyon an SUCCEEDED, voye webhook siyen an (si ou bay yon URL) epi kredite balans machann ou. Konsa ou teste tout sik la poukont ou.

curl -X POST https://app.getkonbit.com/api/v1/test/pay \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{"intentId":"<id renvoyé par /payment_intents>"}'
# -> l'intention passe à SUCCEEDED, le webhook signé part (si configuré),
#    et ton solde marchand augmente (testable par GET /balance + payouts).
Sa kle tès la pèmèt (ak limit li yo)

Kle ou jenere isit la efemè (7 jou), sandbox: pa gen lajan reyèl. Li ase pou fè create → pay → webhook → payout poukont ou. Pou yon kle ki DIRE ak vrè pwodiksyon, kontakte nou — yon machann dedye + konfòmite vini nan go-live. Poukisa « test » nan kle a (sk_test_) ? Se prefiks sandbox la : okenn lajan reyèl pa ka deplase. Nan sandbox, « kat tès » = POST /v1/test/pay (peyè sintetik) ; chak paj peman montre yon bandwòl « SANDBOX ». Kle pwodiksyon (sk_live_) se Konbit ki bay yo apre validasyon.

3 · Peman

Entansyon peman

REQUIRES_PAYMENT: ap tann · SUCCEEDED: peye · EXPIRED: ekspire · CANCELED: ou anile l · REFUNDED: ranbouse.

Montan

amountMinor se yon antye an inite minè (10000 = 100,00 DOP). Limit: 1 000 rive 5 000 000, sa vle di 10 rive 50 000 DOP. DOP sèlman nan V1 (poko gen HTG sou API a).

Idempotency-Key (obligatwa)

Obligatwa lè w ap kreye. Verifye: MENM kle a (pou chak machann) TOUJOU voye menm entansyon an, san doublon ni doub debi. Sèvi ak id kòmand ou — konsa yon retès rezo pa gen danje.

Rekonsilyasyon ak metadata

Mete idantifyan ou (orderId, userId…) nan metadata (20 kle maksimòm). Yo retounen menm jan nan webhook la ak GET la, pou matche yon peman ak kòmand ou. PA mete okenn sekrè la: moun k ap peye a ak webhook ou wè yo.

5 · Kòd erè

Referans API a

Otantifye chak demann ak kle sekrè ou nan antèt Authorization.

POST/v1/payment_intents

Kreye yon entansyon peman

curl -X POST https://app.getkonbit.com/api/v1/payment_intents \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: order-123" \
  -H "Content-Type: application/json" \
  -d '{"amountMinor":10000,"description":"Order 123","returnUrl":"https://mon-site.com/merci"}'
Repons
{
  "id": "5Qx0u5gexpnqsw6qQhks",
  "status": "REQUIRES_PAYMENT",
  "amountMinor": 10000,
  "currency": "DOP",
  "feeMinor": 200,
  "code": "562183",
  "checkoutUrl": "https://app.getkonbit.com/pay/5Qx0u5gexpnqsw6qQhks",
  "expiresAtMs": 1783710307539
}

Voye kliyan ou sou checkoutUrl (oswa montre QR a) pou li peye.

GET/v1/payment_intents/{id}

Gade estati yon peman

Repons
{ "id": "5Qx0...", "status": "SUCCEEDED", "amountMinor": 10000, "feeMinor": 200 }
POST/v1/refunds

Ranbouse yon peman

curl -X POST https://app.getkonbit.com/api/v1/refunds \
  -H "Authorization: Bearer sk_test_..." \
  -H "Content-Type: application/json" \
  -d '{"payment_intent":"5Qx0u5gexpnqsw6qQhks"}'
GET/v1/balance

Gade balans ou

Repons
{ "object": "balance", "balanceMinor": 9800, "totalFeesMinor": 200, "currency": "DOP" }
POST/v1/payouts

Voye yon pati nan balans ou nan wallet yon chofè / benefisyè, ak kòd Konbit li (9 karaktè). Idempotency-Key obligatwa.

Kle machann obligatwa (kontra Konbit): kle tès pòtal yo pa ka peye yon vrè wallet — balans sandbox yo a fiktif.

curl -X POST https://app.getkonbit.com/api/v1/payouts \
  -H "Authorization: Bearer sk_test_..." \
  -H "Idempotency-Key: driver-42-2026-W27" \
  -H "Content-Type: application/json" \
  -d '{"konbitCode":"K7M2P9QRS","amountMinor":85000,"metadata":{"driverId":"drv_42"}}'
Repons
{ "id":"p_8Kd...", "object":"payout", "status":"SUCCEEDED", "amountMinor":85000, "feeMinor":0, "currency":"DOP", "konbitCode":"K7M2P9QRS" }
GET/v1/payouts

Lis vèsman ou yo, pou rekonsilyasyon.

Estati yon peman

REQUIRES_PAYMENT: ap tann · SUCCEEDED: peye · EXPIRED: ekspire · CANCELED: ou anile l · REFUNDED: ranbouse.

Kòd erè

Chak erè voye menm objè a: yon kòd ki estab (pou teste) ak yon mesaj lizib.

{ "error": { "code": "amount_out_of_bounds", "message": "..." } }
KòdKilè
401 unauthorizedKle absan, envalid oswa revoke.
400 idempotency_key_requiredAntèt Idempotency-Key manke lè w ap kreye.
400 amount_out_of_bounds / invalid_amountMontan andeyò limit yo, oswa se pa yon antye.
400 invalid_return_urlreturnUrl bay men li pa an https.
404 not_foundEntansyon enkoni oswa ki pou yon lòt machann.
404 code_not_foundKòd Konbit benefisyè a pa jwenn (payout).
409 not_cancelable / not_refundableEstati enkonpatib (deja peye, deja ranbouse, pa ka anile…).
409 insufficient_balanceBalans machann pa ase pou ranbousman an oswa payout la.
429 quota_exceededTwòp demann.
503 service_unavailableKonbit Pay dezaktive pou yon moman.
4 · Webhooks

Webhooks

Chak chanjman estati deklanche yon POST JSON siyen sou webhookUrl ou (https obligatwa). Antèt Konbit-Signature: t=,v1=. Men anvlòp egzak la:

POST (votre webhookUrl)
Konbit-Signature: t=1720000000000,v1=<hmac_sha256>

{
  "id": "evt_9f2c...",                 // id de l'ÉVÉNEMENT — dédup
  "type": "payment_intent.succeeded",  // .refunded · .canceled · .expired · .payment_failed (data.failureCode)
  "createdAtMs": 1720000000000,        // millisecondes
  "data": {
    "id": "5Qx0...",                   // id de l'intention (= konbitRef)
    "status": "SUCCEEDED",
    "amountMinor": 10000,
    "currency": "DOP",
    "feeMinor": 200,
    "metadata": { "orderId": "order-123" }
  }
}
⚠ t se an MILISGONN

t siyati a AK createdAtMs se an milisgonn depi epòk la (13 chif). Pyèj nimewo 1: trete yo tankou segonn fè fenèt 5 minit la echwe epi ou rejte webhook ki valab.

Verifye siyati a, etap pa etap

1. Li kò a BRUT (san parse). 2. Retire t ak v1 nan antèt la. 3. Rejte si |kounye a − t| > 5 min. 4. Kalkile HMAC-SHA256(sekrè_webhook, "."). 5. Konpare ak v1 an tan konstan. 6. Dedouble sou id (id EVÈNMAN an, pa data.id).

Verifikasyon — moso pou kopye

Node.js / Express
const crypto = require("crypto");
// IMPORTANT: raw body, pas express.json() sur cette route
app.post("/konbit/webhook",
  express.raw({ type: "application/json" }),
  (req, res) => {
    const raw = req.body;                       // Buffer brut
    const sig = req.get("Konbit-Signature") || "";
    const parts = Object.fromEntries(sig.split(",").map(p => p.split("=")));
    const t = Number(parts.t);                  // MILLISECONDES
    if (!t || Math.abs(Date.now() - t) > 5 * 60 * 1000) return res.sendStatus(401);
    const expected = crypto.createHmac("sha256", process.env.KONBIT_WEBHOOK_SECRET)
      .update(t + "." + raw.toString("utf8")).digest("hex");
    const a = Buffer.from(expected), b = Buffer.from(parts.v1 || "");
    if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return res.sendStatus(401);
    const event = JSON.parse(raw.toString("utf8"));
    if (alreadyProcessed(event.id)) return res.sendStatus(200);   // dédup sur event.id
    // re-vérifiez event.data.amountMinor + currency contre VOTRE commande
    markProcessed(event.id);
    fulfill(event.data.metadata.orderId);
    res.sendStatus(200);
  });
PHP
<?php
$raw = file_get_contents("php://input");        // corps brut
$sig = $_SERVER["HTTP_KONBIT_SIGNATURE"] ?? "";
parse_str(str_replace(",", "&", $sig), $p);      // t=...&v1=...
$t = (int)($p["t"] ?? 0);                        // MILLISECONDES
if (!$t || abs(round(microtime(true)*1000) - $t) > 300000) { http_response_code(401); exit; }
$expected = hash_hmac("sha256", $t . "." . $raw, getenv("KONBIT_WEBHOOK_SECRET"));
if (!hash_equals($expected, $p["v1"] ?? "")) { http_response_code(401); exit; }
$event = json_decode($raw, true);
if (already_processed($event["id"])) { http_response_code(200); exit; }  // dédup
// re-vérifiez amountMinor + currency contre votre commande
mark_processed($event["id"]);
fulfill($event["data"]["metadata"]["orderId"]);
http_response_code(200);
Python / Flask
import hmac, hashlib, time, os
from flask import request, abort

@app.post("/konbit/webhook")
def konbit_webhook():
    raw = request.get_data()                     # bytes bruts
    parts = dict(p.split("=", 1) for p in request.headers.get("Konbit-Signature", "").split(","))
    t = int(parts.get("t", 0))                   # MILLISECONDES
    if not t or abs(time.time() * 1000 - t) > 300000:
        abort(401)
    expected = hmac.new(os.environ["KONBIT_WEBHOOK_SECRET"].encode(),
                        f"{t}.".encode() + raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, parts.get("v1", "")):
        abort(401)
    event = request.get_json()
    if already_processed(event["id"]):           # dédup sur event.id
        return "", 200
    # re-vérifiez amountMinor + currency contre votre commande
    mark_processed(event["id"])
    fulfill(event["data"]["metadata"]["orderId"])
    return "", 200

Règ rees​eye

Livrezon imedya sou evènman an. Si l echwe (repons ki pa 2xx, oswa depase 10 s), Konbit reeseye 5 fwa, ak yon backoff 1, 5, 30, 120 answit 720 minit — 6 tantativ antou sou anviwon 14,5 è anvan li abandone (estati «dead», vizib pou dyagnostik). Chak tantativ RESIYEN ak yon t aktyèl: donk fenèt 5 min ou aksepte reeseye yo. id evènman an rete menm ant reeseye yo — dedouble sou li.

Oswa pa mande (polling)

De fason pou konnen yon peman reyisi : resevwa webhook la, oswa mande estati entansyon an jiskaske li SUCCEEDED.

curl https://app.getkonbit.com/api/v1/payment_intents/{id} \
  -H "Authorization: Bearer sk_test_..."
# répétez jusqu'à "status": "SUCCEEDED"
Règ an lò a

Webhook AK polling rekonsilyasyon, pa janm youn san lòt. Webhook la avèti ou vit; yon GET peryodik sou entansyon resan yo rekipere nenpòt livrezon ki manke (endpoint ki tonbe yon moman, evènman «dead»). Pa janm depann sou yon sèl chemen.

Peye yon entansyon tès

Pou rive nan peman an, ou bezwen yon kont Konbit ak balans. Nan sandbox: ouvri checkoutUrl la konekte sou yon kont Konbit tès, oswa mande nou yon kont peyè tès ak lajan. San sa ou ka kreye entansyon men ou pa ka peye yo. Yon fwa ankesman pa kat aktive pou kont ou (gade anba a), menm checkoutUrl la ofri tou « Peye ak kat » (san kont Konbit): entansyon an make paidViaCard, li kredite sou balans USD ou, epi ou resevwa card_payment.succeeded + payment_intent.succeeded (dedipe pa id).

6 · Pwodiksyon

Lis kontwòl pou pwodiksyon

Onz pwen anvan ou chanje. Twa ki an gra yo se sa 90 % entegratè bliye — epi ki koute lajan oswa louvri yon twou.

  • Kle sk_ machann jwenn epi sere bò sèvè a (jesyonè sekrè), pa janm bò kliyan.
  • Idempotency-Key mete sou chak kreyasyon (orderId ou).
  • Montan an inite minè, anndan limit yo; lajan DOP.
  • Kò BRUT konsève pou verifikasyon HMAC (pa parse anvan siyati a).
  • Endpoint webhook an https, reponn 2xx an mwens pase 10 s, travay lou an asenkwòn.
  • Siyati verifye an tan konstan, t trete kòm milisgonn, demann ki gen plis pase 5 min rejte.
  • Polling rekonsilyasyon kòm filè sekirite, anplis webhook la.
  • Estati EXPIRED / CANCELED / REFUNDED ak kòd erè jere pwòp.
  • Dedoublaj sou id EVÈNMAN an (livrezon omwen-yon-fwa).
  • Reverifye montan AN ak lajan webhook la kont kòmand ou — pa fè konfyans nan tip evènman an sèlman.
  • Okenn chemen bò kliyan pa make «peye»: returnUrl pa yon prèv, se sèlman konfimasyon sèvè a ki prèv.

Ray USD: ankese ak kat, peye ak Zelle

Pou platfòm k ap travay an dola (envestisman, peman salè, marketplaces): kliyan ou peye ak kat sou yon checkout Konbit — san kont Konbit — epi ou distribye USD ak Zelle, pa lo, ak konfimasyon webhook liy pa liy.

1. Ankesman ak kat

Sèvè ou kreye entansyon an (montan fikse sou sèvè a), moun k ap peye a antre kat li sou /cpay. Frè Konbit ajoute sou montan an; balans USD ou resevwa nèt la.

2. Lajan sekirize

Chak peman pase nan yon peryòd sekirite anti-fwod anvan li ka distribye. Balans nan twa eta: annatant, disponib, rezève.

3. Vèsman Zelle

Ou soumèt lis la (jiska 200 benefisyè pa lo). Konbit egzekite chak transfè epi li fè w konnen ak webhook siyen: peye oswa echwe, liy pa liy.

Ankesman pa kat: aktivasyon pa machann

Ankesman pa kat (ray USD) se yon aktivasyon PA MACHANN, Konbit apwouve li (konfòmite, kloz chargeback) — jamè sou yon kle tès. Yon fwa li aktive, lyen peman DOP ou yo ofri opsyon kat la tou bay moun k ap peye a, san kont Konbit. Ekri nou pou aktive li.