Intégration Service Provider
Guide d'intégration technique pour les fournisseurs de services afin d'intégrer des marchands et gérer les clés API
Ce guide décrit le parcours d'intégration de l'API Service Provider. Pour le détail de chaque endpoint, consultez la spécification OpenAPI.
Prérequis
- Un compte entreprise Service Provider
- Des identifiants Partner API (clé API et ID de clé API)
- L'accès aux endpoints Service Provider de la Partner API
Authentification
Tous les endpoints nécessitent les en-têtes suivants :
X-API-KEY: your_api_key_here
X-API-KEY-ID: your_api_key_id_hereWorkflow d'intégration
Flux d'intégration complet
Étapes d'intégration
Obtenir les données de référence
Avant d'intégrer un marchand, récupérez les données nécessaires :
-
Localisations :
- Retourne les villes et municipalités disponibles
- Utilisez ces valeurs pour les champs
cityetmunicipality
-
Activités :
- Retourne les catégories et activités commerciales
- Support multilingue via l'en-tête
Accept-Language(fr/en) - Utilisez ces valeurs pour les champs
categoryetcategoryActivity
Intégrer le marchand
POST /partner_api/service_providers/business_onboardingStructure de la requête :
{
"owner": {
"phone": "+22507012345",
"firstName": "Jean",
"lastName": "Dupont",
"sex": "M"
},
"business": {
"name": "Magasin de Jean",
"category": "retail",
"categoryActivity": "home_appliances",
"city": "abidjan",
"municipality": "cocody"
}
}Réponse :
{
"business": {
"id": "59ae202a-f583-4a15-970f-9e99bd1e0baa",
"name": "Magasin de Jean",
"reference": "BIZ-2024-001"
},
"serviceProviderMemberId": "29f81706-03a6-492f-92ee-5f0b2e9b18e7"
}Important : Stockez le business.id pour l'étape suivante.
business_onboarding ne crée que de nouveaux comptes. Si le téléphone appartient déjà à un utilisateur Jèko, la réponse est 409 phone_already_in_use. N'essayez pas un second onboarding : ouvrez une demande de rattachement.
Rattacher un marchand déjà inscrit
Quand l'onboarding renvoie 409 phone_already_in_use, créez une demande de rattachement. Le Service Provider ne peut pas attacher le marchand par téléphone : le Owner ou le Director de l'entreprise existante doit approuver dans l'application Jèko.
POST /partner_api/service_providers/business_link_requestsRequête :
{
"phone": "+22507012345"
}Réponse (201) : un tableau de demandes, une par entreprise dont cet utilisateur est Owner.
[
{
"id": "c1e15642-cdb5-404a-b028-26a51c94059b",
"status": "pending",
"merchantBusinessId": "59ae202a-f583-4a15-970f-9e99bd1e0baa",
"merchantBusinessName": "Magasin de Jean",
"serviceProviderBusinessId": "a0b1c2d3-e4f5-6789-abcd-ef0123456789",
"serviceProviderBusinessName": "Ma Marketplace",
"ownerPhone": "+22507012345",
"expiresAt": "2026-08-30T12:00:00.000Z",
"createdAt": "2026-08-23T12:00:00.000Z"
}
]Un POST répété pour la même paire (vous + ce marchand) renvoie la demande pending existante — il n'y a pas de doublon.
Ensuite :
- Interrogez jusqu'à
acceptedourejected(les demandes expirent au bout de 7 jours, statutexpired) - Si le marchand a déjà un webhook d'entreprise (
business_webhook_subscriptionsou URL legacy), Jèko envoie un POST signé (Jeko-Signature) avec le corps de la demande de rattachement (pas une transaction) :id,status,merchantBusinessId, noms,ownerPhone, dates,serviceProviderMemberId - Quand
statusestaccepted, utilisezmerchantBusinessIdpour créer la clé API et, pour les paiements suivants, les webhooks transaction du marchand
id d'erreur | HTTP | Signification |
|---|---|---|
user_not_found | 404 | Aucun utilisateur Jèko pour ce téléphone — utilisez business_onboarding |
no_owned_business | 409 | L'utilisateur existe mais n'est Owner d'aucune entreprise |
already_linked | 409 | Le rattachement existe déjà. Le champ extras contient le merchantBusinessId : vous pouvez créer des clés tout de suite |
Créer la clé API
POST /partner_api/service_providers/business_api_keysRequête :
{
"merchantBusinessId": "59ae202a-f583-4a15-970f-9e99bd1e0baa",
"name": "Clé API de production"
}Réponse :
{
"id": "a3c81f3d-ee04-4ec5-8bd2-cd8af5dabcfc",
"name": "Clé API de production",
"businessId": "59ae202a-f583-4a15-970f-9e99bd1e0baa",
"key": "jeko_live_abc123def456ghi789jkl012mno345pqr678stu901vwx234yz"
}Le champ key n'est retourné qu'une seule fois. Stockez-le immédiatement : il est irrécupérable ensuite. Le champ id sert de X-API-KEY-ID pour l'authentification.
Gestion des erreurs courantes
Numéro de téléphone déjà utilisé (409 phone_already_in_use)
L'onboarding est create-only. Ce téléphone a déjà un compte Jèko. Enchaînez avec (voir Rattacher un marchand déjà inscrit).
Utilisateur introuvable (404 user_not_found)
La demande de rattachement n'a trouvé aucun utilisateur. Créez le marchand avec business_onboarding.
Aucune entreprise possédée (409 no_owned_business)
L'utilisateur existe mais n'est Owner d'aucune entreprise. Un cashier ou un director d'une entreprise d'un tiers n'est pas ciblé.
Déjà rattaché (409 already_linked)
Un membre service_provider existe déjà entre vous et ce marchand. Le champ extras de la réponse est le merchantBusinessId : créez les clés API sans nouvelle demande.
Accès refusé (403)
Vous ne pouvez créer des clés API que pour les marchands que vous avez intégrés. Vérifiez que le merchantBusinessId correspond à un marchand que vous avez intégré.
Erreurs de validation (422)
Vérifiez que les valeurs de category, city, municipality correspondent aux données retournées par les endpoints de référence.
Limitation de débit (Rate Limiting)
Pour garantir la stabilité et la disponibilité de l'API, Jèko applique des limites de débit au niveau applicatif.
Les limites sont appliquées par entreprise, et non par clé API. La création de plusieurs clés API ne permet pas de contourner les limites.
Limites appliquées
| Type de limite | Quota | Fenêtre de temps |
|---|---|---|
| Limite standard | 500 requêtes | par minute |
| Limite burst | 1 000 requêtes | par 5 minutes |
Comportement en cas de dépassement
- Blocage temporaire : Votre entreprise sera bloquée pendant 10 à 15 minutes
- Réponse HTTP 429 : Toutes les requêtes pendant le blocage recevront une réponse
429 Too Many Requests
Exemple de réponse 429
{
"statusCode": 429,
"error": "Too Many Requests",
"message": "Rate limit exceeded. Please retry after some time."
}Gestion du rate limiting avec backoff exponentiel
async function makeRequestWithRetry(url, options, maxRetries = 5) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const waitTime = Math.pow(2, attempt) * 1000;
console.log(`Rate limited. Attente de ${waitTime}ms avant nouvelle tentative...`);
await new Promise(resolve => setTimeout(resolve, waitTime));
continue;
}
return response;
}
throw new Error('Nombre maximum de tentatives dépassé');
}Si vous avez besoin de limites plus élevées, contactez notre équipe à hello@jeko.africa.
Bonnes pratiques
- Sécurité des clés API : Stockez les clés API brutes dans un coffre-fort sécurisé dès leur création
- Validation : Utilisez toujours les endpoints de référence pour valider les valeurs avant l'intégration
- Gestion d'erreurs : Renvoyez des messages compréhensibles par le marchand
- Limitation de débit : Implémentez le backoff exponentiel pour gérer les erreurs 429
Exemples de code
async function onboardMerchant(merchantData) {
const response = await fetch('https://api.jeko.africa/partner_api/service_providers/business_onboarding', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': process.env.SERVICE_PROVIDER_API_KEY,
'X-API-KEY-ID': process.env.SERVICE_PROVIDER_API_KEY_ID,
},
body: JSON.stringify(merchantData),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Échec de l'intégration : ${JSON.stringify(error)}`);
}
return await response.json();
}
async function createApiKey(merchantBusinessId, keyName) {
const response = await fetch('https://api.jeko.africa/partner_api/service_providers/business_api_keys', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-KEY': process.env.SERVICE_PROVIDER_API_KEY,
'X-API-KEY-ID': process.env.SERVICE_PROVIDER_API_KEY_ID,
},
body: JSON.stringify({ merchantBusinessId, name: keyName }),
});
if (!response.ok) {
const error = await response.json();
throw new Error(`Échec de la création de la clé API : ${JSON.stringify(error)}`);
}
const result = await response.json();
// IMPORTANT : Sauvegarder la clé brute de manière sécurisée
await saveApiKeySecurely(merchantBusinessId, result.key, result.id);
return result;
}Et ensuite
Le marchand est intégré et dispose de ses clés. À partir de là, il utilise la Partner API comme n'importe quel partenaire Jèko :
- Paiements : encaisser en boutique, en ligne ou en application
- Transferts : envoyer des fonds vers Mobile Money ou compte bancaire
- Webhooks : recevoir les notifications de transaction
Les clés que vous lui avez créées s'authentifient exactement de la même façon, avec les en-têtes X-API-KEY et X-API-KEY-ID.