Endpoint
POST https://buy.api.yabetoopay.com/v1/sessions
Authentification
Utilisez votre clé secrète dans l’en-têteAuthorization :
Authorization: Bearer YOUR_SECRET_KEY
Corps de la requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
total | number | Oui | Montant total dans la plus petite unité de devise (ex: 200000 = 200 000 XAF) |
currency | string | Oui | Code devise (ex: xaf, xof) |
accountId | string | Oui | Votre ID de compte Yabetoo |
successUrl | string | Oui | URL de redirection après un paiement réussi |
cancelUrl | string | Oui | URL de redirection en cas d’annulation |
items | array | Oui | Liste des articles achetés |
metadata | object | Non | Données personnalisées pour votre référence |
Structure d’un item
Tous les champs d’un item sont obligatoires. En omettre un renvoie422 avec
field: "items.*.<nom>".
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
productId | string | Oui | Votre identifiant de produit |
productName | string | Oui | Libellé affiché sur la page de paiement |
quantity | number | Oui | Nombre d’unités |
price | number | Oui | Prix unitaire dans la plus petite unité de devise |
{
"productId": "prod_12345",
"productName": "Écran HD",
"quantity": 1,
"price": 200000
}
Exemple de requête
curl -X POST https://buy.api.yabetoopay.com/v1/sessions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_SECRET_KEY" \
-d '{
"total": 200000,
"currency": "xaf",
"accountId": "acct_xxxxxxxx",
"successUrl": "https://votre-site.com/checkout-success",
"cancelUrl": "https://votre-site.com/checkout-cancel",
"metadata": { "orderId": "1234" },
"items": [
{
"productId": "prod_12345",
"quantity": 1,
"price": 200000,
"productName": "Écran HD"
}
]
}'
import Yabetoo from "@yabetoo/sdk-js";
const yabetoo = new Yabetoo("YOUR_SECRET_KEY");
const session = await yabetoo.sessions.create({
accountId: "acct_xxxxxxxx",
total: 200000,
currency: "xaf",
successUrl: "https://votre-site.com/checkout-success",
cancelUrl: "https://votre-site.com/checkout-cancel",
metadata: { orderId: "1234" },
items: [
{
productId: "prod_12345",
quantity: 1,
price: 200000,
productName: "Écran HD",
},
],
});
from yabetoo import Yabetoo
from yabetoo.models.checkout import CreateCheckoutSession, CheckoutItem
yabetoo = Yabetoo("YOUR_SECRET_KEY")
items = [
CheckoutItem(
product_id="prod_12345",
product_name="Écran HD",
quantity=1,
price=200000
)
]
session = yabetoo.sessions.create(CreateCheckoutSession(
account_id="acct_xxxxxxxx",
total=200000,
currency="xaf",
success_url="https://votre-site.com/checkout-success",
cancel_url="https://votre-site.com/checkout-cancel",
items=items,
metadata={"orderId": "1234"}
))
<?php
require 'vendor/autoload.php';
use Yabetoo\Yabetoo;
$yabetoo = new Yabetoo("YOUR_SECRET_KEY");
$session = $yabetoo->sessions->create([
"total" => 200000,
"currency" => "xaf",
"accountId" => "acct_xxxxxxxx",
"successUrl" => "https://votre-site.com/checkout-success",
"cancelUrl" => "https://votre-site.com/checkout-cancel",
"metadata" => ["orderId" => "1234"],
"items" => [
[
"productId" => "prod_12345",
"quantity" => 1,
"price" => 200000,
"productName" => "Écran HD",
]
],
]);
import com.yabetoo.Yabetoo;
import com.yabetoo.YabetooConfig;
import com.yabetoo.model.Session;
import com.yabetoo.request.SessionCreateRequest;
import com.yabetoo.request.LineItem;
YabetooConfig config = new YabetooConfig()
.setApiKey("YOUR_SECRET_KEY");
Yabetoo yabetoo = new Yabetoo(config);
SessionCreateRequest request = SessionCreateRequest.builder()
.successUrl("https://votre-site.com/checkout-success")
.cancelUrl("https://votre-site.com/checkout-cancel")
.addLineItem(LineItem.builder()
.productId("prod_12345")
.quantity(1)
.price(200000)
.productName("Écran HD")
.build())
.currency("xaf")
.build();
Session session = yabetoo.sessions().create(request);
Réponse
201 Created
La session est renvoyée sous forme d’objetcheckout.session, avec des noms de
champs en snake_case.
{
"id": "cs_QVdT8sK2mR7xLpZ0aB4nCjE1",
"object": "checkout.session",
"mode": "payment",
"status": "open",
"payment_status": "unpaid",
"url": "https://pay.yabetoo.com/c/cs_QVdT8sK2mR7xLpZ0aB4nCjE1",
"success_url": "https://votre-site.com/checkout-success",
"cancel_url": "https://votre-site.com/checkout-cancel",
"customer": null,
"customer_email": null,
"client_reference_id": null,
"amount_subtotal": 200000,
"amount_total": 200000,
"currency": "xaf",
"expires_at": 1786355639,
"created": 1786269239,
"livemode": false
}
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant de la session, préfixé cs_ |
object | string | Toujours checkout.session |
mode | string | payment pour cet endpoint |
status | string | open, complete ou expired |
payment_status | string | unpaid, paid ou no_payment_required |
url | string | Page de paiement hébergée — redirigez-y votre client |
success_url / cancel_url | string | Les URLs que vous avez fournies |
customer | string | null | Identifiant du client, null si aucun n’a été résolu |
customer_email | string | null | Email du client, null si non fourni |
client_reference_id | string | null | Votre propre référence, null si non fournie |
amount_subtotal / amount_total | number | Montants dans la plus petite unité de devise |
currency | string | Code devise en minuscules |
expires_at | number | Expiration, timestamp Unix en secondes |
created | number | Création, timestamp Unix en secondes |
livemode | boolean | false lorsque la requête a utilisé une clé de test |
Cet endpoint ne renvoie pas
orderId, expiresAt, createdAt ni
updatedAt, et l’identifiant est préfixé cs_ — pas session_. Un code qui
lit ces champs camelCase obtient undefined, et un code qui filtre sur le
préfixe session_ ne reconnaît aucune session. Lisez id, url et
expires_at à la place.422 Unprocessable Entity
Les échecs de validation renvoient422 — pas 400. Chaque entrée nomme le
champ fautif (field) et la règle qui l’a rejeté (rule) ; field prend la
forme items.*.<nom> pour un champ situé à l’intérieur d’un item.
{
"errors": [
{
"message": "The productId field must be defined",
"rule": "required",
"field": "items.*.productId"
}
]
}
401 Unauthorized
Un en-têteAuthorization absent renvoie un corps en texte brut
(content-type: text/plain) :
Unauthorized
{
"status": 401,
"path": "/v1/sessions",
"timestamp": "2026-08-09T09:54:11.157+00:00",
"code": "E_UNAUTHORIZED",
"message": "Unauthorized",
"detail": "You are not authorized to access this resource."
}