Agent API Fidelioo
Interface machine-à-machine (M2M) de Fidelioo, conçue pour les agents IA, systèmes de caisse, automates et plateformes d'intégration.
En-tête X-Agent-Key au lieu d'un token Bearer — pas de session, pas de refresh.
Endpoint de découverte retournant les outils au format function calling d'OpenAI.
Chaque clé dispose de scopes précis : lecture seule, lecture-écriture ou admin.
Chaque action effectuée via l'Agent API est tracée avec horodatage, IP et résultat.
Différences avec l'API REST standard
| Caractéristique | API REST | Agent API |
|---|---|---|
| Authentification | Authorization: Bearer {token} | X-Agent-Key: fid_agent_xxx |
| Gestion de session | Token avec expiration et refresh | Clé permanente (jusqu'à révocation) |
| Public cible | Applications web / mobile | Agents IA, POS, automatisations |
| Discovery | Non disponible | Endpoint /tools format OpenAI |
| Audit trail | Logs standard | Journaux d'audit détaillés et exportables |
| URL de base | /api/{locale}/v1/ | /api/agent/v1/ |
Créer une clé d'agent
Les clés d'agent se gèrent depuis le tableau de bord partenaire, rubrique Paramètres → API → Clés d'agent.
Étapes de création
- Accédez à Paramètres → Intégrations → Agent API
- Cliquez sur Nouvelle clé d'agent
- Donnez un nom descriptif à la clé (ex. : "Caisse principale - POS", "ChatBot WhatsApp")
- Sélectionnez le type de clé (lecture seule, lecture-écriture ou admin)
- Sélectionnez les scopes nécessaires
- Optionnellement, restreignez l'accès par adresse IP
- Cliquez sur Générer
Format d'une clé d'agent
Les clés suivent le format fid_agent_{env}_{secret_aléatoire} où env est sk_prod (production) ou sk_test (test).
Gestion du cycle de vie
| Action | Endpoint admin | Description |
|---|---|---|
| Lister | GET /api/agent/v1/partner/keys | Toutes les clés actives |
| Créer | POST /api/agent/v1/partner/keys | Nouvelle clé d'agent |
| Détails | GET /api/agent/v1/partner/keys/{id} | Infos sur une clé (sans le secret) |
| Modifier | PUT /api/agent/v1/partner/keys/{id} | Renommer, modifier les scopes |
| Révoquer | DELETE /api/agent/v1/partner/keys/{id} | Révocation immédiate et permanente |
| Rotation | POST /api/agent/v1/partner/keys/{id}/rotate | Régénère le secret, révoque l'ancien |
Première requête
Une fois votre clé générée, effectuez votre première requête pour vérifier que tout fonctionne correctement.
curl -X GET https://fidelioo.co/api/agent/health \ -H "X-Agent-Key: fid_agent_sk_prod_a8b3c9d2e1f4g5h6i7j8k9l0m1n2o3p4"
{
"status": "ok",
"timestamp": "2026-03-27T09:30:00Z",
"version": "1.0.0",
"agent": {
"key_id": "key_48291",
"name": "Caisse principale - POS",
"partner": "Boulangerie Central",
"type": "read_write",
"scopes": ["members:read", "points:write", "stamps:write"],
"ip_restriction": null
}
}
En-têtes requis
| En-tête | Valeur | Requis |
|---|---|---|
X-Agent-Key | Votre clé d'agent complète | Oui |
Content-Type | application/json | Pour les requêtes POST/PUT |
X-Agent-Trace-Id | Identifiant unique de la requête | Non (recommandé) |
X-Agent-Source | Nom du système appelant (ex. : "POS-CAISSE-1") | Non (recommandé) |
X-Agent-Trace-Id avec un UUID unique par requête. Cet identifiant apparaîtra dans les journaux d'audit et facilitera le débogage en production.
Vérification de santé
L'endpoint de santé permet de vérifier la disponibilité de l'Agent API sans authentification (pour les sondes de monitoring) ou avec authentification (pour vérifier la validité de la clé).
| Méthode | Endpoint | Auth requise | Description |
|---|---|---|---|
| GET | /api/agent/health | Non | Statut de l'API (public) |
| GET | /api/agent/health | Oui | Statut + infos de la clé |
| GET | /api/agent/docs | Non | Documentation HTML interactive |
| GET | /api/agent/docs.json | Non | Documentation au format JSON |
{
"status": "ok",
"timestamp": "2026-03-27T09:30:00Z",
"version": "1.0.0",
"services": {
"database": "ok",
"cache": "ok",
"sms": "ok"
}
}
Types de clés
Fidelioo propose trois types de clés d'agent avec des niveaux d'accès progressifs :
Peut uniquement lire les données (membres, cartes, transactions, statistiques). Aucune modification possible. Idéal pour les tableaux de bord et les systèmes d'analyse.
Peut lire et modifier les données opérationnelles : ajouter des points, valider des tampons, créer des membres, utiliser des bons. Recommandé pour les systèmes de caisse et les chatbots.
Accès complet incluant la gestion des partenaires, la configuration des plans et les opérations sensibles. À utiliser uniquement pour les automatisations d'administration internes.
Scopes disponibles
Chaque clé peut être limitée à des scopes spécifiques pour appliquer le principe du moindre privilège.
| Scope | Type | Description |
|---|---|---|
members:read | READ | Consulter la liste et les profils des membres |
members:write | WRITE | Créer et modifier des membres |
points:read | READ | Consulter les soldes et l'historique des points |
points:write | WRITE | Attribuer et déduire des points |
stamps:read | READ | Consulter les tampons collectés |
stamps:write | WRITE | Valider des tampons |
rewards:read | READ | Lister les récompenses disponibles |
rewards:write | WRITE | Traiter les échanges de récompenses |
coupons:read | READ | Consulter et vérifier les bons |
coupons:write | WRITE | Créer et distribuer des bons |
clubs:read | READ | Consulter les clubs |
clubs:write | WRITE | Créer et modifier des clubs |
cards:read | READ | Consulter les cartes de fidélité et tampons |
cards:write | WRITE | Créer et modifier des cartes |
staff:read | READ | Consulter le staff |
staff:write | WRITE | Gérer le staff et leurs permissions |
transactions:read | READ | Lire l'historique des transactions |
stats:read | READ | Accéder aux statistiques et tableaux de bord |
partners:read | ADMIN | Lister et consulter tous les partenaires |
partners:write | ADMIN | Créer et modifier des partenaires |
subscriptions:write | ADMIN | Modifier les abonnements des partenaires |
audit:read | ADMIN | Accéder aux journaux d'audit complets |
Sécurité
Restriction par IP
Chaque clé d'agent peut être restreinte à une liste d'adresses IP autorisées. Toute requête provenant d'une IP non autorisée sera rejetée avec une erreur 403 IP_NOT_ALLOWED.
{
"name": "Caisse principale - POS",
"type": "read_write",
"scopes": ["members:read", "points:write", "stamps:write"],
"allowed_ips": ["196.192.168.1", "196.192.168.2"]
}
Rotation des clés
Il est recommandé de faire tourner les clés d'agent régulièrement (tous les 90 jours en production). La rotation génère une nouvelle clé et révoque automatiquement l'ancienne après un délai de grâce configurable (0 à 24 heures).
Révocation d'urgence
En cas de compromission suspectée d'une clé, révoquez-la immédiatement depuis le tableau de bord ou via l'API admin. La révocation est instantanée — toutes les requêtes ultérieures avec cette clé retourneront 401 KEY_REVOKED.
Bonnes pratiques
- Créez une clé distincte par système ou application (une clé par caisse, une clé par chatbot, etc.)
- Appliquez le principe du moindre privilège : accordez uniquement les scopes nécessaires
- Activez la restriction IP pour les systèmes avec une IP fixe
- Stockez les clés dans un gestionnaire de secrets (HashiCorp Vault, AWS Secrets Manager, etc.)
- Ne transmettez jamais les clés dans des URLs ou des logs
- Configurez des alertes sur les anomalies d'utilisation dans les journaux d'audit
.env) et assurez-vous que .env figure dans votre .gitignore.
Format OpenAI — Tool Calling
L'Agent API Fidelioo est entièrement compatible avec le format function calling d'OpenAI (et tout LLM supportant ce standard). L'endpoint de découverte retourne la liste des outils disponibles dans le format attendu par l'API OpenAI.
Cela permet à un agent IA (GPT-4, Claude, Gemini, etc.) d'appeler automatiquement les fonctions Fidelioo selon le contexte de la conversation avec le client.
Exemple d'outil — Format OpenAI
{
"tools": [
{
"type": "function",
"function": {
"name": "add_loyalty_points",
"description": "Ajoute des points de fidélité à un membre en fonction du montant d'un achat",
"parameters": {
"type": "object",
"properties": {
"member_id": {
"type": "integer",
"description": "Identifiant unique du membre"
},
"card_id": {
"type": "integer",
"description": "Identifiant de la carte de fidélité"
},
"amount": {
"type": "number",
"description": "Montant de l'achat en XOF"
},
"note": {
"type": "string",
"description": "Note optionnelle pour la transaction"
}
},
"required": ["member_id", "card_id", "amount"]
}
}
},
{
"type": "function",
"function": {
"name": "validate_stamp",
"description": "Valide un tampon pour un membre dans un programme tampon",
"parameters": {
"type": "object",
"properties": {
"member_id": {
"type": "integer",
"description": "Identifiant unique du membre"
},
"stamp_card_id": {
"type": "integer",
"description": "Identifiant du programme tampon"
}
},
"required": ["member_id", "stamp_card_id"]
}
}
},
{
"type": "function",
"function": {
"name": "get_member_by_phone",
"description": "Recherche un membre par son numéro de téléphone et retourne son profil avec ses cartes",
"parameters": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Numéro de téléphone au format international (ex: +22961000000)"
}
},
"required": ["phone"]
}
}
},
{
"type": "function",
"function": {
"name": "redeem_reward",
"description": "Traite l'échange d'une récompense par un membre",
"parameters": {
"type": "object",
"properties": {
"redemption_code": {
"type": "string",
"description": "Code d'échange généré par le membre"
},
"member_pin": {
"type": "string",
"description": "PIN à 4 chiffres du membre pour confirmation"
}
},
"required": ["redemption_code", "member_pin"]
}
}
},
{
"type": "function",
"function": {
"name": "validate_coupon",
"description": "Vérifie la validité d'un bon de réduction et l'applique à une transaction",
"parameters": {
"type": "object",
"properties": {
"coupon_code": {
"type": "string",
"description": "Code du bon de réduction"
},
"member_id": {
"type": "integer",
"description": "Identifiant du membre qui utilise le bon"
},
"purchase_amount": {
"type": "number",
"description": "Montant de l'achat en XOF avant réduction"
}
},
"required": ["coupon_code", "purchase_amount"]
}
}
}
]
}
Intégration avec un assistant IA
Voici comment utiliser ces outils avec l'API OpenAI :
import requests
from openai import OpenAI
# Récupérer les outils Fidelioo
fidelioo_tools = requests.get(
"https://fidelioo.co/api/agent/v1/tools",
params={"format": "openai"},
headers={"X-Agent-Key": "fid_agent_sk_prod_xxx"}
).json()["tools"]
# Initialiser le client OpenAI
client = OpenAI()
# Appel au LLM avec les outils Fidelioo disponibles
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Tu es un assistant de caisse pour la Boulangerie Central."},
{"role": "user", "content": "Le client +22961000001 vient d'acheter pour 3500 FCFA."}
],
tools=fidelioo_tools,
tool_choice="auto"
)
Endpoints de découverte
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/agent/health | Vérification de santé de l'Agent API |
| GET | /api/agent/docs | Documentation HTML interactive complète |
| GET | /api/agent/docs.json | Documentation machine-readable (JSON Schema) |
| GET | /api/agent/v1/tools | Liste des outils disponibles (format natif) |
| GET | /api/agent/v1/tools?format=openai | Outils au format OpenAI function calling |
| GET | /api/agent/v1/tools?format=anthropic | Outils au format Anthropic tool use |
| GET | /api/agent/v1/tools/{name} | Détails d'un outil spécifique |
| GET | /api/agent/v1/scopes | Liste des scopes disponibles pour cette clé |
Paramètres de l'endpoint tools
| Paramètre | Valeurs | Description |
|---|---|---|
format | native, openai, anthropic | Format de sortie des outils |
scope | ex. points:write | Filtrer les outils par scope |
category | members, points, stamps, etc. | Filtrer par catégorie |
lang | fr, en | Langue des descriptions |
Référence — Endpoints Admin
Ces endpoints nécessitent une clé de type ADMIN avec les scopes correspondants.
Gestion des partenaires
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/admin/partners | partners:read | Lister tous les partenaires |
| GET | /api/agent/v1/admin/partners/{id} | partners:read | Détails d'un partenaire |
| POST | /api/agent/v1/admin/partners | partners:write | Créer un partenaire |
| PUT | /api/agent/v1/admin/partners/{id} | partners:write | Modifier un partenaire |
| PATCH | /api/agent/v1/admin/partners/{id}/suspend | partners:write | Suspendre un partenaire |
| PATCH | /api/agent/v1/admin/partners/{id}/activate | partners:write | Réactiver un partenaire |
Gestion des abonnements
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/admin/partners/{id}/subscription | partners:read | Abonnement d'un partenaire |
| POST | /api/agent/v1/admin/partners/{id}/subscription | subscriptions:write | Modifier l'abonnement |
| POST | /api/agent/v1/admin/partners/{id}/subscription/extend | subscriptions:write | Prolonger l'abonnement |
| GET | /api/agent/v1/admin/stats | stats:read | Statistiques globales plateforme |
Référence — Endpoints Partenaire
Ces endpoints permettent à un système d'automatiser la gestion complète d'un espace partenaire.
Membres
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/partner/members | members:read | Lister les membres |
| GET | /api/agent/v1/partner/members/{id} | members:read | Profil d'un membre |
| GET | /api/agent/v1/partner/members/lookup | members:read | Recherche par téléphone |
| POST | /api/agent/v1/partner/members | members:write | Créer un membre |
| PUT | /api/agent/v1/partner/members/{id} | members:write | Modifier un membre |
Points et tampons
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/partner/members/{id}/points | points:read | Solde et historique de points |
| POST | /api/agent/v1/partner/points/add | points:write | Attribuer des points (par montant) |
| POST | /api/agent/v1/partner/points/deduct | points:write | Déduire des points |
| GET | /api/agent/v1/partner/members/{id}/stamps | stamps:read | Tampons collectés |
| POST | /api/agent/v1/partner/stamps/validate | stamps:write | Valider un tampon |
Récompenses et bons
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/partner/rewards | rewards:read | Lister les récompenses actives |
| POST | /api/agent/v1/partner/rewards/redeem | rewards:write | Traiter un échange de récompense |
| GET | /api/agent/v1/partner/coupons/check/{code} | coupons:read | Vérifier un bon de réduction |
| POST | /api/agent/v1/partner/coupons/apply | coupons:write | Appliquer un bon à une transaction |
| POST | /api/agent/v1/partner/coupons/generate | coupons:write | Générer un bon pour un membre |
Statistiques
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/partner/stats/dashboard | stats:read | KPIs du tableau de bord |
| GET | /api/agent/v1/partner/stats/members | stats:read | Statistiques membres |
| GET | /api/agent/v1/partner/transactions | transactions:read | Historique des transactions |
curl -X POST https://fidelioo.co/api/agent/v1/partner/points/add \
-H "X-Agent-Key: fid_agent_sk_prod_a8b3c9d2e1f4g5h6" \
-H "X-Agent-Trace-Id: req_7f3a9b2c-1d4e-5f6a-7b8c-9d0e1f2a3b4c" \
-H "X-Agent-Source: POS-CAISSE-1" \
-H "Content-Type: application/json" \
-d '{
"member_id": 123,
"card_id": 5,
"amount": 7500,
"note": "Achat caisse #4892 - 27/03/2026"
}'
{
"success": true,
"data": {
"transaction_id": "txn_48291abc",
"member_id": 123,
"card_id": 5,
"amount_spent": 7500,
"points_earned": 15,
"points_balance_before": 127,
"points_balance_after": 142,
"level": "Or",
"multiplier_applied": 2,
"timestamp": "2026-03-27T09:35:12Z"
},
"audit": {
"trace_id": "req_7f3a9b2c-1d4e-5f6a-7b8c-9d0e1f2a3b4c",
"agent_key_id": "key_48291",
"source": "POS-CAISSE-1"
}
}
Référence — Endpoints Staff
Ces endpoints sont dédiés aux opérations de point de vente effectuées au nom d'un membre du staff.
| Méthode | Endpoint | Scope | Description |
|---|---|---|---|
| GET | /api/agent/v1/staff/members/lookup | members:read | Chercher un membre par téléphone ou QR |
| POST | /api/agent/v1/staff/points/add | points:write | Attribuer des points (avec ID staff) |
| POST | /api/agent/v1/staff/stamps/scan | stamps:write | Scanner et valider un tampon |
| POST | /api/agent/v1/staff/rewards/redeem | rewards:write | Valider un échange de récompense |
| POST | /api/agent/v1/staff/coupons/validate | coupons:write | Valider et appliquer un bon |
| GET | /api/agent/v1/staff/transactions | transactions:read | Transactions du staff |
curl -X POST https://fidelioo.co/api/agent/v1/staff/stamps/scan \
-H "X-Agent-Key: fid_agent_sk_prod_a8b3c9d2e1f4g5h6" \
-H "X-Agent-Trace-Id: req_unique_uuid_here" \
-H "Content-Type: application/json" \
-d '{
"qr_token": "QR_M123_STAMP_1711530912_abc123",
"staff_id": 7,
"stamp_card_id": 3
}'
{
"success": true,
"data": {
"stamp_transaction_id": "stmp_91827abc",
"member": {
"id": 123,
"name": "Kouassi Attiogbe",
"phone": "+22961000001"
},
"stamp_card": {
"id": 3,
"name": "10ème café offert",
"stamps_before": 6,
"stamps_after": 7,
"stamps_required": 10,
"progress_percent": 70
},
"reward_unlocked": false,
"timestamp": "2026-03-27T10:15:44Z"
}
}
Journaux d'audit
Chaque requête effectuée via l'Agent API génère une entrée dans le journal d'audit. Ces journaux sont immuables, horodatés et conservés pendant 2 ans.
Structure d'une entrée d'audit
{
"id": "audit_1a2b3c4d5e",
"timestamp": "2026-03-27T10:15:44Z",
"agent_key": {
"id": "key_48291",
"name": "Caisse principale - POS"
},
"partner_id": 42,
"action": "points.add",
"resource_type": "member",
"resource_id": 123,
"source_ip": "196.192.168.1",
"trace_id": "req_7f3a9b2c-1d4e-5f6a-7b8c-9d0e1f2a3b4c",
"source_label": "POS-CAISSE-1",
"request_body": {
"member_id": 123,
"card_id": 5,
"amount": 7500
},
"response_status": 200,
"result": "success",
"duration_ms": 48
}
Accès aux journaux d'audit
| Méthode | Endpoint | Description |
|---|---|---|
| GET | /api/agent/v1/admin/audit | Lister les entrées d'audit (admin) |
| GET | /api/agent/v1/partner/audit | Journaux d'audit du partenaire |
| GET | /api/agent/v1/partner/audit/{id} | Détails d'une entrée spécifique |
| GET | /api/agent/v1/partner/audit/export | Exporter en CSV (date de début/fin) |
Filtres de recherche
Les journaux peuvent être filtrés avec les paramètres suivants :
from/to— Plage de dates (ISO 8601)action— Type d'action (ex. :points.add,stamps.validate)key_id— Filtrer par clé d'agent spécifiquemember_id— Toutes les actions sur un membre donnéresult—successouerrortrace_id— Recherche exacte par trace ID
Checklist production
Avant de mettre votre intégration Agent API en production, vérifiez les points suivants :
sk_test en développement et une clé sk_prod en production. Ne mélangez jamais les deux environnements.subscriptions:write.401 (clé invalide), 429 (rate limit), 422 (erreur métier), 5xx (erreurs serveur avec retry exponentiel).X-Agent-Trace-Id. Conservez ce trace ID dans vos propres logs pour corrélation.trace_id pour les retentatives afin d'éviter les doublons.GET /api/agent/health depuis votre système de monitoring (Uptime Kuma, Datadog, etc.) pour être alerté en cas d'indisponibilité./keys/{id}/rotate avec un délai de grâce de 1 heure pour éviter les interruptions.