Aller au contenu

Démarrage rapide

Créez un lien de paiement, partagez-le, et encaissez sans écrire d'intégration.

Un lien de paiement est une URL qui encaisse de l'argent. Aucune intégration derrière : vous décrivez ce que vous vendez, Wajub héberge la page, et vous partagez l'adresse. Le payeur l'ouvre, choisit son opérateur, et paie.

C'est le seul des quatre modes de paiement qui ne demande aucun code, et le seul que vous ne pouvez pas essayer en sandbox.

Le type détermine la forme de la page et les champs qui deviennent obligatoires. Il en existe quatre, et le choix n'est pas cosmétique : un lien de collecte de fonds affiche une barre de progression, un lien d'événement affiche une date et un lieu.

TypeCe que voit le payeurCe qu'il exige
productUn prix fixe que vous définissezprice
eventUne date, un lieu, un nombre de billetsevent_start_date, event_location, event_timezone
fundraisingUne campagne avec un objectif et sa progressiontarget_amount
donationUn montant libre, ou borné par vousRien de plus que l'essentiel

Au-delà du type, chaque lien a besoin d'un title d'au moins trois caractères, d'une currency, et d'un cta_type qui fixe le libellé du bouton : buy_now, pay, donate, register, ou custom avec votre propre custom_cta_text.

Un lien product prend aussi un product_type, parmi physical, digital ou service, qui fait apparaître plus bas les champs de stock, de livraison ou de réservation.

2. Créez-le

Le Dashboard est la voie la plus rapide : Links → New link parcourt les mêmes champs avec un aperçu à côté. Ce qui suit est l'équivalent par l'API, pour le cas où les liens sont générés par votre propre logiciel.

POSThttps://api.wajub.com/links
typeenumobligatoire
product, event, fundraising ou donation.
titlestringobligatoire
Affiché comme titre de la page. Trois caractères minimum.
currencystringobligatoire
Code ISO 4217, la devise dans laquelle chaque paiement de ce lien est encaissé.
cta_typeenumobligatoire
Libellé du bouton : buy_now, pay, donate, register ou custom.
pricenumberfacultatif
Obligatoire pour un product. Le montant fixe débité au payeur.
target_amountnumberfacultatif
Obligatoire pour fundraising. L'objectif que remplit la barre de progression.
min_amountnumberfacultatif
Plancher du montant libre, sur une donation.
max_amountnumberfacultatif
Plafond du montant libre, sur une donation.
custom_urlstringfacultatif
Votre propre slug à la place de celui généré : lettres, chiffres, traits d'union et underscores. Unique sur tout votre compte.
descriptionstringfacultatif
Texte principal de la page, 5 000 caractères maximum.
callback_urlstring (url)facultatif
Où le payeur est envoyé une fois le paiement réussi.
expiry_datestring (date)facultatif
Date à laquelle le lien cesse d'accepter des paiements. Doit être dans le futur.
sales_limitintegerfacultatif
S'arrête après ce nombre de paiements réussis.
single_use_linkbooleanfacultatif
Stocké et renvoyé, mais jamais appliqué. Utilisez plutôt sales_limit: 1.
extra_fieldsarrayfacultatif
Questions posées sur la page. Détaillé à l'étape suivante.
is_publicbooleanfacultatifdéfaut : false
Publie le lien. Il répond 404 aux payeurs tant que ce champ ne vaut pas true.

Envoyez-le avec la clé secrète. Les liens n'existent qu'en live, la clé est donc sk. et non sk_test..

curl https://api.wajub.com/links \
  -H "Authorization: sk.kZ3qP8mWvL2xR7tB5nY4hC6dF9jS1aG0eU3i…" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: link-cafe-amina" \
  -d '{
    "type": "product",
    "product_type": "physical",
    "title": "Café Amina, 250 g",
    "currency": "XAF",
    "price": 3500,
    "cta_type": "buy_now",
    "custom_url": "cafe-amina",
    "is_public": true
  }'

La réponse est 201 Created, et url est ce que vous cherchiez : l'adresse que vous partagez, construite à partir de votre custom_url si vous en avez défini un, et de l'id généré sinon.

Réponse · 201 Created
{
"code": 201,
"status": "Created",
"message": "Payment link created",
"link": {
"id": "8kD2xQpLm",
"type": "product",
"product_type": "physical",
"title": "Café Amina, 250 g",
"currency": "XAF",
"price": 3500,
"cta_type": "buy_now",
"custom_url": "cafe-amina",
"url": "https://wajub.link/cafe-amina",
"qr_url": null,
"is_public": true,
"is_archived": false,
"tags": [
],
"created_at": "2026-09-11T14:00:00Z"
}
}

Un id de lien n'a pas de préfixe comme le reste de l'API

Les paiements sont trx_…, les clients cus_…, mais un id de lien est une chaîne nue de neuf caractères comme 8kD2xQpLm, parce qu'il sert aussi de slug dans l'URL. Définissez custom_url et c'est votre slug qui apparaît dans l'adresse à la place ; l'id reste ce que vous passez à GET /links/{id}.

3. Posez une question au payeur, si besoin

Un numéro de table, une taille de T-shirt, une note de livraison : extra_fields ajoute des champs à la page et transmet les réponses jusqu'au paiement.

Deux questions sur la page
{
"extra_fields": [
{
"key": "table",
"label": "Table number",
"required": true
},
{
"key": "note",
"label": "Note to the kitchen",
"required": false
}
]
}

Ce que le payeur saisit revient sur le paiement, imbriqué sous ses métadonnées plutôt qu'étalé dessus : c'est donc dans metadata.extra_fields.table que se trouve le numéro de table. Lisez-le là dans votre handler de webhook, et vous avez la réponse à côté de l'argent.

4. Partagez-le

L'url fonctionne partout où une URL fonctionne : un message WhatsApp, une bio, un SMS, une affiche imprimée. Rien à intégrer, et aucune page à vous n'intervient. Pour une affiche, le Dashboard vous donne le QR code sur la page du lien, prêt à télécharger.

Par défaut, un lien est hébergé sur wajub.link. Avec le plan Scale, un domaine personnalisé vérifié le sert à la place, et l'adresse que voit le payeur est la vôtre.

Sur la page, le payeur voit les opérateurs disponibles dans son pays, la même liste que propose le checkout hébergé : MTN, Orange, Wave, Airtel, Moov, M-Pesa et les cartes là où le pays les prend en charge. La matrice complète est dans Moyens de paiement.

5. Soyez prévenu quand quelqu'un paie

Un lien produit des paiements ordinaires. Il n'existe pas d'événement link.paid : ce que vous écoutez, c'est payment.succeeded, exactement comme pour les autres modes.

ÉvénementDéclenché quand
payment.succeededQuelqu'un a payé via le lien. Livrez la commande sur celui-ci
link.createdUn lien a été créé
link.updatedUn lien a été modifié, archivé ou désarchivé
link.deletedUn lien a été supprimé

Définir un callback_url renvoie ensuite le payeur vers votre page, mais c'est une attention pour lui, pas un signal pour vous. Considérez le webhook comme la source de vérité, comme toujours. Webhooks couvre l'enregistrement et la vérification de signature.

Trois façons différentes, selon ce que vous entendez par fermer.

Vous voulezDéfinissez
Qu'il s'arrête à une dateexpiry_date
Qu'il s'arrête après N ventessales_limit
Qu'il s'arrête après une ventesales_limit: 1, et non single_use_link, qui n'est jamais appliqué

Un lien peut aussi être archivé avec is_archived via PUT /links/{id}, ce qui le retire de vos listes sans détruire ce qu'il a déjà encaissé. DELETE /links/{id} le supprime purement et simplement.

Dans le Dashboard

Links, c'est tout le produit sans l'API. Création, modification, archivage, plus trois choses que l'API n'expose pas : les statistiques par lien avec vues et conversion, les transactions produites par chaque lien, et ses clients, exportables et joignables par e-mail groupé.

La section exige la fonctionnalité payment_links dans le plan et la permission view_links ou manage_links, et elle est entièrement masquée tant que vous êtes en sandbox.

Que pensez-vous de ce contenu ?