{"openapi":"3.1.0","info":{"title":"API scopemy.city","version":"1.0.0","summary":"Signalements urbains publiés, par collectivité.","description":"Chaque domaine (scopemy.city ou le domaine d'une collectivité) sert ses\npropres données : sur le domaine d'une collectivité, ses signalements ;\nsur scopemy.city, tous sauf ceux qu'une collectivité a marqués internes.\nSeuls les signalements publiés (modérés) et leurs champs publics sortent.","license":{"name":"CC BY 4.0 (données)","url":"https://creativecommons.org/licenses/by/4.0/"},"contact":{"email":"contact@scopemy.city"}},"servers":[{"url":"https://scopemy.city","description":"scopemy.city"}],"tags":[{"name":"signalements","description":"API JSON en lecture (#36)"},{"name":"open311","description":"Open311 GeoReport v2 (#61)"},{"name":"donnees","description":"Données ouvertes (#97)"}],"security":[{},{"cleApi":[]}],"paths":{"/api/v1/signalements":{"get":{"tags":["signalements"],"operationId":"listerSignalements","summary":"Liste paginée des signalements publiés","x-i18n":{"en":"Paginated list of published reports","de":"Seitenweise Liste der veröffentlichten Meldungen","it":"Elenco paginato delle segnalazioni pubblicate"},"description":"Triée du plus récent au plus ancien. Pagination par curseur : passer la\nvaleur pagination.suivant dans curseur (ou suivre l'en-tête Link).\nRéponse en cache public 60 secondes, avec ETag.","parameters":[{"$ref":"#/components/parameters/bbox"},{"$ref":"#/components/parameters/categorie"},{"$ref":"#/components/parameters/statut"},{"$ref":"#/components/parameters/depuis"},{"$ref":"#/components/parameters/jusqua"},{"$ref":"#/components/parameters/q"},{"$ref":"#/components/parameters/lang"},{"name":"limite","in":"query","description":"Nombre de signalements par page (1 à 100, 50 par défaut).","x-i18n":{"en":"Reports per page (1 to 100, default 50).","de":"Meldungen pro Seite (1 bis 100, Standard 50).","it":"Segnalazioni per pagina (da 1 a 100, predefinito 50)."},"schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"curseur","in":"query","description":"Curseur opaque de la page suivante (pagination.suivant).","x-i18n":{"en":"Opaque cursor of the next page (pagination.suivant).","de":"Undurchsichtiger Cursor der nächsten Seite (pagination.suivant).","it":"Cursore opaco della pagina successiva (pagination.suivant)."},"schema":{"type":"string"}}],"responses":{"200":{"description":"Une page de signalements.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PageSignalements"}}}},"400":{"$ref":"#/components/responses/Erreur"},"429":{"$ref":"#/components/responses/TropDeRequetes"}}}},"/api/v1/signalements/{reference}":{"get":{"tags":["signalements"],"operationId":"lireSignalement","summary":"Un signalement publié, par sa référence","x-i18n":{"en":"One published report, by reference","de":"Eine veröffentlichte Meldung, nach Referenz","it":"Una segnalazione pubblicata, per riferimento"},"parameters":[{"name":"reference","in":"path","required":true,"description":"Référence SC-XXXX-XXXX (ou ancienne FMC-XXXXXX).","x-i18n":{"en":"Reference SC-XXXX-XXXX (or legacy FMC-XXXXXX).","de":"Referenz SC-XXXX-XXXX (oder alte FMC-XXXXXX).","it":"Riferimento SC-XXXX-XXXX (o il vecchio FMC-XXXXXX)."},"schema":{"type":"string"}}],"responses":{"200":{"description":"Le signalement.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Signalement"}}}}}},"404":{"$ref":"#/components/responses/Erreur"}}}},"/api/v1/carte":{"get":{"tags":["signalements"],"operationId":"carte","summary":"Signalements de la zone visible d'une carte, regroupés à faible zoom","x-i18n":{"en":"Reports in the visible map area, grouped at low zoom","de":"Meldungen im sichtbaren Kartenausschnitt, bei kleinem Zoom gruppiert","it":"Segnalazioni nell'area visibile della mappa, raggruppate a zoom basso"},"description":"Au-delà de 300 signalements dans la zone (sous le zoom 16) ou de 500 à\ntout zoom, le serveur renvoie une grille (mode grille, cellules de\n64 pixels environ) ; sinon les points (mode points). Cache 30 secondes.","parameters":[{"$ref":"#/components/parameters/bboxObligatoire"},{"name":"zoom","in":"query","description":"Niveau de zoom Web Mercator (0 à 22).","x-i18n":{"en":"Web Mercator zoom level (0 to 22).","de":"Web-Mercator-Zoomstufe (0 bis 22).","it":"Livello di zoom Web Mercator (da 0 a 22)."},"schema":{"type":"integer","minimum":0,"maximum":22,"default":13}},{"$ref":"#/components/parameters/categorie"},{"$ref":"#/components/parameters/statut"},{"$ref":"#/components/parameters/depuis"},{"$ref":"#/components/parameters/jusqua"},{"$ref":"#/components/parameters/q"}],"responses":{"200":{"description":"Points ou cellules de grille.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Carte"}}}},"400":{"$ref":"#/components/responses/Erreur"}}}},"/open311/v2/discovery.json":{"get":{"tags":["open311"],"operationId":"open311Decouverte","summary":"Découverte Open311","x-i18n":{"en":"Open311 discovery","de":"Open311-Discovery","it":"Scoperta Open311"},"responses":{"200":{"description":"Document de découverte GeoReport v2."}}}},"/open311/v2/services.json":{"get":{"tags":["open311"],"operationId":"open311Services","summary":"Services (catégories du site)","x-i18n":{"en":"Services (the site's categories)","de":"Dienste (Kategorien der Website)","it":"Servizi (categorie del sito)"},"responses":{"200":{"description":"Liste des services."}}}},"/open311/v2/requests.json":{"get":{"tags":["open311"],"operationId":"open311Demandes","summary":"Demandes publiées (filtres Open311)","x-i18n":{"en":"Published requests (Open311 filters)","de":"Veröffentlichte Anfragen (Open311-Filter)","it":"Richieste pubblicate (filtri Open311)"},"parameters":[{"name":"service_request_id","in":"query","description":"Une ou plusieurs références, séparées par des virgules.","x-i18n":{"en":"One or more references, comma-separated.","de":"Eine oder mehrere Referenzen, durch Kommas getrennt.","it":"Uno o più riferimenti, separati da virgole."},"schema":{"type":"string"}},{"name":"service_code","in":"query","description":"Code de service (catégorie).","x-i18n":{"en":"Service code (category).","de":"Dienstcode (Kategorie).","it":"Codice del servizio (categoria)."},"schema":{"type":"string"}},{"name":"status","in":"query","description":"open (nouveau, en cours) ou closed (résolu, rejeté).","x-i18n":{"en":"open (new, in progress) or closed (resolved, rejected).","de":"open (neu, in Bearbeitung) oder closed (erledigt, abgelehnt).","it":"open (nuova, in corso) o closed (risolta, respinta)."},"schema":{"type":"string","enum":["open","closed"]}},{"name":"start_date","in":"query","description":"Date ISO 8601 (au jour près).","x-i18n":{"en":"ISO 8601 date (day precision).","de":"ISO-8601-Datum (tagesgenau).","it":"Data ISO 8601 (al giorno)."},"schema":{"type":"string"}},{"name":"end_date","in":"query","description":"Date ISO 8601 (au jour près, incluse).","x-i18n":{"en":"ISO 8601 date (day precision, inclusive).","de":"ISO-8601-Datum (tagesgenau, einschliesslich).","it":"Data ISO 8601 (al giorno, inclusa)."},"schema":{"type":"string"}},{"name":"page","in":"query","description":"Page (extension courante, à partir de 1).","x-i18n":{"en":"Page (common extension, from 1).","de":"Seite (übliche Erweiterung, ab 1).","it":"Pagina (estensione comune, da 1)."},"schema":{"type":"integer"}},{"name":"page_size","in":"query","description":"Taille de page (1 à 100, 50 par défaut).","x-i18n":{"en":"Page size (1 to 100, default 50).","de":"Seitengrösse (1 bis 100, Standard 50).","it":"Dimensione della pagina (da 1 a 100, predefinito 50)."},"schema":{"type":"integer"}}],"responses":{"200":{"description":"Liste de demandes GeoReport v2."}}},"post":{"tags":["open311"],"operationId":"open311Deposer","summary":"Déposer une demande (clé d'API en écriture)","x-i18n":{"en":"Submit a request (write API key)","de":"Anfrage einreichen (API-Schlüssel mit Schreibrecht)","it":"Inviare una richiesta (chiave API in scrittura)"},"description":"Formulaire (application/x-www-form-urlencoded) ou JSON. Obligatoires :\napi_key, service_code, lat, long, description (10 à 2000 caractères).\nFacultatif : address_string. Le point doit être dans le périmètre de la\ncollectivité. La demande entre en modération : elle n'est publiée\nqu'après validation. Les champs personnels (email, nom, téléphone) et\nmedia_url sont ignorés.","security":[{"cleApi":[]}],"responses":{"201":{"description":"Demande reçue, en modération."},"400":{"description":"Paramètre manquant ou hors périmètre."},"401":{"description":"Clé absente ou invalide."},"403":{"description":"Clé en lecture seule ou d'un autre domaine."}}}},"/open311/v2/requests/{id}.json":{"get":{"tags":["open311"],"operationId":"open311Demande","summary":"Une demande publiée","x-i18n":{"en":"One published request","de":"Eine veröffentlichte Anfrage","it":"Una richiesta pubblicata"},"parameters":[{"name":"id","in":"path","required":true,"description":"Référence du signalement.","x-i18n":{"en":"Report reference.","de":"Referenz der Meldung.","it":"Riferimento della segnalazione."},"schema":{"type":"string"}}],"responses":{"200":{"description":"Tableau d'une demande."},"404":{"description":"Inconnue ou non publiée."}}}},"/donnees/signalements.csv":{"get":{"tags":["donnees"],"operationId":"exportCsv","summary":"Export CSV des signalements publiés (CC BY 4.0)","x-i18n":{"en":"CSV export of published reports (CC BY 4.0)","de":"CSV-Export der veröffentlichten Meldungen (CC BY 4.0)","it":"Esportazione CSV delle segnalazioni pubblicate (CC BY 4.0)"},"responses":{"200":{"description":"Fichier CSV UTF-8."}}}},"/donnees/signalements.geojson":{"get":{"tags":["donnees"],"operationId":"exportGeojson","summary":"Export GeoJSON des signalements publiés (CC BY 4.0)","x-i18n":{"en":"GeoJSON export of published reports (CC BY 4.0)","de":"GeoJSON-Export der veröffentlichten Meldungen (CC BY 4.0)","it":"Esportazione GeoJSON delle segnalazioni pubblicate (CC BY 4.0)"},"responses":{"200":{"description":"FeatureCollection RFC 7946."}}}},"/donnees/statistiques.json":{"get":{"tags":["donnees"],"operationId":"statistiques","summary":"Statistiques publiques (volume, délais médians, taux de résolution)","x-i18n":{"en":"Public statistics (volume, median delays, resolution rate)","de":"Öffentliche Statistiken (Umfang, mittlere Fristen, Erledigungsquote)","it":"Statistiche pubbliche (volume, tempi mediani, tasso di risoluzione)"},"responses":{"200":{"description":"Statistiques, en cache une heure."}}}}},"webhooks":{"signalement.cree":{"post":{"summary":"Signalement créé (en attente de modération)","x-i18n":{"en":"Report created (awaiting moderation)","de":"Meldung erstellt (wartet auf Moderation)","it":"Segnalazione creata (in attesa di moderazione)"},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenement"}}}},"responses":{"200":{"description":"Toute réponse 2xx vaut réception."}}}},"signalement.publie":{"post":{"summary":"Signalement publié","x-i18n":{"en":"Report published","de":"Meldung veröffentlicht","it":"Segnalazione pubblicata"},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenement"}}}},"responses":{"200":{"description":"Toute réponse 2xx vaut réception."}}}},"signalement.statut":{"post":{"summary":"Statut changé (data.ancien_statut donne l'ancien)","x-i18n":{"en":"Status changed (data.ancien_statut holds the previous one)","de":"Status geändert (data.ancien_statut enthält den alten)","it":"Stato cambiato (data.ancien_statut indica il precedente)"},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenement"}}}},"responses":{"200":{"description":"Toute réponse 2xx vaut réception."}}}},"signalement.reponse":{"post":{"summary":"Réponse officielle ajoutée ou modifiée","x-i18n":{"en":"Official response added or changed","de":"Offizielle Antwort hinzugefügt oder geändert","it":"Risposta ufficiale aggiunta o modificata"},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenement"}}}},"responses":{"200":{"description":"Toute réponse 2xx vaut réception."}}}},"signalement.affecte":{"post":{"summary":"Affecté à un service ou à un agent (portail des services) ; data.affectation.service donne le nom du service","x-i18n":{"en":"Assigned to a service or an agent (services portal)","de":"Einer Dienststelle oder Person zugewiesen (Dienststellenportal)","it":"Assegnata a un servizio o a un incaricato (portale dei servizi)"},"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Evenement"}}}},"responses":{"200":{"description":"Toute réponse 2xx vaut réception."}}}}},"components":{"securitySchemes":{"cleApi":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Clé smk_… créée par un administrateur de la collectivité (admin-api.php). Aussi acceptée en Authorization Bearer ou en paramètre api_key."}},"parameters":{"bbox":{"name":"bbox","in":"query","description":"Zone minLng,minLat,maxLng,maxLat (WGS84).","x-i18n":{"en":"Area minLng,minLat,maxLng,maxLat (WGS84).","de":"Ausschnitt minLng,minLat,maxLng,maxLat (WGS84).","it":"Area minLng,minLat,maxLng,maxLat (WGS84)."},"schema":{"type":"string","example":"6.10,46.18,6.18,46.23"}},"bboxObligatoire":{"name":"bbox","in":"query","required":true,"description":"Zone affichée minLng,minLat,maxLng,maxLat (WGS84).","x-i18n":{"en":"Displayed area minLng,minLat,maxLng,maxLat (WGS84).","de":"Angezeigter Ausschnitt minLng,minLat,maxLng,maxLat (WGS84).","it":"Area visualizzata minLng,minLat,maxLng,maxLat (WGS84)."},"schema":{"type":"string"}},"categorie":{"name":"categorie","in":"query","description":"Une ou plusieurs catégories (codes séparés par des virgules).","x-i18n":{"en":"One or more categories (comma-separated codes).","de":"Eine oder mehrere Kategorien (Codes durch Kommas getrennt).","it":"Una o più categorie (codici separati da virgole)."},"schema":{"type":"string"}},"statut":{"name":"statut","in":"query","description":"nouveau, en_cours, resolu ou rejete (plusieurs séparés par des virgules).","x-i18n":{"en":"nouveau, en_cours, resolu or rejete (several, comma-separated).","de":"nouveau, en_cours, resolu oder rejete (mehrere durch Kommas getrennt).","it":"nouveau, en_cours, resolu o rejete (più valori separati da virgole)."},"schema":{"type":"string"}},"depuis":{"name":"depuis","in":"query","description":"Créés à partir de cette date (AAAA-MM-JJ).","x-i18n":{"en":"Created on or after this date (YYYY-MM-DD).","de":"Erstellt ab diesem Datum (JJJJ-MM-TT).","it":"Create a partire da questa data (AAAA-MM-GG)."},"schema":{"type":"string","format":"date"}},"jusqua":{"name":"jusqua","in":"query","description":"Créés jusqu'à cette date incluse (AAAA-MM-JJ).","x-i18n":{"en":"Created up to and including this date (YYYY-MM-DD).","de":"Erstellt bis einschliesslich diesem Datum (JJJJ-MM-TT).","it":"Create fino a questa data inclusa (AAAA-MM-GG)."},"schema":{"type":"string","format":"date"}},"q":{"name":"q","in":"query","description":"Recherche dans le titre, l'adresse, la description, la référence et les libellés.","x-i18n":{"en":"Search in title, address, description, reference and labels.","de":"Suche in Titel, Adresse, Beschreibung, Referenz und Bezeichnungen.","it":"Ricerca in titolo, indirizzo, descrizione, riferimento ed etichette."},"schema":{"type":"string","maxLength":100}},"lang":{"name":"lang","in":"query","description":"Langue des libellés (fr, de, it, en), parmi celles du site.","x-i18n":{"en":"Language of labels (fr, de, it, en), among the site's languages.","de":"Sprache der Bezeichnungen (fr, de, it, en), unter den Sprachen der Website.","it":"Lingua delle etichette (fr, de, it, en), tra quelle del sito."},"schema":{"type":"string"}}},"responses":{"Erreur":{"description":"Erreur, avec un code et un message.","content":{"application/json":{"schema":{"type":"object","properties":{"erreur":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}}}}},"TropDeRequetes":{"description":"Limite de débit atteinte (120 requêtes par minute et par IP, 600 par clé). En-tête Retry-After."}},"schemas":{"Signalement":{"type":"object","properties":{"reference":{"type":"string","example":"SC-7K3M-Q9TD"},"url":{"type":"string","format":"uri"},"titre":{"type":"string"},"categorie":{"type":"object","properties":{"code":{"type":"string"},"libelle":{"type":"string"}}},"statut":{"type":"string","enum":["nouveau","en_cours","resolu","rejete"]},"description":{"type":"string"},"adresse":{"type":"string"},"position":{"type":["object","null"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"photo":{"type":["string","null"],"format":"uri"},"votes":{"type":"integer"},"confirmations":{"type":"integer"},"reponse_officielle":{"type":["object","null"],"properties":{"texte":{"type":"string"},"service":{"type":["string","null"]}}},"tenant":{"type":["string","null"]},"cree_le":{"type":"string","format":"date-time"},"mis_a_jour_le":{"type":"string","format":"date-time"}}},"PageSignalements":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Signalement"}},"pagination":{"type":"object","properties":{"limite":{"type":"integer"},"suivant":{"type":["string","null"]},"url_suivante":{"type":["string","null"]}}},"meta":{"type":"object"}}},"Carte":{"type":"object","properties":{"mode":{"type":"string","enum":["points","grille"]},"total":{"type":"integer"},"points":{"type":"array","items":{"type":"object"}},"cellules":{"type":"array","items":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"},"n":{"type":"integer"}}}}}},"Evenement":{"type":"object","description":"Corps d'un webhook, signé dans X-Scopemy-Signature (t=horodatage,v1=HMAC-SHA256 de « t.corps »).","properties":{"id":{"type":"string"},"type":{"type":"string"},"cree_le":{"type":"string","format":"date-time"},"tenant":{"type":"string"},"data":{"type":"object","properties":{"signalement":{"$ref":"#/components/schemas/Signalement"},"ancien_statut":{"type":"string"}}}}}}}}