API et intégrations
Les signalements publiés sont accessibles par une API JSON, par Open311 (compatible avec les SIG comme ArcGIS ou QGIS et les GMAO), par des webhooks et par un widget à intégrer.
Principes
- Chaque site a sa propre API, à son adresse : ici
https://scopemy.city. - Seuls les signalements publiés après modération et leurs champs publics sortent. Sur le site d'une collectivité : ses signalements ; sur scopemy.city : tous, sauf ceux qu'une collectivité garde internes.
- La lecture est ouverte, sans clé. Une clé d'API (en-tête X-Api-Key), créée par l'administration de la collectivité, relève la limite de débit ; une clé en écriture permet de déposer des demandes par Open311.
- Limite : 120 requêtes par minute et par adresse IP, 600 par clé. Au-delà : réponse 429 avec l'en-tête Retry-After.
- Pagination par curseur (champ pagination.suivant, en-tête Link). Réponses en cache public avec ETag : renvoyez If-None-Match pour obtenir un 304.
- Données sous licence CC BY 4.0. Données ouvertes
Spécification OpenAPI 3.1 : openapi.yaml · openapi.json
curl -H 'Accept: application/json' 'https://scopemy.city/api/v1/signalements?statut=resolu&limite=20'
API JSON
GET /api/v1/signalements
Liste paginée des signalements publiés
Triée du plus récent au plus ancien. Pagination par curseur : passer la
valeur pagination.suivant dans curseur (ou suivre l'en-tête Link).
Réponse en cache public 60 secondes, avec ETag.
| Paramètre | Où | Description |
|---|---|---|
bbox |
query | Zone minLng,minLat,maxLng,maxLat (WGS84). |
categorie |
query | Une ou plusieurs catégories (codes séparés par des virgules). |
statut |
query | nouveau, en_cours, resolu ou rejete (plusieurs séparés par des virgules). |
depuis |
query | Créés à partir de cette date (AAAA-MM-JJ). |
jusqua |
query | Créés jusqu'à cette date incluse (AAAA-MM-JJ). |
q |
query | Recherche dans le titre, l'adresse, la description, la référence et les libellés. |
lang |
query | Langue des libellés (fr, de, it, en), parmi celles du site. |
limite |
query | Nombre de signalements par page (1 à 100, 50 par défaut). |
curseur |
query | Curseur opaque de la page suivante (pagination.suivant). |
GET /api/v1/signalements/{reference}
Un signalement publié, par sa référence
| Paramètre | Où | Description |
|---|---|---|
reference * |
path | Référence SC-XXXX-XXXX (ou ancienne FMC-XXXXXX). |
GET /api/v1/carte
Signalements de la zone visible d'une carte, regroupés à faible zoom
Au-delà de 300 signalements dans la zone (sous le zoom 16) ou de 500 à
tout zoom, le serveur renvoie une grille (mode grille, cellules de
64 pixels environ) ; sinon les points (mode points). Cache 30 secondes.
| Paramètre | Où | Description |
|---|---|---|
bbox * |
query | Zone affichée minLng,minLat,maxLng,maxLat (WGS84). |
zoom |
query | Niveau de zoom Web Mercator (0 à 22). |
categorie |
query | Une ou plusieurs catégories (codes séparés par des virgules). |
statut |
query | nouveau, en_cours, resolu ou rejete (plusieurs séparés par des virgules). |
depuis |
query | Créés à partir de cette date (AAAA-MM-JJ). |
jusqua |
query | Créés jusqu'à cette date incluse (AAAA-MM-JJ). |
q |
query | Recherche dans le titre, l'adresse, la description, la référence et les libellés. |
Open311 GeoReport v2
Format JSON uniquement. Les services sont les catégories du site, les demandes sont les signalements publiés ; status vaut open (nouveau, en cours) ou closed (résolu, rejeté).
GET /open311/v2/discovery.json
Découverte Open311
GET /open311/v2/services.json
Services (catégories du site)
GET /open311/v2/requests.json
Demandes publiées (filtres Open311)
| Paramètre | Où | Description |
|---|---|---|
service_request_id |
query | Une ou plusieurs références, séparées par des virgules. |
service_code |
query | Code de service (catégorie). |
status |
query | open (nouveau, en cours) ou closed (résolu, rejeté). |
start_date |
query | Date ISO 8601 (au jour près). |
end_date |
query | Date ISO 8601 (au jour près, incluse). |
page |
query | Page (extension courante, à partir de 1). |
page_size |
query | Taille de page (1 à 100, 50 par défaut). |
POST /open311/v2/requests.json
Déposer une demande (clé d'API en écriture)
Formulaire (application/x-www-form-urlencoded) ou JSON. Obligatoires :
api_key, service_code, lat, long, description (10 à 2000 caractères).
Facultatif : address_string. Le point doit être dans le périmètre de la
collectivité. La demande entre en modération : elle n'est publiée
qu'après validation. Les champs personnels (email, nom, téléphone) et
media_url sont ignorés.
GET /open311/v2/requests/{id}.json
Une demande publiée
| Paramètre | Où | Description |
|---|---|---|
id * |
path | Référence du signalement. |
Données ouvertes
GET /donnees/signalements.csv
Export CSV des signalements publiés (CC BY 4.0)
GET /donnees/signalements.geojson
Export GeoJSON des signalements publiés (CC BY 4.0)
GET /donnees/statistiques.json
Statistiques publiques (volume, délais médians, taux de résolution)
Webhooks
Une collectivité peut abonner une adresse https à ces événements (administration, page API). Nous lui envoyons un POST JSON dans les 5 minutes ; un signalement pas encore publié n'y figure qu'avec sa référence, sa catégorie, ses statuts, sa position et ses dates.
| Événement | Description |
|---|---|
signalement.cree | Signalement créé (en attente de modération) |
signalement.publie | Signalement publié |
signalement.statut | Statut changé (data.ancien_statut donne l'ancien) |
signalement.reponse | Réponse officielle ajoutée ou modifiée |
signalement.affecte | Affecté à un service ou à un agent (portail des services) ; data.affectation.service donne le nom du service |
Chaque envoi est signé dans l'en-tête X-Scopemy-Signature : t=horodatage,v1=HMAC-SHA256 du texte « t.corps » avec votre secret. Vérifiez-le, en temps constant, et refusez un horodatage de plus de 5 minutes. X-Scopemy-Delivery donne un identifiant stable : ignorez un envoi déjà reçu.
$corps = file_get_contents('php://input');
[$t, $sig] = sscanf($_SERVER['HTTP_X_SCOPEMY_SIGNATURE'] ?? '', 't=%d,v1=%s');
$attendu = hash_hmac('sha256', $t . '.' . $corps, $secret);
if (!$sig || !hash_equals($attendu, $sig) || abs(time() - $t) > 300) {
http_response_code(400); exit;
}
$evenement = json_decode($corps, true); // id, type, tenant, data.signalement
http_response_code(204);
Toute réponse 2xx vaut réception. Sinon, nous réessayons jusqu'à 8 fois, en doublant l'attente (1 min, 2 min, 4 min…, 6 h au plus). Les redirections ne sont pas suivies.
Widget pour le site de la commune
Collez ce code dans une page du site de la commune pour afficher la carte et les derniers signalements, à la marque de la collectivité. Le site doit d'abord être autorisé dans l'administration (page API).
<script src="https://scopemy.city/embed.js" data-vue="carte-liste" data-hauteur="560" async></script>
Options : data-vue (carte-liste, carte ou liste), data-hauteur (en pixels, ou auto), data-lang (fr, de, it, en). Le widget ne pose aucun cookie.