{
	"openapi": "3.1.0",
	"info": {
		"title": "Edifiable",
		"version": "0.1.0",
		"summary": "Le reglement d'urbanisme francais, en JSON. Sans cle, sans quota, sans compte.",
		"description": "Ce que le plan local d'urbanisme autorise sur une commune, une zone ou une rue de France, cite a l'article,\nlu dans les documents deposes au Geoportail de l'urbanisme. Chaque valeur compilee voyage avec la condition\nqui la declenche et la phrase du reglement qui la porte.\n\nLes memes faits sont servis en Markdown par le jumeau `.md` de chaque page (`/plu/<commune>.md`,\n`/plu/<commune>/<zone>.md`, `/plu/<commune>/voie/<voie>.md`) et par un serveur MCP a https://edifiable.fr/mcp.",
		"contact": {
			"name": "Edifiable",
			"url": "https://edifiable.fr"
		},
		"license": {
			"name": "Licence Ouverte 2.0 (Etalab)",
			"url": "https://www.etalab.gouv.fr/licence-ouverte-open-licence/"
		},
		"x-stability": "Additive : un champ peut apparaitre, aucun ne disparait ni ne change de sens sous un appelant, et une adresse ne bouge pas. Aucun numero de version, nulle part.",
		"x-rate-limit": "Aucune borne de debit. Chaque reponse se range au bord cinq minutes ; les sources amont sont rangees une journee."
	},
	"servers": [
		{
			"url": "https://edifiable.fr/api"
		}
	],
	"externalDocs": {
		"description": "La documentation, en francais.",
		"url": "https://edifiable.fr/api"
	},
	"security": [],
	"x-mcp": {
		"endpoint": "https://edifiable.fr/mcp",
		"server": "edifiable",
		"tools": [
			"get_french_urbanism_zone_rules",
			"search_french_urbanism_regulation",
			"get_french_urbanism_rules_for_street",
			"get_french_building_permit_pieces"
		],
		"registry": "fr.edifiable/edifiable"
	},
	"paths": {
		"/plan/{insee}": {
			"get": {
				"operationId": "getPlan",
				"summary": "Le document d'urbanisme d'une commune, ses zones et l'etat de sa lecture.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse).",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "31395"
					}
				],
				"responses": {
					"200": {
						"description": "La commune existe. `document` vaut `null` quand elle n a rien depose a son nom ; `coverage` dit alors ce qui la couvre.",
						"headers": {
							"ETag": {
								"schema": {
									"type": "string"
								},
								"description": "Faible. `If-None-Match` est honore, en liste et avec le joker."
							},
							"Link": {
								"schema": {
									"type": "string"
								},
								"description": "service-desc, service-doc et license, en absolu."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Plan"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "Le code INSEE est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune commune ne porte ce code.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		},
		"/plan/{insee}/zone/{zone}": {
			"get": {
				"operationId": "getZone",
				"summary": "Une zone du reglement : ses regles en clair et ses articles mot pour mot.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse).",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "31395"
					},
					{
						"name": "zone",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string"
						},
						"example": "UA",
						"description": "Le code de zone tel que le reglement l ecrit. Insensible a la casse."
					}
				],
				"responses": {
					"200": {
						"description": "La zone est lue.",
						"headers": {
							"ETag": {
								"schema": {
									"type": "string"
								},
								"description": "Faible. `If-None-Match` est honore, en liste et avec le joker."
							},
							"Link": {
								"schema": {
									"type": "string"
								},
								"description": "service-desc, service-doc et license, en absolu."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Zone"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "Le code INSEE est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune commune a ce code, ou aucun article lu pour cette zone. Le refus enumere les zones lues.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		},
		"/plan/{insee}/street/{street}": {
			"get": {
				"operationId": "getStreet",
				"summary": "La zone au droit d'une rue et ce que le reglement en dit.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse).",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "31395"
					},
					{
						"name": "street",
						"in": "path",
						"required": true,
						"schema": {
							"type": "string",
							"minLength": 2
						},
						"example": "avenue-jacques-douzans",
						"description": "Le nom de la voie en slug : minuscules, sans accent, tirets."
					}
				],
				"responses": {
					"200": {
						"description": "La voie existe a la Base Adresse Nationale. `zone_at_point` vaut `null` quand le Geoportail ne rend aucun zonage.",
						"headers": {
							"ETag": {
								"schema": {
									"type": "string"
								},
								"description": "Faible. `If-None-Match` est honore, en liste et avec le joker."
							},
							"Link": {
								"schema": {
									"type": "string"
								},
								"description": "service-desc, service-doc et license, en absolu."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Street"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "Le code INSEE ou le nom de voie est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune commune a ce code, ou aucune voie de ce nom dans la commune.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		},
		"/plan/{insee}/permit": {
			"get": {
				"operationId": "getPermitPieces",
				"summary": "Les pieces d'un permis de construire, et ce qui les declenche sur ce territoire.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse).",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "31395"
					}
				],
				"responses": {
					"200": {
						"description": "Les pieces exigees et celles a verifier.",
						"headers": {
							"ETag": {
								"schema": {
									"type": "string"
								},
								"description": "Faible. `If-None-Match` est honore, en liste et avec le joker."
							},
							"Link": {
								"schema": {
									"type": "string"
								},
								"description": "service-desc, service-doc et license, en absolu."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Permit"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "Le code INSEE est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune commune ne porte ce code.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"schemas": {
			"Municipality": {
				"type": "object",
				"required": [
					"insee",
					"name",
					"department"
				],
				"properties": {
					"insee": {
						"type": "string"
					},
					"name": {
						"type": "string"
					},
					"department": {
						"type": "string"
					}
				}
			},
			"Rule": {
				"type": "object",
				"required": [
					"topic",
					"question",
					"article",
					"cases",
					"not_regulated",
					"note",
					"incomplete"
				],
				"properties": {
					"topic": {
						"type": "string",
						"enum": [
							"usage",
							"hauteur",
							"emprise",
							"voie",
							"limites",
							"stationnement",
							"verts"
						],
						"description": "Cle stable du domaine."
					},
					"question": {
						"type": "string",
						"description": "La question en francais, telle que la page la pose."
					},
					"article": {
						"type": "integer"
					},
					"cases": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"value",
								"when",
								"sentence"
							],
							"properties": {
								"value": {
									"type": "string",
									"description": "Ce qu on lit dans la colonne : « 9 m », « 50 % », « 2 places par logement »."
								},
								"when": {
									"type": [
										"string",
										"null"
									],
									"description": "La condition qui declenche cette valeur. `null` quand elle vaut sans condition."
								},
								"sentence": {
									"type": "string",
									"description": "La phrase du reglement qui porte la valeur, retrouvee dans l article au moment de la reponse."
								}
							}
						}
					},
					"not_regulated": {
						"type": "boolean",
						"description": "Le document dit lui-meme qu il ne fixe rien."
					},
					"note": {
						"type": [
							"string",
							"null"
						]
					},
					"incomplete": {
						"type": "boolean",
						"description": "Vrai quand au moins un cas n a pas retrouve sa phrase dans le document servi : il n est pas rendu."
					}
				}
			},
			"Piece": {
				"type": "object",
				"required": [
					"code",
					"title",
					"article",
					"trigger",
					"reason"
				],
				"properties": {
					"code": {
						"type": "string",
						"example": "PCMI13"
					},
					"title": {
						"type": "string"
					},
					"article": {
						"type": "string",
						"description": "L article du code de l urbanisme qui exige la piece."
					},
					"trigger": {
						"type": "string",
						"enum": [
							"toujours",
							"lotissement",
							"zac",
							"natura2000",
							"etude-impact",
							"assainissement",
							"sismique",
							"ppr",
							"thermique",
							"exemplarite",
							"defrichement",
							"demolition",
							"domaine-public",
							"patrimoine",
							"parc-national",
							"stationnement",
							"derogation",
							"servitude",
							"cos",
							"pup",
							"logement-existant"
						]
					},
					"reason": {
						"type": "string",
						"description": "Le declencheur, en francais."
					}
				}
			},
			"Plan": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"document",
					"coverage",
					"regulation",
					"permit",
					"risks",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"allOf": [
							{
								"type": "object",
								"required": [
									"insee",
									"name",
									"department"
								],
								"properties": {
									"insee": {
										"type": "string"
									},
									"name": {
										"type": "string"
									},
									"department": {
										"type": "string"
									}
								}
							}
						],
						"properties": {
							"postal_code": {
								"type": [
									"string",
									"null"
								]
							},
							"population": {
								"type": [
									"integer",
									"null"
								]
							}
						}
					},
					"document": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"type": {
								"type": "string",
								"example": "PLU"
							},
							"name": {
								"type": "string",
								"example": "31395_PLU_20240215"
							},
							"approved_on": {
								"type": [
									"string",
									"null"
								],
								"description": "En francais, lue dans le nom du document."
							},
							"regulation_pdf_url": {
								"type": "string",
								"format": "uri"
							},
							"regulation_text_url": {
								"type": "string",
								"format": "uri"
							},
							"zoning_plan_sheets": {
								"type": "integer"
							}
						}
					},
					"coverage": {
						"type": [
							"object",
							"null"
						],
						"description": "Ce qui couvre la commune quand elle n a rien depose a son nom : un document intercommunal, ou un autre de ses documents.",
						"properties": {
							"partition": {
								"type": [
									"string",
									"null"
								]
							},
							"zone_at_centre": {
								"type": "string"
							},
							"zone_label": {
								"type": [
									"string",
									"null"
								]
							},
							"intercommunal": {
								"type": "boolean"
							}
						}
					},
					"regulation": {
						"type": "object",
						"properties": {
							"state": {
								"type": "string",
								"description": "decoupe, scan, sans-reglement, sans-article, non-normatif, echec ou not-read."
							},
							"grid": {
								"type": "string",
								"enum": [
									"R123-9",
									"R151"
								],
								"description": "La nomenclature qui numerote les articles : R123-9, article du code de l urbanisme abroge en 2015 dont la numerotation survit dans trois documents sur cinq, ou R151, sans numeros - les numeros sont alors ceux du site, pas du document."
							},
							"pages": {
								"type": [
									"integer",
									"null"
								]
							},
							"zones": {
								"type": "array",
								"items": {
									"type": "object",
									"properties": {
										"code": {
											"type": "string"
										},
										"name": {
											"type": [
												"string",
												"null"
											]
										},
										"summary": {
											"type": [
												"string",
												"null"
											]
										},
										"character": {
											"type": [
												"string",
												"null"
											]
										},
										"articles": {
											"type": "integer"
										},
										"url": {
											"type": "string",
											"format": "uri"
										},
										"page_url": {
											"type": "string",
											"format": "uri"
										},
										"markdown_url": {
											"type": "string",
											"format": "uri"
										}
									}
								}
							},
							"zones_on_the_map": {
								"type": "array",
								"items": {
									"type": "string"
								},
								"description": "Les zones que le plan porte quand le reglement n est pas decoupe."
							},
							"compiled": {
								"type": [
									"object",
									"null"
								],
								"description": "La regle GENERALE de chaque zone par domaine, et le nombre de cas qui restent. La zone porte tous les cas.",
								"properties": {
									"document": {
										"type": "string"
									},
									"compiled_on": {
										"type": "string"
									},
									"rules_by_zone": {
										"type": "object",
										"additionalProperties": {
											"type": "object"
										}
									}
								}
							}
						}
					},
					"procedure": {
						"type": [
							"object",
							"null"
						]
					},
					"permit": {
						"type": [
							"object",
							"null"
						]
					},
					"risks": {
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"planning_department": {
						"type": [
							"object",
							"null"
						]
					},
					"town_hall": {
						"type": [
							"object",
							"null"
						]
					},
					"page_url": {
						"type": "string",
						"format": "uri"
					},
					"markdown_url": {
						"type": "string",
						"format": "uri"
					},
					"source": {
						"type": "string",
						"description": "D'ou vient la DONNEE. Une citation recopie cette phrase."
					},
					"served_by": {
						"type": "object",
						"description": "Qui a REPONDU. Ne pas confondre avec `source`.",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "La retenue : une lecture automatique ne remplace pas le certificat d'urbanisme delivre par la mairie."
					}
				}
			},
			"Zone": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"zone",
					"rules",
					"answers",
					"articles",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"type": "object",
						"required": [
							"insee",
							"name",
							"department"
						],
						"properties": {
							"insee": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"department": {
								"type": "string"
							}
						}
					},
					"zone": {
						"type": "object",
						"properties": {
							"code": {
								"type": "string"
							},
							"name": {
								"type": [
									"string",
									"null"
								]
							},
							"summary": {
								"type": [
									"string",
									"null"
								]
							},
							"character": {
								"type": [
									"string",
									"null"
								]
							},
							"sectors": {
								"type": "array",
								"items": {
									"type": "string"
								},
								"description": "Les secteurs du plan (UAa, UAb) dont les regles sont celles de ce chapitre."
							},
							"document": {
								"type": [
									"object",
									"null"
								]
							},
							"grid": {
								"type": "string",
								"enum": [
									"R123-9",
									"R151"
								]
							}
						}
					},
					"rules": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"topic",
								"question",
								"article",
								"cases",
								"not_regulated",
								"note",
								"incomplete"
							],
							"properties": {
								"topic": {
									"type": "string",
									"enum": [
										"usage",
										"hauteur",
										"emprise",
										"voie",
										"limites",
										"stationnement",
										"verts"
									],
									"description": "Cle stable du domaine."
								},
								"question": {
									"type": "string",
									"description": "La question en francais, telle que la page la pose."
								},
								"article": {
									"type": "integer"
								},
								"cases": {
									"type": "array",
									"items": {
										"type": "object",
										"required": [
											"value",
											"when",
											"sentence"
										],
										"properties": {
											"value": {
												"type": "string",
												"description": "Ce qu on lit dans la colonne : « 9 m », « 50 % », « 2 places par logement »."
											},
											"when": {
												"type": [
													"string",
													"null"
												],
												"description": "La condition qui declenche cette valeur. `null` quand elle vaut sans condition."
											},
											"sentence": {
												"type": "string",
												"description": "La phrase du reglement qui porte la valeur, retrouvee dans l article au moment de la reponse."
											}
										}
									}
								},
								"not_regulated": {
									"type": "boolean",
									"description": "Le document dit lui-meme qu il ne fixe rien."
								},
								"note": {
									"type": [
										"string",
										"null"
									]
								},
								"incomplete": {
									"type": "boolean",
									"description": "Vrai quand au moins un cas n a pas retrouve sa phrase dans le document servi : il n est pas rendu."
								}
							}
						},
						"description": "Vide quand la commune n est pas compilee : lire `answers` et `articles`."
					},
					"answers": {
						"type": "array",
						"description": "Une phrase COPIEE par question, quand la commune n est pas compilee. Jamais une valeur synthetisee.",
						"items": {
							"type": "object",
							"properties": {
								"article": {
									"type": "integer"
								},
								"topic": {
									"type": "string"
								},
								"sentence": {
									"type": "string"
								}
							}
						}
					},
					"articles": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"number": {
									"type": "integer"
								},
								"heading": {
									"type": "string",
									"description": "L intitule de la nomenclature, a defaut celui du document."
								},
								"document_heading": {
									"type": [
										"string",
										"null"
									],
									"description": "L intitule tel que le document l ecrit : c est lui qui est opposable."
								},
								"question": {
									"type": [
										"string",
										"null"
									]
								},
								"text": {
									"type": "string"
								}
							}
						}
					},
					"page_url": {
						"type": "string",
						"format": "uri"
					},
					"markdown_url": {
						"type": "string",
						"format": "uri"
					},
					"source": {
						"type": "string",
						"description": "D'ou vient la DONNEE. Une citation recopie cette phrase."
					},
					"served_by": {
						"type": "object",
						"description": "Qui a REPONDU. Ne pas confondre avec `source`.",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "La retenue : une lecture automatique ne remplace pas le certificat d'urbanisme delivre par la mairie."
					}
				}
			},
			"Street": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"street",
					"zone_at_point",
					"neighbouring_zones",
					"rules",
					"answers",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"type": "object",
						"required": [
							"insee",
							"name",
							"department"
						],
						"properties": {
							"insee": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"department": {
								"type": "string"
							}
						}
					},
					"street": {
						"type": "object",
						"properties": {
							"name": {
								"type": "string"
							},
							"postal_code": {
								"type": [
									"string",
									"null"
								]
							}
						}
					},
					"zone_at_point": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"code": {
								"type": "string",
								"description": "Le trait du plan au point de la voie : un secteur (UAa) ou une zone."
							},
							"label": {
								"type": [
									"string",
									"null"
								]
							},
							"chapter": {
								"type": [
									"string",
									"null"
								],
								"description": "Le chapitre du reglement qui porte ses regles."
							},
							"chapter_url": {
								"type": [
									"string",
									"null"
								],
								"format": "uri"
							},
							"page_url": {
								"type": [
									"string",
									"null"
								],
								"format": "uri"
							}
						}
					},
					"plan_labels": {
						"type": "array",
						"description": "Ce que le plan graphique impose ICI, quand le document etiquette ses traits.",
						"items": {
							"type": "object",
							"properties": {
								"name": {
									"type": "string"
								},
								"value": {
									"type": "string"
								}
							}
						}
					},
					"neighbouring_zones": {
						"type": "array",
						"description": "Ce que le plan porte a moins de 120 m : une voie change souvent de zone d un cote a l autre.",
						"items": {
							"type": "object",
							"properties": {
								"code": {
									"type": "string"
								},
								"label": {
									"type": [
										"string",
										"null"
									]
								},
								"chapter": {
									"type": [
										"string",
										"null"
									]
								}
							}
						}
					},
					"rules": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"topic",
								"question",
								"article",
								"cases",
								"not_regulated",
								"note",
								"incomplete"
							],
							"properties": {
								"topic": {
									"type": "string",
									"enum": [
										"usage",
										"hauteur",
										"emprise",
										"voie",
										"limites",
										"stationnement",
										"verts"
									],
									"description": "Cle stable du domaine."
								},
								"question": {
									"type": "string",
									"description": "La question en francais, telle que la page la pose."
								},
								"article": {
									"type": "integer"
								},
								"cases": {
									"type": "array",
									"items": {
										"type": "object",
										"required": [
											"value",
											"when",
											"sentence"
										],
										"properties": {
											"value": {
												"type": "string",
												"description": "Ce qu on lit dans la colonne : « 9 m », « 50 % », « 2 places par logement »."
											},
											"when": {
												"type": [
													"string",
													"null"
												],
												"description": "La condition qui declenche cette valeur. `null` quand elle vaut sans condition."
											},
											"sentence": {
												"type": "string",
												"description": "La phrase du reglement qui porte la valeur, retrouvee dans l article au moment de la reponse."
											}
										}
									}
								},
								"not_regulated": {
									"type": "boolean",
									"description": "Le document dit lui-meme qu il ne fixe rien."
								},
								"note": {
									"type": [
										"string",
										"null"
									]
								},
								"incomplete": {
									"type": "boolean",
									"description": "Vrai quand au moins un cas n a pas retrouve sa phrase dans le document servi : il n est pas rendu."
								}
							}
						}
					},
					"answers": {
						"type": "array",
						"items": {
							"type": "object"
						}
					},
					"constraints": {
						"type": [
							"object",
							"null"
						],
						"description": "Prescriptions, informations et servitudes d utilite publique dessinees a 120 m."
					},
					"permit_pieces_triggered": {
						"type": [
							"array",
							"null"
						],
						"items": {
							"type": "object",
							"required": [
								"code",
								"title",
								"article",
								"trigger",
								"reason"
							],
							"properties": {
								"code": {
									"type": "string",
									"example": "PCMI13"
								},
								"title": {
									"type": "string"
								},
								"article": {
									"type": "string",
									"description": "L article du code de l urbanisme qui exige la piece."
								},
								"trigger": {
									"type": "string",
									"enum": [
										"toujours",
										"lotissement",
										"zac",
										"natura2000",
										"etude-impact",
										"assainissement",
										"sismique",
										"ppr",
										"thermique",
										"exemplarite",
										"defrichement",
										"demolition",
										"domaine-public",
										"patrimoine",
										"parc-national",
										"stationnement",
										"derogation",
										"servitude",
										"cos",
										"pup",
										"logement-existant"
									]
								},
								"reason": {
									"type": "string",
									"description": "Le declencheur, en francais."
								}
							}
						}
					},
					"risks": {
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"document": {
						"type": [
							"object",
							"null"
						]
					},
					"page_url": {
						"type": "string",
						"format": "uri"
					},
					"markdown_url": {
						"type": "string",
						"format": "uri"
					},
					"source": {
						"type": "string",
						"description": "D'ou vient la DONNEE. Une citation recopie cette phrase."
					},
					"served_by": {
						"type": "object",
						"description": "Qui a REPONDU. Ne pas confondre avec `source`.",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "La retenue : une lecture automatique ne remplace pas le certificat d'urbanisme delivre par la mairie."
					}
				}
			},
			"Permit": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"form",
					"required",
					"to_check",
					"ground",
					"page_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"type": "object",
						"required": [
							"insee",
							"name",
							"department"
						],
						"properties": {
							"insee": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"department": {
								"type": "string"
							}
						}
					},
					"form": {
						"type": "string",
						"example": "Cerfa 13406*15"
					},
					"required": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"code",
								"title",
								"article",
								"trigger",
								"reason"
							],
							"properties": {
								"code": {
									"type": "string",
									"example": "PCMI13"
								},
								"title": {
									"type": "string"
								},
								"article": {
									"type": "string",
									"description": "L article du code de l urbanisme qui exige la piece."
								},
								"trigger": {
									"type": "string",
									"enum": [
										"toujours",
										"lotissement",
										"zac",
										"natura2000",
										"etude-impact",
										"assainissement",
										"sismique",
										"ppr",
										"thermique",
										"exemplarite",
										"defrichement",
										"demolition",
										"domaine-public",
										"patrimoine",
										"parc-national",
										"stationnement",
										"derogation",
										"servitude",
										"cos",
										"pup",
										"logement-existant"
									]
								},
								"reason": {
									"type": "string",
									"description": "Le declencheur, en francais."
								}
							}
						}
					},
					"to_check": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"code",
								"title",
								"article",
								"trigger",
								"reason"
							],
							"properties": {
								"code": {
									"type": "string",
									"example": "PCMI13"
								},
								"title": {
									"type": "string"
								},
								"article": {
									"type": "string",
									"description": "L article du code de l urbanisme qui exige la piece."
								},
								"trigger": {
									"type": "string",
									"enum": [
										"toujours",
										"lotissement",
										"zac",
										"natura2000",
										"etude-impact",
										"assainissement",
										"sismique",
										"ppr",
										"thermique",
										"exemplarite",
										"defrichement",
										"demolition",
										"domaine-public",
										"patrimoine",
										"parc-national",
										"stationnement",
										"derogation",
										"servitude",
										"cos",
										"pup",
										"logement-existant"
									]
								},
								"reason": {
									"type": "string",
									"description": "Le declencheur, en francais."
								}
							}
						},
						"description": "Leur declencheur depend du projet, pas du terrain."
					},
					"ground": {
						"type": "object",
						"properties": {
							"read": {
								"type": "boolean",
								"description": "Faux quand les sources de risque n ont pas repondu : rien de conditionnel n est alors affirme."
							},
							"seismic_zone": {
								"type": [
									"integer",
									"null"
								]
							},
							"risks": {
								"type": "array",
								"items": {
									"type": "string"
								}
							},
							"scope": {
								"type": "string"
							}
						}
					},
					"page_url": {
						"type": "string",
						"format": "uri"
					},
					"source": {
						"type": "string",
						"description": "D'ou vient la DONNEE. Une citation recopie cette phrase."
					},
					"served_by": {
						"type": "object",
						"description": "Qui a REPONDU. Ne pas confondre avec `source`.",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "La retenue : une lecture automatique ne remplace pas le certificat d'urbanisme delivre par la mairie."
					}
				}
			},
			"Problem": {
				"type": "object",
				"description": "RFC 9457. `type` est une ancre de la page de documentation, qui repond.",
				"required": [
					"type",
					"title",
					"status",
					"detail",
					"instance"
				],
				"properties": {
					"type": {
						"type": "string",
						"format": "uri",
						"enum": [
							"https://edifiable.fr/api#invalid-insee-code",
							"https://edifiable.fr/api#municipality-not-found",
							"https://edifiable.fr/api#zone-not-found",
							"https://edifiable.fr/api#invalid-street",
							"https://edifiable.fr/api#street-not-found",
							"https://edifiable.fr/api#method-not-allowed",
							"https://edifiable.fr/api#not-found"
						]
					},
					"title": {
						"type": "string"
					},
					"status": {
						"type": "integer"
					},
					"detail": {
						"type": "string"
					},
					"instance": {
						"type": "string"
					},
					"received": {
						"description": "Ce qui a ete recu, quand cela aide a corriger."
					},
					"expected": {
						"description": "La forme attendue."
					}
				}
			}
		}
	}
}
