Aller au contenu principal

Documentation API

L’API REST PanneCI expose l’état de vos services, vos incidents et les signalements reçus. Toutes les réponses sont en JSON, encodées en UTF-8.

URL de base https://api.panneci.com/v1

Authentification

Chaque requête porte votre clé API dans l’en-tête X-API-Key. La clé est générée depuis votre espace entreprise, onglet Clés API. Elle identifie votre entreprise et porte ses propres permissions.

Ne publiez jamais votre clé côté client Une clé exposée dans du JavaScript de navigateur ou un dépôt public doit être révoquée immédiatement depuis votre espace entreprise.
curl https://api.panneci.com/v1/services \
  -H "X-API-Key: VOTRE_CLE_API"

Entreprises

GET /entreprises/{slug}

Fiche publique d’une entreprise et état courant de ses services.

{
  "slug": "orange-cote-divoire",
  "nom": "Orange Côte d’Ivoire",
  "secteur": "Télécoms & Internet",
  "statut": "panne",
  "signalements_24h": 2847,
  "note_moyenne": 2.8,
  "services": [
    { "id": 1, "nom": "Réseau mobile", "statut": "panne" },
    { "id": 2, "nom": "Internet fixe", "statut": "perturbe" }
  ]
}

Services

GET /services

Liste de vos services et de leur état courant.

PUT /services/{id}/statut

Met à jour l’état d’un service. Valeurs acceptées : operationnel, perturbe, panne, maintenance. Nécessite la permission ecriture.

curl -X PUT https://api.panneci.com/v1/services/1/statut \
  -H "X-API-Key: VOTRE_CLE_API" \
  -H "Content-Type: application/json" \
  -d '{"statut": "maintenance"}'

Incidents

GET /incidents?etat=open
POST /incidents

Déclare un incident. Il apparaît immédiatement sur votre page d’état publique.

{
  "service_id": 1,
  "titre": "Coupure du réseau mobile — district d’Abidjan",
  "description": "Rupture de fibre sur la liaison Abidjan–Yamoussoukro.",
  "gravite": "critique",
  "etat": "ouvert"
}
POST /incidents/{id}/suivi

Publie une mise à jour sur un incident en cours. Chaque message est horodaté et affiché dans le fil public de l’incident.

Signalements

GET /signalements?service_id=1&depuis=2026-09-21T00:00:00Z

Signalements reçus sur un service, agrégés par tranche de 15 minutes. Les données individuelles ne sont jamais exposées : ni identité, ni adresse IP, seulement le volume et la commune.

{
  "service_id": 1,
  "total": 2847,
  "seuil_alerte": 68,
  "points": [
    { "debut": "2026-09-21T14:00:00Z", "nombre": 412 },
    { "debut": "2026-09-21T14:15:00Z", "nombre": 587 }
  ],
  "par_commune": [
    { "commune": "Yopougon", "nombre": 2140 }
  ]
}

Webhooks

Déclarez une URL en https:// depuis l’onglet Alertes. Nous y envoyons une requête POST dès qu’un seuil est franchi. Chaque envoi porte un en-tête X-PanneCI-Signature : un HMAC SHA-256 du corps, calculé avec votre secret de webhook. Vérifiez-le avant de traiter la requête.

{
  "evenement": "seuil_depasse",
  "service_id": 1,
  "service": "Réseau mobile",
  "signalements_15min": 587,
  "seuil": 68,
  "horodatage": "2026-09-21T14:15:00Z"
}

Codes d’erreur

CodeSignificationQue faire
401Clé absente ou invalideVérifiez l’en-tête X-API-Key.
403Permission manquanteLa clé n’a pas le droit demandé. Ajoutez-le depuis votre espace.
404Ressource introuvableVérifiez l’identifiant ou le slug.
422Données invalidesLa réponse liste les champs fautifs dans champs.
429Quota dépasséAttendez la réinitialisation indiquée par Retry-After.
500Erreur interneRéessayez ; si le problème persiste, contactez le support.

Une erreur 422 renvoie le détail par champ, dans le même vocabulaire que les formulaires du site :

{
  "erreur": "Données invalides.",
  "champs": {
    "gravite": "Niveau de gravité inconnu.",
    "description": "La description doit contenir au moins 10 caractères."
  }
}

Limites d’usage

FormuleAppels par moisDébit
Gratuit5 00010 requêtes / minute
Pro100 00060 requêtes / minute
EntrepriseIllimité600 requêtes / minute

Chaque réponse porte les en-têtes X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.