scopemy.city
Observatoire citoyen
SignalerWhatsApp

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

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ètres de GET /api/v1/signalements
ParamètreOùDescription
bbox queryZone minLng,minLat,maxLng,maxLat (WGS84).
categorie queryUne ou plusieurs catégories (codes séparés par des virgules).
statut querynouveau, en_cours, resolu ou rejete (plusieurs séparés par des virgules).
depuis queryCréés à partir de cette date (AAAA-MM-JJ).
jusqua queryCréés jusqu'à cette date incluse (AAAA-MM-JJ).
q queryRecherche dans le titre, l'adresse, la description, la référence et les libellés.
lang queryLangue des libellés (fr, de, it, en), parmi celles du site.
limite queryNombre de signalements par page (1 à 100, 50 par défaut).
curseur queryCurseur opaque de la page suivante (pagination.suivant).

Codes de réponse : 200, 400, 429

GET /api/v1/signalements/{reference}

Un signalement publié, par sa référence

Paramètres de GET /api/v1/signalements/{reference}
ParamètreOùDescription
reference * pathRéférence SC-XXXX-XXXX (ou ancienne FMC-XXXXXX).

Codes de réponse : 200, 404

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ètres de GET /api/v1/carte
ParamètreOùDescription
bbox * queryZone affichée minLng,minLat,maxLng,maxLat (WGS84).
zoom queryNiveau de zoom Web Mercator (0 à 22).
categorie queryUne ou plusieurs catégories (codes séparés par des virgules).
statut querynouveau, en_cours, resolu ou rejete (plusieurs séparés par des virgules).
depuis queryCréés à partir de cette date (AAAA-MM-JJ).
jusqua queryCréés jusqu'à cette date incluse (AAAA-MM-JJ).
q queryRecherche dans le titre, l'adresse, la description, la référence et les libellés.

Codes de réponse : 200, 400

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

Codes de réponse : 200

GET /open311/v2/services.json

Services (catégories du site)

Codes de réponse : 200

GET /open311/v2/requests.json

Demandes publiées (filtres Open311)

Paramètres de GET /open311/v2/requests.json
ParamètreOùDescription
service_request_id queryUne ou plusieurs références, séparées par des virgules.
service_code queryCode de service (catégorie).
status queryopen (nouveau, en cours) ou closed (résolu, rejeté).
start_date queryDate ISO 8601 (au jour près).
end_date queryDate ISO 8601 (au jour près, incluse).
page queryPage (extension courante, à partir de 1).
page_size queryTaille de page (1 à 100, 50 par défaut).

Codes de réponse : 200

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.

Codes de réponse : 201, 400, 401, 403

GET /open311/v2/requests/{id}.json

Une demande publiée

Paramètres de GET /open311/v2/requests/{id}.json
ParamètreOùDescription
id * pathRéférence du signalement.

Codes de réponse : 200, 404

Données ouvertes

GET /donnees/signalements.csv

Export CSV des signalements publiés (CC BY 4.0)

Codes de réponse : 200

GET /donnees/signalements.geojson

Export GeoJSON des signalements publiés (CC BY 4.0)

Codes de réponse : 200

GET /donnees/statistiques.json

Statistiques publiques (volume, délais médians, taux de résolution)

Codes de réponse : 200

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énementDescription
signalement.creeSignalement créé (en attente de modération)
signalement.publieSignalement publié
signalement.statutStatut changé (data.ancien_statut donne l'ancien)
signalement.reponseRéponse officielle ajoutée ou modifiée
signalement.affecteAffecté à 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.