> ## 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.

# Sécurité

> Bonnes pratiques de sécurité pour l'utilisation de l'API JEKO

## Bonnes pratiques de sécurité

### Protection des clés API

* **Gardez vos clés API sécurisées** : Ne les exposez jamais dans le code côté client
* **Accès complet** : Les clés API fournissent un accès complet à votre compte d'entreprise
* **Rotation régulière** : Faites tourner vos clés régulièrement pour une sécurité renforcée
* **HTTPS obligatoire** : Utilisez HTTPS pour toutes les requêtes API

### Authentification des webhooks

Lorsque vous recevez des notifications webhook, vous devez vérifier leur authenticité :

* **Vérification de la signature** : Utilisez l'en-tête `Jeko-Signature` pour vérifier l'authenticité des webhooks
* **Algorithme** : La signature est générée en utilisant HMAC-SHA256 avec votre secret webhook
* **HTTPS pour les endpoints** : Utilisez des endpoints HTTPS pour vos URLs de webhook

### Gestion des erreurs

* Ne loggez jamais les clés API dans vos journaux
* Ne partagez jamais vos clés API via des canaux non sécurisés
* Utilisez des variables d'environnement pour stocker vos clés API

## Limitation de débit (Rate Limiting)

Pour garantir la stabilité et la disponibilité de l'API pour tous les utilisateurs, Jeko applique des limites de débit au niveau applicatif.

### Caractéristiques clés

<Info>
  Les limites sont appliquées **par entreprise** (business), et non par clé API. Cela signifie que la création de plusieurs clés API ne permet pas de contourner les limites.
</Info>

### Limites appliquées

| Type de limite      | Quota         | Fenêtre de temps |
| ------------------- | ------------- | ---------------- |
| **Limite standard** | 500 requêtes  | par minute       |
| **Limite burst**    | 1000 requêtes | par 5 minutes    |

### Comportement en cas de dépassement

Lorsque les limites sont dépassées :

1. **Blocage temporaire** : Votre entreprise sera temporairement bloquée pendant **10 à 15 minutes**
2. **Réponse HTTP 429** : Toutes les requêtes pendant la période de blocage recevront une réponse `429 Too Many Requests`
3. **Journalisation** : Les dépassements de limite sont enregistrés pour le monitoring

### Exemple de réponse 429

```json theme={null}
{
  "statusCode": 429,
  "error": "Too Many Requests",
  "message": "Rate limit exceeded. Please retry after some time."
}
```

### Bonnes pratiques pour éviter le rate limiting

<CardGroup cols={2}>
  <Card title="Implémenter le backoff exponentiel" icon="clock-rotate-left">
    En cas d'erreur 429, attendez progressivement plus longtemps entre chaque tentative (ex: 1s, 2s, 4s, 8s...)
  </Card>

  <Card title="Mettre en cache les réponses" icon="database">
    Évitez les appels répétitifs pour les mêmes données en utilisant un cache local
  </Card>

  <Card title="Regrouper les requêtes" icon="layer-group">
    Utilisez les endpoints batch lorsqu'ils sont disponibles plutôt que des requêtes individuelles
  </Card>

  <Card title="Surveiller votre consommation" icon="chart-line">
    Implémentez un monitoring pour suivre votre utilisation de l'API
  </Card>
</CardGroup>

### Exemple d'implémentation du backoff exponentiel

```javascript theme={null}
async function makeRequestWithRetry(url, options, maxRetries = 5) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options);
    
    if (response.status === 429) {
      // Backoff exponentiel: 1s, 2s, 4s, 8s, 16s
      const waitTime = Math.pow(2, attempt) * 1000;
      console.log(`Rate limited. Waiting ${waitTime}ms before retry...`);
      await new Promise(resolve => setTimeout(resolve, waitTime));
      continue;
    }
    
    return response;
  }
  
  throw new Error('Max retries exceeded');
}
```

```python theme={null}
import time
import requests

def make_request_with_retry(url, headers, max_retries=5):
    for attempt in range(max_retries):
        response = requests.get(url, headers=headers)
        
        if response.status_code == 429:
            # Backoff exponentiel: 1s, 2s, 4s, 8s, 16s
            wait_time = (2 ** attempt)
            print(f"Rate limited. Waiting {wait_time}s before retry...")
            time.sleep(wait_time)
            continue
        
        return response
    
    raise Exception('Max retries exceeded')
```

<Warning>
  Si vous avez besoin de limites plus élevées pour votre cas d'utilisation, veuillez contacter notre équipe à **[hello@jeko.africa](mailto:hello@jeko.africa)** pour discuter de vos besoins.
</Warning>
