Jèko
Service Providers

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_here

Workflow 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 city et municipality
  • 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 category et categoryActivity

Intégrer le marchand

POST /partner_api/service_providers/business_onboarding

Structure 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_requests

Requê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 :

  1. Interrogez jusqu'à accepted ou rejected (les demandes expirent au bout de 7 jours, statut expired)
  2. Si le marchand a déjà un webhook d'entreprise (business_webhook_subscriptions ou 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
  3. Quand status est accepted, utilisez merchantBusinessId pour créer la clé API et, pour les paiements suivants, les webhooks transaction du marchand
id d'erreurHTTPSignification
user_not_found404Aucun utilisateur Jèko pour ce téléphone — utilisez business_onboarding
no_owned_business409L'utilisateur existe mais n'est Owner d'aucune entreprise
already_linked409Le 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_keys

Requê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 limiteQuotaFenêtre de temps
Limite standard500 requêtespar minute
Limite burst1 000 requêtespar 5 minutes

Comportement en cas de dépassement

  1. Blocage temporaire : Votre entreprise sera bloquée pendant 10 à 15 minutes
  2. 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

  1. Sécurité des clés API : Stockez les clés API brutes dans un coffre-fort sécurisé dès leur création
  2. Validation : Utilisez toujours les endpoints de référence pour valider les valeurs avant l'intégration
  3. Gestion d'erreurs : Renvoyez des messages compréhensibles par le marchand
  4. 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.

On this page