Premiers Pas
Ce guide vous accompagne dans vos premières interactions avec l'API FTTX Covage. Vous apprendrez comment vous authentifier et réaliser une demande d'éligibilité.
1. Authentification
Fonctionnement
L'authentification se fait par un jeton d'accès (access token) qui est à récupérer dans la réponse de la demande d'authentification. Nous utilisons le protocole OAuth2 pour l'authentification.
Il faudra pour cela récupérer un jeton d'accès (access token) en utilisant le flux d'authentification par mot de passe avec le compte de service (service account) de l'API que Covage vous fournira.
Récupération du jeton d'accès
Récupération du jeton d'accès (access token) pour l'API Covage.
POST {keycloak-url}/auth/realms/covage/protocol/openid-connect/token
En-tête
| Nom | Type | Description |
|---|---|---|
| Content-Type | string | Type de contenu de la requête (application/x-www-form-urlencoded) |
Paramètres
| Nom | Type | Description | Obligatoire |
|---|---|---|---|
| grant_type | string | Type de flux d'authentification (password) | Oui |
| client_id | string | Identifiant du client (api-client) | Oui |
| username | string | Nom d'utilisateur du compte de service | Oui |
| password | string | Mot de passe du compte de service | Oui |
Informations d'identification
Le username et le mot de passe sont fournis par Covage.
Le client_id est toujours api-client pour ce flux d'authentification.
Le grant_type est toujours password pour ce flux d'authentification.
Réponse
| Nom | Type | Description |
|---|---|---|
| access_token | string | Jeton d'accès (access token) à utiliser dans les requêtes suivantes pour s'authentifier auprès de l'API |
| expires_in | number | Durée de vie du jeton d'accès (en secondes) |
| token_type | string | Type de jeton (Bearer) |
| refresh_token | string | Jeton de rafraîchissement (refresh token) à utiliser pour récupérer un nouveau jeton d'accès (access token) |
| refresh_expires_in | number | Durée de vie du jeton de rafraîchissement (en secondes) |
| scope | string | Portée du jeton (scope) |
| session_state | string | État de la session |
Exemple de requête
curl -X POST "{keycloak-url}/auth/realms/covage/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=password" \
-d "client_id=api-client" \
-d "username=votre_username" \
-d "password=votre_password"
Exemple de réponse
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"refresh_expires_in": 7200,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"scope": "email profile",
"session_state": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
2. Réaliser une éligibilité en 3 étapes
Une fois authentifié, vous pouvez interroger l'API pour vérifier l'éligibilité d'un site à une ou plusieurs familles d'offres Covage.
Étape 1 : Obtenir l'eligibility_id
L'eligibility_id est un identifiant qui référence un site. Vous pouvez l'obtenir en interrogeant l'endpoint /api/v4/eligibility/site/ avec différents paramètres :
Endpoint : GET /api/v4/eligibility/site/
Par coordonnées GPS
curl -X GET "https://api-client.covage.com/api/v4/eligibility/site/?x=1.091455&y=49.4744077" \
-H "Authorization: Bearer {votre_access_token}"
Par référence de bâtiment
curl -X GET "https://api-client.covage.com/api/v4/eligibility/site/?building_ref=IMB/31555/X/00RV" \
-H "Authorization: Bearer {votre_access_token}"
Ou les deux
curl -X GET "https://api-client.covage.com/api/v4/eligibility/site/?building_ref=IMB/31555/X/00RV&x=1.091455&y=49.4744077" \
-H "Authorization: Bearer {votre_access_token}"
Réponse :
{
"id": "KHg6MS4wOTE0NTU7eTo0OS40NzQ0MDc3O2I6SU1CLzMxNTU1L1gvMDBSVik=",
"building_ref": "IMB/31555/X/00RV",
"location": {
"x": 1.091455,
"y": 49.4744077
}
}
Le champ id de la réponse correspond à l'eligibility_id à utiliser pour la demande d'éligibilité.
Étape 2 : Créer une demande d'éligibilité
Envoyez une demande d'éligibilité pour un ou plusieurs sites avec les familles d'offres souhaitées.
Mode synchrone vs asynchrone
L'API propose deux modes pour créer une demande d'éligibilité :
-
Mode synchrone (recommandé pour machine à machine) :
POST /api/v1/product_offering_qualification/sync/
La réponse contient directement les résultats de l'éligibilité.
Rate limit : 1 requête par seconde -
Mode asynchrone :
POST /api/v1/product_offering_qualification/
La demande est créée et vous devez ensuite consulter l'étape 3 pour récupérer les résultats une fois le traitement terminé.
Rate limit : 10 requêtes par minute
Mode synchrone (recommandé)
Endpoint : POST /api/v1/product_offering_qualification/sync/
Rate limit
1 requête par seconde maximum
curl -X POST "https://api-client.covage.com/api/v1/product_offering_qualification/sync/" \
-H "Authorization: Bearer {votre_access_token}" \
-H "Content-Type: application/json" \
-d '{
"external_id": "1234",
"project_id": "5678",
"product_offering_qualification_items": [
{
"offer_families": ["BPEA", "BPE"],
"eligibility_id": "KHg6MS4wOTE0NTU7eTo0OS40NzQ0MDc3O2I6SU1CLzMxNTU1L1gvMDBSVik=",
"address": {
"label": "4bis Rue Andrei Sakharov 76130 Mont-Saint-Aignan",
"street_ext": "B",
"street_nr": "4",
"city": {
"city_id": "76451",
"insee_code": "76451",
"city_name": "MONT ST AIGNAN",
"post_code": "76130"
},
"street": {
"street_id": "76451055R",
"street_name": "Rue Andrei Sakharov"
}
}
}
]
}'
Paramètres :
| Paramètre | Type | Description | Obligatoire |
|---|---|---|---|
| external_id | string | Référence client de la demande | Non |
| project_id | string | Identifiant du projet | Non |
| product_offering_qualification_items | array | Liste des sites à tester | Oui |
| ↳ eligibility_id | string | Identifiant d'éligibilité | Oui |
| ↳ offer_families | array | Liste des familles d'offres (BPEA, BPE, etc.) | Oui |
| ↳ address | object | Adresse complète du site | Non |
Réponse immédiate :
L'API retourne directement les résultats de l'éligibilité :
{
"id": "c777a051-45ca-463c-b12d-48136bce5598",
"creation_date": "2025-12-15T11:39:42.035+01:00",
"external_id": "1234",
"effective_qualification_date": null,
"href": "",
"state": "done.ready",
"state_change": [
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.037+01:00",
"state": "acknowledged"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.254+01:00",
"state": "in_progress.elig"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.663+01:00",
"state": "in_progress.offer"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:45.719+01:00",
"state": "done.ready"
}
],
"product_offering_qualification_items": [
{
"id": "7ee14cbd-aecd-4f7f-8843-37b622f3b5f1",
"user": {
"email": "admin-covage@covage.com",
"first_name": "Admin",
"last_name": "Covage"
},
"density": "TRESDENSE",
"offer_families": [
"BPE",
"BPEA"
],
"zone_bpe": 1,
"zone_bpea": 1,
"bandwidth_max": 10000.0,
"place": {
"location": {
"x": 1.091455,
"y": 49.4744077
},
"building_ref": "IMB/31555/X/00RV",
"eligibility_id": "KHg6MS4wOTE0NTU7eTo0OS40NzQ0MDc3O2I6SU1CLzMxNTU1L1gvMDBSVik="
},
"address": {
"label": "4bis Rue Andrei Sakharov 76130 Mont-Saint-Aignan",
"street_ext": "B",
"street_nr": "4",
"city": {
"city_id": "76451",
"insee_code": "76451",
"city_name": "MONT ST AIGNAN",
"post_code": "76130"
},
"street": {
"street_id": "76451055R",
"street_name": "Rue Andrei Sakharov"
}
},
"guaranteed_until_date": null,
"state": "done.ready",
"state_change": [
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.051+01:00",
"state": "acknowledged"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.269+01:00",
"state": "in_progress.elig"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:42.650+01:00",
"state": "in_progress.offer"
},
{
"change_reason": "",
"change_date": "2025-12-15T11:39:45.705+01:00",
"state": "done.ready"
}
],
"product_offering_qualification_id": null,
"products_offering": [
{
"product_id": "1765",
"name": "BPEA 100M _Zone très dense_12 mois",
"description": "BPEA 100M _Zone très dense",
"bandwidth": "100M",
"bandwidth_max": 100.0,
"bandwidth_guarantee": 100.0,
"commitment": "12MOIS",
"offer_technology": "FIBDE",
"offer_family": "BPEA",
"tarif_zone": "TRESDENSE",
"price": 0.0,
"far": 0.0,
"fas": 0.0,
"on_quotation": false
},
{
"product_id": "1766",
"name": "BPEA 200M _Zone très dense_24 mois",
"description": "BPEA 200M _Zone très dense",
"bandwidth": "200M",
"bandwidth_max": 200.0,
"bandwidth_guarantee": 200.0,
"commitment": "24MOIS",
"offer_technology": "FIBDE",
"offer_family": "BPEA",
"tarif_zone": "TRESDENSE",
"price": 0.0,
"far": 0.0,
"fas": 0.0,
"on_quotation": false
},
{
"product_id": "1680",
"name": "BPE 100M _Zone très dense_24 mois",
"description": "BPE 100M _Zone très dense",
"bandwidth": "100M",
"bandwidth_max": 100.0,
"bandwidth_guarantee": 100.0,
"commitment": "24MOIS",
"offer_technology": "FIBDE",
"offer_family": "BPE",
"tarif_zone": "TRESDENSE",
"price": 0.0,
"far": 0.0,
"fas": 0.0,
"on_quotation": false
},
{
"product_id": "1681",
"name": "BPE 1G _Zone très dense_36 mois",
"description": "BPE 1G _Zone très dense",
"bandwidth": "1G",
"bandwidth_max": 1000.0,
"bandwidth_guarantee": 1000.0,
"commitment": "36MOIS",
"offer_technology": "FIBDE",
"offer_family": "BPE",
"tarif_zone": "TRESDENSE",
"price": 0.0,
"far": 0.0,
"fas": 0.0,
"on_quotation": false
}
]
}
]
}
Tableau des statuts :
| Statut | Phase | Description |
|---|---|---|
acknowledged |
Initiale | Demande d'éligibilité reçue et prise en compte |
in_progress.elig |
Traitement | Vérification de l'éligibilité en cours |
in_progress.offer |
Traitement | Recherche des offres disponibles |
done.ready |
Finale | Éligibilité validée avec offres et prix disponibles |
done.unable_to_provide |
Finale | Site non éligible ou nécessite un devis |
terminated_with_error |
Erreur | Erreur lors du contrôle des données fournies |
Mode asynchrone
Si vous utilisez le mode asynchrone, la demande est créée mais le traitement se fait en arrière-plan.
Endpoint : POST /api/v1/product_offering_qualification/
Rate limit
10 requêtes par minute maximum
curl -X POST "https://api-client.covage.com/api/v1/product_offering_qualification/" \
-H "Authorization: Bearer {votre_access_token}" \
-H "Content-Type: application/json" \
-d '{
"external_id": "1234",
"product_offering_qualification_items": [
{
"offer_families": ["BPEA", "BPE"],
"eligibility_id": "KHg6MS4wOTE0NTU7eTo0OS40NzQ0MDc3O2I6SU1CLzMxNTU1L1gvMDBSVik=",
"address": {
"label": "4bis Rue Andrei Sakharov 76130 Mont-Saint-Aignan",
"street_ext": "B",
"street_nr": "4",
"city": {
"city_id": "76451",
"insee_code": "76451",
"city_name": "MONT ST AIGNAN",
"post_code": "76130"
},
"street": {
"street_id": "76451055R",
"street_name": "Rue Andrei Sakharov"
}
}
}
]
}'
Réponse initiale :
La réponse contient l'ID de la demande créée, mais pas encore les résultats :
{
"id": "c777a051-45ca-463c-b12d-48136bce5598",
"creation_date": "2025-12-15T11:39:42.035+01:00",
"external_id": "1234",
"project_id": "",
"state": "acknowledged",
"product_offering_qualification_items": [
{
"id": "7ee14cbd-aecd-4f7f-8843-37b622f3b5f1",
}
]
}
Vous devez ensuite utiliser l'Étape 3 pour récupérer les résultats une fois le traitement terminé (état done.ready).
Étape 3 : Consulter les résultats de l'éligibilité
Vous pouvez consulter vos demandes d'éligibilité à tout moment. Cette étape est obligatoire en mode asynchrone pour récupérer les résultats.
Lister toutes les éligibilités
Endpoint : GET /api/v1/product_offering_qualification/
curl -X GET "https://api-client.covage.com/api/v1/product_offering_qualification/" \
-H "Authorization: Bearer {votre_access_token}"
Récupérer une éligibilité spécifique
Endpoint : GET /api/v1/product_offering_qualification/{id}/
curl -X GET "https://api-client.covage.com/api/v1/product_offering_qualification/21675c4c-ae32-4587-bd66-cc66b188ddf0/" \
-H "Authorization: Bearer {votre_access_token}"
Consulter les détails d'un item d'éligibilité
Endpoint : GET /api/v1/product_offering_qualification_item/{id}/
curl -X GET "https://api-client.covage.com/api/v1/product_offering_qualification_item/d5a4a9aa-ba2c-4f53-95c7-0c1ce6f6e7fa/" \
-H "Authorization: Bearer {votre_access_token}"
Lister tous les items d'éligibilité
Endpoint : GET /api/v1/product_offering_qualification_item/
curl -X GET "https://api-client.covage.com/api/v1/product_offering_qualification_item/" \
-H "Authorization: Bearer {votre_access_token}"
Prochaines étapes
Maintenant que vous savez vous authentifier et réaliser une éligibilité, vous pouvez :
- 📋 Créer des devis : Transformer une éligibilité en devis commercial
- 🛒 Passer des commandes : Commander un produit éligible
- 📊 Consulter vos commandes : Suivre l'état d'avancement de vos commandes
Consultez la documentation complète de l'API pour explorer toutes les fonctionnalités disponibles.