> ## Documentation Index
> Fetch the complete documentation index at: https://developer.jeko.africa/llms.txt
> Use this file to discover all available pages before exploring further.

# Gérer les échecs de transfert

> Comprendre les raisons d'échec des transferts et comment les gérer

## Vue d'ensemble

Les transferts peuvent échouer pour diverses raisons. Ce guide vous aide à comprendre les erreurs courantes et comment les gérer dans votre application.

## Statuts de transfert

Les transferts peuvent avoir les statuts suivants :

* `pending` : Le transfert est en cours de traitement
* `success` : Le transfert a été effectué avec succès
* `error` : Le transfert a échoué

## Erreurs communes

### Solde insuffisant (400 Bad Request)

**Erreur** : `insufficient_balance`

**Message** : "Insufficient balance"

**Cause** : Le magasin ne dispose pas de fonds suffisants pour effectuer le transfert (montant + frais).

**Solution** :

* Vérifiez le solde du magasin avant de créer le transfert
* Assurez-vous que le solde couvre le montant du transfert plus les frais
* Provisionnez le compte du magasin si nécessaire

**Exemple de réponse** :

```json theme={null}
{
  "id": "insufficient_balance",
  "message": "Insufficient balance",
  "extras": "Wallet balance is not sufficient for this transfer"
}
```

### Transfert échoué (400 Bad Request)

**Erreur** : `transfer_failed`

**Message** : "Transfer failed to finish"

**Cause** : Le traitement du transfert a échoué côté opérateur (Mobile Money ou banque).

**Solution** :

* Vérifiez que les informations du contact bénéficiaire sont correctes
* Vérifiez que le numéro de téléphone ou le compte bancaire est actif
* Réessayez le transfert après un court délai
* Contactez le support si le problème persiste

**Exemple de réponse** :

```json theme={null}
{
  "id": "transfer_failed",
  "message": "Transfer failed to finish",
  "extras": "Transfer processing failed"
}
```

### Contact non trouvé (404 Not Found)

**Erreur** : `contact_not_found`

**Message** : "Contact not found"

**Cause** : Le `contactId` fourni n'existe pas ou n'appartient pas à votre entreprise.

**Solution** :

* Vérifiez que le `contactId` est correct
* Assurez-vous que le contact a été créé avant d'effectuer le transfert
* Utilisez l'endpoint `/partner_api/contacts` pour lister vos contacts

**Exemple de réponse** :

```json theme={null}
{
  "id": "contact_not_found",
  "message": "Contact not found",
  "extras": "Contact not found"
}
```

### Magasin non trouvé (404 Not Found)

**Erreur** : `store_not_found`

**Message** : "Store not found"

**Cause** : Le `storeId` fourni n'existe pas ou n'appartient pas à votre entreprise.

**Solution** :

* Vérifiez que le `storeId` est correct
* Utilisez l'endpoint `/partner_api/stores` pour lister vos magasins
* Assurez-vous que le magasin existe et est actif

**Exemple de réponse** :

```json theme={null}
{
  "id": "store_not_found",
  "message": "Store not found",
  "extras": "Store not found"
}
```

### Erreur de validation (422 Unprocessable Entity)

**Erreur** : `validation_error`

**Message** : "Validation error"

**Cause** : Les données fournies ne respectent pas les règles de validation (montant minimum, format de devise, etc.).

**Solution** :

* Vérifiez que le montant respecte le minimum (500 centimes = 5 XOF)
* Vérifiez que la devise est au format ISO 4217 (3 caractères)
* Vérifiez que tous les champs requis sont présents et valides
* Vérifiez que la description ne dépasse pas 255 caractères

**Exemples de problèmes de validation** :

* Montant inférieur à 500 centimes
* Code devise invalide (doit être "XOF" ou autre code ISO 4217 valide)
* Champs requis manquants

### Clé API invalide (401 Unauthorized)

**Erreur** : `unauthorized`

**Message** : "Unauthorized"

**Cause** : Les clés API sont invalides, manquantes ou expirées.

**Solution** :

* Vérifiez que les en-têtes `X-API-KEY` et `X-API-KEY-ID` sont présents
* Vérifiez que les clés API sont correctes
* Régénérez vos clés API depuis le Jeko Cockpit si nécessaire

### Accès interdit (403 Forbidden)

**Erreur** : `forbidden`

**Message** : "Forbidden"

**Cause** : La clé API n'a pas la permission d'accéder à cette ressource ou d'effectuer cette action.

**Solution** :

* Vérifiez les permissions de votre clé API
* Contactez le support pour vérifier les permissions de votre compte

## Gestion des erreurs dans votre application

### Vérification préventive

Avant de créer un transfert, effectuez ces vérifications :

1. **Vérifier l'existence du contact** :

```bash theme={null}
curl -X GET "https://api.jeko.africa/partner_api/contacts/{contactId}" \
  -H "X-API-KEY: your_api_key_here" \
  -H "X-API-KEY-ID: your_api_key_id_here"
```

2. **Vérifier le solde du magasin** :

```bash theme={null}
curl -X GET "https://api.jeko.africa/partner_api/stores/{storeId}/balance" \
  -H "X-API-KEY: your_api_key_here" \
  -H "X-API-KEY-ID: your_api_key_id_here"
```

3. **Valider les données** :
   * Montant superieur ou égale 500 centimes
   * Code devise valide (ISO 4217)
   * Description inferieur ou égale 255 caractères

### Gestion des erreurs dans le code

```javascript theme={null}
async function createTransfer(storeId, contactId, amountCents, currency, description) {
  try {
    // Vérifier le solde avant le transfert
    const balance = await checkStoreBalance(storeId);
    const requiredAmount = amountCents + estimatedFees; // Inclure les frais estimés
    
    if (balance < requiredAmount) {
      throw new Error('Solde insuffisant');
    }
    
    // Créer le transfert
    const response = await fetch('https://api.jeko.africa/partner_api/transfers', {
      method: 'POST',
      headers: {
        'X-API-KEY': apiKey,
        'X-API-KEY-ID': apiKeyId,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        storeId,
        contactId,
        amountCents,
        currency,
        description
      })
    });
    
    if (!response.ok) {
      const error = await response.json();
      
      // Gérer les erreurs spécifiques
      switch (error.id) {
        case 'insufficient_balance':
          // Gérer le solde insuffisant
          console.error('Solde insuffisant:', error.message);
          break;
        case 'contact_not_found':
          // Gérer le contact introuvable
          console.error('Contact introuvable:', error.message);
          break;
        case 'store_not_found':
          // Gérer le magasin introuvable
          console.error('Magasin introuvable:', error.message);
          break;
        case 'transfer_failed':
          // Gérer l'échec du transfert
          console.error('Transfert échoué:', error.message);
          // Optionnel : réessayer après un délai
          break;
        default:
          console.error('Erreur inconnue:', error);
      }
      
      throw error;
    }
    
    return await response.json();
  } catch (error) {
    // Gérer les erreurs réseau ou autres
    console.error('Erreur lors de la création du transfert:', error);
    throw error;
  }
}
```

## Utilisation des webhooks pour le suivi

Configurez des webhooks pour être notifié automatiquement des changements de statut des transferts. Cela vous permet de :

* Suivre les transferts en temps réel
* Gérer les échecs automatiquement
* Mettre à jour votre système lorsque le statut change

Consultez la documentation [Webhooks](../webhooks/introduction) pour plus d'informations.

## Bonnes pratiques

1. **Vérifications préventives** : Toujours vérifier le solde et l'existence du contact avant de créer un transfert
2. **Gestion d'erreurs robuste** : Implémentez une gestion d'erreurs complète pour tous les cas d'échec
3. **Logging** : Enregistrez toutes les erreurs pour le débogage et l'analyse
4. **Retry logic** : Pour les erreurs temporaires (comme `transfer_failed`), implémentez une logique de réessai avec backoff exponentiel
5. **Notifications utilisateur** : Informez l'utilisateur des erreurs de manière claire et actionnable
6. **Monitoring** : Surveillez les taux d'échec pour identifier les problèmes récurrents

## Support

Si vous rencontrez des erreurs persistantes ou des problèmes non documentés, contactez le support JEKO à [hello@jeko.africa](mailto:hello@jeko.africa).
