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

Bearer fp_live_… /api/external/v1/flexy https://flexy-pro.com

Démarrage

  1. Créez un compte partenaire depuis la page d'inscription.
  2. Attendez qu'un administrateur active votre compte.
  3. Connectez-vous → Développement → API → créez un jeton. Copiez le secret immédiatement (affiché une seule fois).
  4. 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

GET /api/external/v1/flexy/eligibility

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"
}
GET /api/external/v1/flexy/offers?phone=0661234567

Charge les offres détail disponibles pour un numéro mobile national (10 chiffres, 05 / 06 / 07).

Query

ParamRequiredDescription
phoneyes10-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"
}
POST /api/external/v1/flexy/operations

Crée une opération Flexy et débite votre portefeuille si la validation réussit.

Headers

HeaderRequiredDescription
AuthorizationyesBearer fp_live_…
Content-Typeyesapplication/json
Idempotency-KeynoUnique string; safe retries return the first successful response

Body

{
  "phone": "0551234567",
  "type": "detail",
  "amount": 100,
  "planCode": null
}
FieldTypeRules
phonestringRequired. 10 digits starting with 05, 06, or 07
typestringRequired. gros or detail
amountnumberRequired. ≥ 1.00 DZD (offers) or ≥ platform minimum (default 100) for prepaid
planCodestringOptional. 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'
GET /api/external/v1/flexy/operations

Historique paginé de vos opérations Flexy (plus récentes en premier).

ParamDefaultDescription
page0Zero-based page index
size10Page 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, …)

GET /api/external/v1/flexy/operations/{id}

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 :

EndpointLimit
POST create5 / minute, 60 / hour
GET offers3 / 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

HTTPMeaningTypical 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é

  1. Appelez GET /eligibility — vérifiez que canOperate est true et que le montant ≤ solde.
  2. Pour les packs d'offres : GET /offers?phone=…, choisissez un planCode et le montant correspondant.
  3. Appelez POST /operations avec un Idempotency-Key unique.
  4. Stockez data.id. Interrogez GET /operations/{id} ou la liste jusqu'à un statut terminal (FULFILLED, REFUNDED, FAILED, …).
  5. 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.