{"openapi":"3.1.0","info":{"title":"ms-watershed","description":"Calcul du **bassin versant hydrologique** drainé par un ou plusieurs points, en\nFrance métropolitaine et dans quatre territoires d'outre-mer.\n\nUn calcul se déroule en cinq phases — graphe du réseau hydrographique, montage\ndu modèle numérique de terrain, prétraitement hydrologique, délimitation — et\ndure de quelques minutes à plusieurs heures selon l'étendue du bassin. Toutes\nles routes de calcul sont donc **asynchrones** : on crée un travail, on suit son\navancement, on récupère son résultat.\n\n**Contrôle d'accès.** Sans jeton, le service accepte 10 points par calcul et 5\ncalculs par adresse et par jour ; le mode fichier et la façade OGC en réclament\nun. Le contrôle intervient **après** la validation du corps : une requête\nmalformée reçoit `400` sans consommer de quota.\n\n**Points écartés.** Un point peut n'avoir aucun bassin — hors zone, hors\nréférentiel, exutoire non accroché au réseau. Il n'est jamais silencieux : son\nmotif accompagne le résultat.\n\nLe document que vous lisez est publié en [OpenAPI (JSON)](/openapi.json).\n","contact":{"name":"Magic Salève","email":"tristan@magicsaleve.fr"},"version":"0.39.0"},"paths":{"/api/config":{"get":{"tags":["Service"],"summary":"Politique d'accès du service","description":"Ce que le client doit savoir avant d'agir : le service est-il protégé, le porteur est-il reconnu, quels quotas s'appliquent, et la clé publique du défi anti-robot. Le secret ne quitte jamais le serveur.","operationId":"access_config_api_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/perimeter":{"get":{"tags":["Service"],"summary":"Emprise des bassins calculables","description":"La géométrie du droit, en GeoJSON WGS 84 : une entité par zone concernée. Jamais le chemin du fichier qui le porte.","operationId":"perimeter_api_perimeter_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"503":{"description":"Périmètre déclaré mais introuvable."}}}},"/api/uploads":{"post":{"tags":["Service"],"summary":"Déposer un fichier de points","description":"CSV, fichier vecteur, ou archive ZIP d'un shapefile — un `.shp` seul ne se lit pas. La réponse annonce le type reconnu, les colonnes du fichier et les options que le serveur a su déduire. Le fichier vit le temps du processus.","operationId":"create_upload_api_uploads_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_upload_api_uploads_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"Quota de points dépassé, ou opération réservée aux porteurs d'un jeton."},"413":{"description":"Fichier au-delà de 64 Mo."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/uploads/{upload_id}/preview":{"post":{"tags":["Service"],"summary":"Aperçu des points d'un fichier","description":"Les cinq premières lignes telles qu'elles seront lues, avec le nombre total de points et le CRS détecté. L'aperçu emprunte la même lecture que le calcul : ce qu'il montre est ce qui sera traité.","operationId":"preview_upload_api_uploads__upload_id__preview_post","parameters":[{"name":"upload_id","in":"path","required":true,"schema":{"type":"string","title":"Upload Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs":{"post":{"tags":["Service"],"summary":"Lancer un calcul","description":"Deux sources de points : une FeatureCollection GeoJSON fournie directement, ou l'identifiant d'un fichier téléversé accompagné de ses options de lecture. Le calcul est asynchrone ; l'avancement se suit sur le flux d'événements.","operationId":"create_job_api_jobs_post","requestBody":{"content":{"application/json":{"schema":{"properties":{"points":{"type":"object","description":"FeatureCollection GeoJSON de points, en WGS 84. Exclusif de `upload`."},"upload":{"type":"string","description":"Identifiant rendu par POST /api/uploads. Exclusif de `points`."},"snap_dist":{"type":"number","description":"Rayon d'accrochage de l'exutoire au réseau, en mètres.","default":30.0},"sieve_threshold":{"type":"integer","description":"Taille minimale, en pixels, des amas conservés au nettoyage du raster de bassin.","default":20},"on_missing":{"type":"string","enum":["enrich","skip"],"description":"Sort des points dont le bassin ne figure pas au fichier de dépendances. Le service applique « skip »."},"lon":{"type":"string","description":"Colonne de longitude (CSV)."},"lat":{"type":"string","description":"Colonne de latitude (CSV)."},"crs":{"type":"string","description":"CRS des coordonnées (CSV)."},"where":{"type":"string","description":"Filtre attributaire OGR (fichier vecteur)."},"id_column":{"type":"string"},"name_column":{"type":"string"},"turnstile":{"type":"string","description":"Jeton du défi anti-robot."}},"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"Quota de points dépassé, ou opération réservée aux porteurs d'un jeton."},"404":{"description":"Ressource inconnue."},"409":{"description":"Un calcul est déjà en cours."},"429":{"description":"Cinq calculs déjà lancés depuis cette adresse en 24 h glissantes."},"503":{"description":"Périmètre déclaré mais introuvable."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}":{"get":{"tags":["Service"],"summary":"Statut d'un calcul","description":"`running`, `successful` ou `failed`.","operationId":"job_status_api_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/events":{"get":{"tags":["Service"],"summary":"Flux de progression (SSE)","description":"Événements `progress`, `done` et `error`, horodatés par le serveur. L'événement final porte le nombre de bassins calculés, les points écartés et leur motif.","operationId":"job_events_api_jobs__job_id__events_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/jobs/{job_id}/result":{"get":{"tags":["Service"],"summary":"Résultat d'un calcul","description":"GeoJSON en WGS 84, ou GeoPackage dans le CRS métrique de la zone, selon le paramètre `format`.","operationId":"job_result_api_jobs__job_id__result_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"geojson","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"409":{"description":"Un calcul est déjà en cours."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ogc/":{"get":{"tags":["OGC API – Processes"],"summary":"Page d'accueil de la façade","description":"Point d'entrée normalisé : liens vers les classes de conformance, la liste des processus et le document qui décrit le service.","operationId":"landing_page_ogc__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ogc/api":{"get":{"tags":["OGC API – Processes"],"summary":"Document OpenAPI du service","description":"Le document que la page d'accueil annonce en `service-desc`. C'est le même que `/openapi.json`, servi sous le type que la norme attend.","operationId":"ogc_api_ogc_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ogc/conformance":{"get":{"tags":["OGC API – Processes"],"summary":"Classes de conformance","description":"Les classes de la norme OGC API – Processes que cette façade respecte.","operationId":"conformance_ogc_conformance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ogc/processes":{"get":{"tags":["OGC API – Processes"],"summary":"Liste des processus","description":"Un seul processus est publié : `delineate-watersheds`.","operationId":"process_list_ogc_processes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/ogc/processes/{process_id}":{"get":{"tags":["OGC API – Processes"],"summary":"Description d'un processus","description":"Entrées, sorties et modes d'exécution. Les zones desservies y sont énumérées.","operationId":"describe_process_ogc_processes__process_id__get","parameters":[{"name":"process_id","in":"path","required":true,"schema":{"type":"string","title":"Process Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ogc/processes/{process_id}/execution":{"post":{"tags":["OGC API – Processes"],"summary":"Exécuter le processus","description":"Exécution **asynchrone uniquement**, vu la durée des calculs : la réponse porte l'en-tête `Location` du travail créé.","operationId":"execute_ogc_processes__process_id__execution_post","parameters":[{"name":"process_id","in":"path","required":true,"schema":{"type":"string","title":"Process Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"403":{"description":"Façade réservée aux porteurs d'un jeton."},"404":{"description":"Ressource inconnue."},"409":{"description":"Un calcul est déjà en cours."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ogc/jobs/{job_id}":{"get":{"tags":["OGC API – Processes"],"summary":"Statut d'un travail","description":"Document `statusInfo` de la norme.","operationId":"ogc_job_status_ogc_jobs__job_id__get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/ogc/jobs/{job_id}/results":{"get":{"tags":["OGC API – Processes"],"summary":"Résultats d'un travail","description":"FeatureCollection GeoJSON des bassins calculés, en WGS 84.","operationId":"ogc_job_results_ogc_jobs__job_id__results_get","parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"404":{"description":"Ressource inconnue."},"409":{"description":"Un calcul est déjà en cours."},"500":{"description":"Le calcul a échoué ; le statut en porte le message."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_create_upload_api_uploads_post":{"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_create_upload_api_uploads_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"Service","description":"L'API du service, telle que le frontend l'emploie : téléversement d'un fichier de points, lancement d'un calcul, suivi de son avancement, récupération du résultat."},{"name":"OGC API – Processes","description":"Façade normalisée, pour les clients OGC (dont Geoserver). Le processus `delineate-watersheds` s'y exécute en **asynchrone uniquement**, vu la durée des calculs."}]}