API partenaire
Intégrez Flexy dans votre produit
Authentifiez-vous avec un jeton API Bearer et créez des recharges Flexy pour les numéros Mobilis, Djezzy et Ooredoo. Ce guide couvre l'authentification, chaque endpoint, des exemples de payloads, les codes HTTP et un flux d'intégration recommandé.
Démarrage
- Créez un compte partenaire depuis la page d'inscription.
- Attendez qu'un administrateur active votre compte.
- Connectez-vous → Développement → API → créez un jeton. Copiez le secret immédiatement (affiché une seule fois).
- Alimentez votre portefeuille (recharge CCP / CIB), puis commencez à appeler l'API avec votre jeton.
URL de base
URL de base de production (à utiliser dans toutes les intégrations) :
https://flexy-pro.com/api/external/v1/flexy
Authentification
Chaque requête sous /api/external/v1/** exige un jeton Bearer créé dans le portail partenaire.
Authorization: Bearer fp_live_YOUR_SECRET
- Stockez le secret dans un gestionnaire de secrets — il n'est plus jamais affiché après création/rotation.
- Les jetons désactivés ou supprimés renvoient HTTP 401.
- Les cookies de session ne sont pas utilisés pour l'API externe.
Exemple (cURL)
curl -sS \\ -H 'Authorization: Bearer fp_live_YOUR_SECRET' \\ -H 'Accept: application/json' \\ 'https://flexy-pro.com/api/external/v1/flexy/eligibility'
Format de réponse
Toutes les réponses utilisent une enveloppe commune :
{
"status": "SUCCESS" | "ERROR",
"message": "Human-readable message",
"data": { ... },
"timestamp": "2026-10-01T12:00:00Z",
"errors": { "field": "optional field errors" }
}
Endpoints
Retourne l'éligibilité du portefeuille : montant minimum, solde actuel, et si vous pouvez opérer.
200 — OK
{
"status": "SUCCESS",
"message": "OK",
"data": {
"minAmountDzd": 100,
"balance": 1500.00,
"canOperate": true
},
"timestamp": "2026-10-01T12:00:00Z"
}
Charge les offres détail disponibles pour un numéro mobile national (10 chiffres, 05 / 06 / 07).
Query
| Param | Required | Description |
|---|---|---|
phone | yes | 10-digit Algerian mobile |
200 — OK · 400 — invalid phone · 429 — rate limited · 502 — offers unavailable
{
"status": "SUCCESS",
"message": "OK",
"data": {
"offers": [
{ "planCode": "EXAMPLE_PLAN", "label": "Offer label", "amount": 500 }
],
"terminalStatus": null,
"providerMessage": null
},
"timestamp": "2026-10-01T12:00:00Z"
}
Crée une opération Flexy et débite votre portefeuille si la validation réussit.
Headers
| Header | Required | Description |
|---|---|---|
Authorization | yes | Bearer fp_live_… |
Content-Type | yes | application/json |
Idempotency-Key | no | Unique string; safe retries return the first successful response |
Body
{
"phone": "0551234567",
"type": "detail",
"amount": 100,
"planCode": null
}
| Field | Type | Rules |
|---|---|---|
phone | string | Required. 10 digits starting with 05, 06, or 07 |
type | string | Required. gros or detail |
amount | number | Required. ≥ 1.00 DZD (offers) or ≥ platform minimum (default 100) for prepaid |
planCode | string | Optional. Only with type: "detail" for fixed offers |
Gros example
{
"phone": "0771234567",
"type": "gros",
"amount": 500
}
Detail with offer
{
"phone": "0661234567",
"type": "detail",
"amount": 500,
"planCode": "EXAMPLE_PLAN"
}
201 — created
{
"status": "SUCCESS",
"message": "Flexy operation completed",
"data": {
"id": 12345,
"balanceAfter": 1000.00,
"totalGainsAfter": 12.50
},
"timestamp": "2026-10-01T12:00:00Z"
}
curl -sS -X POST \\
-H 'Authorization: Bearer fp_live_YOUR_SECRET' \\
-H 'Content-Type: application/json' \\
-H 'Idempotency-Key: order-abc-001' \\
-d '{"phone":"0551234567","type":"detail","amount":100}' \\
'https://flexy-pro.com/api/external/v1/flexy/operations'
Historique paginé de vos opérations Flexy (plus récentes en premier).
| Param | Default | Description |
|---|---|---|
page | 0 | Zero-based page index |
size | 10 | Page size (max 50) |
search | — | Optional free-text filter |
type | — | gros or detail |
status | — | PENDING, HANDLING, FULFILLED, REFUNDED, UNKNOWN_ERROR, FAILED |
200 — OK (data is a page object with content, totalElements, …)
Récupère une opération que vous possédez par id.
200 — OK · 404 — not found
Idempotence
Sur POST /operations, envoyez un en-tête Idempotency-Key unique par opération métier (par ex. votre id de commande). Les retries avec la même clé renvoient la première réponse réussie au lieu de créer un Flexy en double.
Limites de débit
Les limites s'appliquent par jeton API :
| Endpoint | Limit |
|---|---|
| POST create | 5 / minute, 60 / hour |
| GET offers | 3 / minute |
En cas de dépassement, l'API renvoie 429 avec l'en-tête Retry-After (secondes) et le message flexy.error.rateLimited.
Erreurs et codes HTTP
| HTTP | Meaning | Typical cause |
|---|---|---|
| 200 | OK | eligibility, offers, list, get |
| 201 | Created | Flexy operation accepted |
| 400 | Bad request | Invalid phone, amount below/above limits, invalid type, planCode misuse |
| 401 | Unauthorized | Missing, invalid, or disabled Bearer token |
| 403 | Forbidden | Token not linked to an active partner |
| 404 | Not found | Unknown operation id |
| 429 | Too many requests | Rate limit exceeded — honor Retry-After |
| 502 | Bad gateway | Upstream fulfillment failed (retry later or contact support with the operation id) |
| 503 | Unavailable | Temporary capacity / balance issue on the fulfillment side |
Exemple de corps d'erreur
{
"status": "ERROR",
"message": "Insufficient balance for this amount.",
"timestamp": "2026-10-01T12:00:00Z"
}
{
"status": "ERROR",
"message": "Missing or invalid Authorization Bearer token",
"timestamp": "2026-10-01T12:00:00Z"
}
Flux d'intégration recommandé
- Appelez GET /eligibility — vérifiez que canOperate est true et que le montant ≤ solde.
- Pour les packs d'offres : GET /offers?phone=…, choisissez un planCode et le montant correspondant.
- Appelez POST /operations avec un Idempotency-Key unique.
- Stockez data.id. Interrogez GET /operations/{id} ou la liste jusqu'à un statut terminal (FULFILLED, REFUNDED, FAILED, …).
- Sur 429, attendez Retry-After secondes et réessayez avec la même clé d'idempotence.
Bonnes pratiques
- N'embarquez jamais de secrets API dans des apps mobiles ou frontends publics.
- Faites tourner les jetons depuis Développement → API si un secret fuit.
- Envoyez toujours Idempotency-Key à la création pour éviter les doubles recharges sur retry réseau.
- Utilisez l'URL de production https://flexy-pro.com dans les systèmes live.
- Gardez les jetons côté serveur uniquement et suivez les opérations depuis votre portail partenaire.