API und Integrationen
Veröffentlichte Meldungen sind über eine JSON-API, über Open311 (kompatibel mit GIS wie ArcGIS oder QGIS und Unterhaltssystemen), über Webhooks und über ein einbettbares Widget verfügbar.
Grundsätze
- Jede Website hat ihre eigene API unter ihrer Adresse: hier
https://scopemy.city. - Nur nach der Moderation veröffentlichte Meldungen und ihre öffentlichen Felder werden ausgegeben. Auf der Website eines Gemeinwesens: dessen Meldungen; auf scopemy.city: alle, ausser den intern gehaltenen.
- Lesen ist ohne Schlüssel möglich. Ein API-Schlüssel (Header X-Api-Key), vom Gemeinwesen erstellt, erhöht das Limit; ein Schlüssel mit Schreibrecht erlaubt Anfragen über Open311.
- Limit: 120 Anfragen pro Minute und IP-Adresse, 600 pro Schlüssel. Darüber: Antwort 429 mit Header Retry-After.
- Paginierung per Cursor (Feld pagination.suivant, Header Link). Antworten sind öffentlich zwischengespeichert, mit ETag: senden Sie If-None-Match für eine 304.
- Daten unter der Lizenz CC BY 4.0. Offene Daten
OpenAPI-3.1-Spezifikation: openapi.yaml · openapi.json
curl -H 'Accept: application/json' 'https://scopemy.city/api/v1/signalements?statut=resolu&limite=20'
JSON-API
GET /api/v1/signalements
Seitenweise Liste der veröffentlichten Meldungen
| Parameter | Ort | Beschreibung |
|---|---|---|
bbox |
query | Ausschnitt minLng,minLat,maxLng,maxLat (WGS84). |
categorie |
query | Eine oder mehrere Kategorien (Codes durch Kommas getrennt). |
statut |
query | nouveau, en_cours, resolu oder rejete (mehrere durch Kommas getrennt). |
depuis |
query | Erstellt ab diesem Datum (JJJJ-MM-TT). |
jusqua |
query | Erstellt bis einschliesslich diesem Datum (JJJJ-MM-TT). |
q |
query | Suche in Titel, Adresse, Beschreibung, Referenz und Bezeichnungen. |
lang |
query | Sprache der Bezeichnungen (fr, de, it, en), unter den Sprachen der Website. |
limite |
query | Meldungen pro Seite (1 bis 100, Standard 50). |
curseur |
query | Undurchsichtiger Cursor der nächsten Seite (pagination.suivant). |
GET /api/v1/signalements/{reference}
Eine veröffentlichte Meldung, nach Referenz
| Parameter | Ort | Beschreibung |
|---|---|---|
reference * |
path | Referenz SC-XXXX-XXXX (oder alte FMC-XXXXXX). |
GET /api/v1/carte
Meldungen im sichtbaren Kartenausschnitt, bei kleinem Zoom gruppiert
| Parameter | Ort | Beschreibung |
|---|---|---|
bbox * |
query | Angezeigter Ausschnitt minLng,minLat,maxLng,maxLat (WGS84). |
zoom |
query | Web-Mercator-Zoomstufe (0 bis 22). |
categorie |
query | Eine oder mehrere Kategorien (Codes durch Kommas getrennt). |
statut |
query | nouveau, en_cours, resolu oder rejete (mehrere durch Kommas getrennt). |
depuis |
query | Erstellt ab diesem Datum (JJJJ-MM-TT). |
jusqua |
query | Erstellt bis einschliesslich diesem Datum (JJJJ-MM-TT). |
q |
query | Suche in Titel, Adresse, Beschreibung, Referenz und Bezeichnungen. |
Open311 GeoReport v2
Nur JSON-Format. Dienste sind die Kategorien der Website, Anfragen die veröffentlichten Meldungen; status ist open (neu, in Bearbeitung) oder closed (erledigt, abgelehnt).
GET /open311/v2/discovery.json
Open311-Discovery
GET /open311/v2/services.json
Dienste (Kategorien der Website)
GET /open311/v2/requests.json
Veröffentlichte Anfragen (Open311-Filter)
| Parameter | Ort | Beschreibung |
|---|---|---|
service_request_id |
query | Eine oder mehrere Referenzen, durch Kommas getrennt. |
service_code |
query | Dienstcode (Kategorie). |
status |
query | open (neu, in Bearbeitung) oder closed (erledigt, abgelehnt). |
start_date |
query | ISO-8601-Datum (tagesgenau). |
end_date |
query | ISO-8601-Datum (tagesgenau, einschliesslich). |
page |
query | Seite (übliche Erweiterung, ab 1). |
page_size |
query | Seitengrösse (1 bis 100, Standard 50). |
POST /open311/v2/requests.json
Anfrage einreichen (API-Schlüssel mit Schreibrecht)
GET /open311/v2/requests/{id}.json
Eine veröffentlichte Anfrage
| Parameter | Ort | Beschreibung |
|---|---|---|
id * |
path | Referenz der Meldung. |
Offene Daten
GET /donnees/signalements.csv
CSV-Export der veröffentlichten Meldungen (CC BY 4.0)
GET /donnees/signalements.geojson
GeoJSON-Export der veröffentlichten Meldungen (CC BY 4.0)
GET /donnees/statistiques.json
Öffentliche Statistiken (Umfang, mittlere Fristen, Erledigungsquote)
Webhooks
Ein Gemeinwesen kann eine https-Adresse für diese Ereignisse abonnieren (Verwaltung, Seite API). Wir senden innert 5 Minuten einen JSON-POST; eine noch nicht veröffentlichte Meldung enthält nur Referenz, Kategorie, Status, Position und Daten.
| Ereignis | Beschreibung |
|---|---|
signalement.cree | Meldung erstellt (wartet auf Moderation) |
signalement.publie | Meldung veröffentlicht |
signalement.statut | Status geändert (data.ancien_statut enthält den alten) |
signalement.reponse | Offizielle Antwort hinzugefügt oder geändert |
signalement.affecte | Einer Dienststelle oder Person zugewiesen (Dienststellenportal) |
Jede Sendung ist im Header X-Scopemy-Signature signiert: t=Zeitstempel,v1=HMAC-SHA256 des Textes „t.Körper“ mit Ihrem Geheimnis. Prüfen Sie ihn in konstanter Zeit und lehnen Sie Zeitstempel älter als 5 Minuten ab. X-Scopemy-Delivery liefert eine stabile Kennung: ignorieren Sie bereits erhaltene Sendungen.
$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);
Jede 2xx-Antwort gilt als Empfang. Andernfalls versuchen wir es bis zu 8 Mal, mit doppelter Wartezeit (1 Min., 2 Min., 4 Min. …, höchstens 6 Std.). Weiterleitungen werden nicht verfolgt.
Widget für die Gemeindewebsite
Fügen Sie diesen Code in eine Seite der Gemeindewebsite ein, um Karte und neueste Meldungen im Erscheinungsbild des Gemeinwesens zu zeigen. Die Website muss zuerst in der Verwaltung freigegeben werden (Seite API).
<script src="https://scopemy.city/embed.js" data-vue="carte-liste" data-hauteur="560" async></script>
Optionen: data-vue (carte-liste, carte oder liste), data-hauteur (in Pixeln oder auto), data-lang (fr, de, it, en). Das Widget setzt keine Cookies.