{
	"openapi": "3.1.0",
	"info": {
		"title": "Aucadastre",
		"version": "0.1.0",
		"summary": "Tout ce qu'on sait d'une adresse en France, en JSON. Sans cle, sans quota, sans compte.",
		"description": "La parcelle cadastrale d'une adresse et sa contenance, son zonage d'urbanisme et ce qu'on peut y construire, ce qui la greve,\nses risques, le terrain, les permis de construire de la voie, les ventes, les diagnostics energetiques, ce qu il y a autour.\nLu au chargement dans les sources ouvertes de l Etat, jamais stocke. Le proprietaire d une parcelle n est servi nulle part.\n\nLes memes faits sont servis en Markdown par le jumeau `.md` de chaque page et par un serveur MCP a https://aucadastre.fr/mcp.",
		"contact": {
			"name": "Aucadastre",
			"url": "https://aucadastre.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 une journee, comme les pages."
	},
	"servers": [
		{
			"url": "https://aucadastre.fr/api"
		}
	],
	"externalDocs": {
		"description": "La documentation, en francais.",
		"url": "https://aucadastre.fr/api"
	},
	"security": [],
	"x-mcp": {
		"endpoint": "https://aucadastre.fr/mcp",
		"server": "aucadastre",
		"tools": [
			"get_french_address_facts",
			"get_french_commune_facts",
			"get_french_building_permits",
			"get_french_parcel"
		],
		"registry": "fr.aucadastre/aucadastre"
	},
	"paths": {
		"/street/{id}": {
			"get": {
				"operationId": "getStreet",
				"summary": "Tout ce qu'on sait d'une voie, au point de reference de la voie ou au numero demande.",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "L identifiant de la voie a la Base Adresse Nationale : code INSEE, souligne, code de voie.",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}_[0-9A-Za-z]{1,10}$"
						},
						"example": "94081_7125"
					},
					{
						"name": "number",
						"in": "query",
						"required": false,
						"description": "Un numero de la voie. Inconnu de la voie, il est ignore et `number` vaut null.",
						"schema": {
							"type": "integer",
							"minimum": 1
						},
						"example": 60
					}
				],
				"responses": {
					"200": {
						"description": "La voie existe. Chaque section vaut null ou est vide quand sa source ne dit rien.",
						"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, license ; next et prev sur une collection paginee."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Street"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "L identifiant est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune voie ne porte cet identifiant.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		},
		"/commune/{insee}": {
			"get": {
				"operationId": "getMunicipality",
				"summary": "Une commune, ce qui se lit a son echelle, et ses voies adressees.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse). Paris, Marseille et Lyon par leurs arrondissements.",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "94081"
					}
				],
				"responses": {
					"200": {
						"description": "La commune existe. `addressed_by_arrondissements` vaut true pour Paris, Marseille et Lyon.",
						"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, license ; next et prev sur une collection paginee."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Municipality"
								}
							}
						}
					},
					"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"
								}
							}
						}
					}
				}
			}
		},
		"/commune/{insee}/permits": {
			"get": {
				"operationId": "listPermits",
				"summary": "Les autorisations d'urbanisme delivrees dans la commune (Sitadel), par pages.",
				"parameters": [
					{
						"name": "insee",
						"in": "path",
						"required": true,
						"description": "Code INSEE de la commune, cinq caracteres (2A et 2B en Corse). Paris, Marseille et Lyon par leurs arrondissements.",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}$"
						},
						"example": "94081"
					},
					{
						"name": "limit",
						"in": "query",
						"schema": {
							"type": "integer",
							"default": 1000,
							"maximum": 12000
						},
						"description": "Illisible, il retombe sur le defaut."
					},
					{
						"name": "offset",
						"in": "query",
						"schema": {
							"type": "integer",
							"default": 0
						},
						"description": "Au-dela de la fin, la liste est vide et `more` faux : jamais 404."
					}
				],
				"responses": {
					"200": {
						"description": "La page demandee, avec `page.total` et les adresses absolues de la suivante et de la precedente.",
						"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, license ; next et prev sur une collection paginee."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Permits"
								}
							}
						}
					},
					"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"
								}
							}
						}
					}
				}
			}
		},
		"/parcel/{id}": {
			"get": {
				"operationId": "getParcel",
				"summary": "Une parcelle par sa reference cadastrale, et la voie la plus proche de son centre.",
				"parameters": [
					{
						"name": "id",
						"in": "path",
						"required": true,
						"description": "Quatorze caracteres : code INSEE, prefixe sur trois, section sur deux, numero sur quatre.",
						"schema": {
							"type": "string",
							"pattern": "^[0-9][0-9AB][0-9]{3}[0-9A-Z]{3}[0-9A-Z]{2}[0-9]{4}$"
						},
						"example": "94081000AB0123"
					}
				],
				"responses": {
					"200": {
						"description": "La parcelle existe au plan cadastral.",
						"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, license ; next et prev sur une collection paginee."
							}
						},
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/Parcel"
								}
							}
						}
					},
					"304": {
						"description": "Rien n a change depuis l ETag envoye."
					},
					"400": {
						"description": "L identifiant est illisible.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					},
					"404": {
						"description": "Aucune parcelle ne porte cet identifiant.",
						"content": {
							"application/problem+json": {
								"schema": {
									"$ref": "#/components/schemas/Problem"
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"schemas": {
			"Money": {
				"type": "object",
				"required": [
					"value",
					"currency"
				],
				"properties": {
					"value": {
						"type": "number"
					},
					"currency": {
						"type": "string",
						"example": "EUR"
					}
				}
			},
			"Risks": {
				"type": "object",
				"description": "Georisques. Les echelles ne sont pas comparables : chaque case porte la sienne.",
				"properties": {
					"clay_shrink_swell": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"code": {
								"type": "string"
							},
							"label": {
								"type": "string"
							},
							"scale": {
								"type": "integer"
							},
							"geotechnical_study_required": {
								"type": "boolean",
								"description": "Article L.132-4 du code de la construction : etude obligatoire avant la vente d un terrain a batir en exposition moyenne ou forte."
							}
						}
					},
					"seismicity": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"zone": {
								"type": "string"
							},
							"label": {
								"type": "string"
							},
							"scale": {
								"type": "integer"
							}
						}
					},
					"radon_class": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"value": {
								"type": "string"
							},
							"scale": {
								"type": "integer"
							}
						}
					},
					"natural_disaster_orders": {
						"type": "object",
						"properties": {
							"count": {
								"type": "integer"
							},
							"latest": {
								"type": [
									"string",
									"null"
								]
							}
						}
					},
					"classified_installations_within_500m": {
						"type": [
							"integer",
							"null"
						]
					},
					"potentially_polluted_sites_within_500m": {
						"type": [
							"integer",
							"null"
						]
					}
				}
			},
			"Permit": {
				"type": "object",
				"required": [
					"family",
					"kind",
					"number",
					"state",
					"date",
					"applicant",
					"works_address",
					"parcels",
					"plot_area_m2",
					"dwellings",
					"floor_area_created_m2"
				],
				"properties": {
					"family": {
						"type": "string",
						"enum": [
							"logement",
							"local",
							"amenagement",
							"demolition"
						]
					},
					"kind": {
						"type": "string",
						"description": "PC, DP, PA ou PD."
					},
					"number": {
						"type": "string"
					},
					"state": {
						"type": [
							"string",
							"null"
						],
						"description": "autorise, annule, commence, termine, ou null. Prouve par le fichier, pas deduit."
					},
					"date": {
						"type": "string",
						"format": "date"
					},
					"applicant": {
						"type": [
							"string",
							"null"
						],
						"description": "Une personne morale inscrite a Sirene, ou null : jamais un particulier."
					},
					"applicant_siren": {
						"type": [
							"string",
							"null"
						]
					},
					"works_address": {
						"type": [
							"string",
							"null"
						],
						"description": "Telle que Sitadel l ecrit : abregee et tronquee."
					},
					"street_as_filed": {
						"type": [
							"string",
							"null"
						]
					},
					"parcels": {
						"type": "array",
						"items": {
							"type": "string"
						}
					},
					"plot_area_m2": {
						"type": [
							"integer",
							"null"
						]
					},
					"dwellings": {
						"type": [
							"integer",
							"null"
						]
					},
					"floor_area_created_m2": {
						"type": [
							"integer",
							"null"
						]
					}
				}
			},
			"Street": {
				"type": "object",
				"required": [
					"url",
					"street",
					"number",
					"municipality",
					"parcel",
					"zoning",
					"constraints",
					"risks",
					"permits",
					"sales",
					"energy_diagnostics",
					"nearby",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"street": {
						"type": "object",
						"properties": {
							"id": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"postal_code": {
								"type": [
									"string",
									"null"
								]
							},
							"numbers": {
								"type": "integer"
							},
							"point": {
								"type": "object",
								"properties": {
									"lon": {
										"type": "number"
									},
									"lat": {
										"type": "number"
									}
								}
							}
						}
					},
					"number": {
						"type": [
							"object",
							"null"
						],
						"properties": {
							"number": {
								"type": "integer"
							},
							"suffix": {
								"type": [
									"string",
									"null"
								]
							}
						}
					},
					"municipality": {
						"type": "object",
						"properties": {
							"insee": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"department": {
								"type": "string"
							}
						}
					},
					"parcel": {
						"type": [
							"object",
							"null"
						],
						"description": "La parcelle qui contient le point, ou la plus proche quand le point est sur la voie (`contains_point` faux, `distance_m` rendu).",
						"properties": {
							"id": {
								"type": "string"
							},
							"label": {
								"type": "string"
							},
							"section": {
								"type": "string"
							},
							"number": {
								"type": "string"
							},
							"prefix": {
								"type": "string"
							},
							"area_m2": {
								"type": "integer"
							},
							"contains_point": {
								"type": "boolean"
							},
							"distance_m": {
								"type": [
									"integer",
									"null"
								]
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"cadastral_sheet": {
						"type": [
							"object",
							"null"
						]
					},
					"building": {
						"type": [
							"object",
							"null"
						],
						"description": "Le batiment au point, BD TOPO de l IGN.",
						"properties": {
							"height_m": {
								"type": [
									"number",
									"null"
								]
							},
							"floors": {
								"type": [
									"integer",
									"null"
								]
							},
							"use": {
								"type": [
									"string",
									"null"
								]
							},
							"nature": {
								"type": [
									"string",
									"null"
								]
							}
						}
					},
					"ground": {
						"type": [
							"object",
							"null"
						],
						"description": "Altitude, pente du terrain naturel sur cent metres, production solaire d une installation de 3 kWc."
					},
					"zoning": {
						"type": [
							"object",
							"null"
						],
						"description": "Le trait de zonage au point, et les destinations que le document declare (feu tricolore : allowed, conditional, forbidden)."
					},
					"planning_document": {
						"type": [
							"object",
							"null"
						]
					},
					"constraints": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"label": {
									"type": "string"
								},
								"kind": {
									"type": "string",
									"enum": [
										"prescription",
										"information",
										"easement"
									]
								}
							}
						}
					},
					"risks": {
						"$ref": "#/components/schemas/Risks"
					},
					"permits": {
						"type": "object",
						"properties": {
							"attached_to_street": {
								"type": "array",
								"items": {
									"$ref": "#/components/schemas/Permit"
								}
							},
							"municipality_total": {
								"type": "integer"
							},
							"municipality_url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"sales": {
						"type": "array",
						"description": "Les cinq derniers millesimes publies. Le prix au metre carre est celui du bati declare.",
						"items": {
							"type": "object",
							"properties": {
								"date": {
									"type": "string",
									"format": "date"
								},
								"nature": {
									"type": "string"
								},
								"address": {
									"type": "string"
								},
								"premises": {
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"price": {
									"$ref": "#/components/schemas/Money"
								},
								"built_area_m2": {
									"type": [
										"integer",
										"null"
									]
								},
								"land_area_m2": {
									"type": [
										"integer",
										"null"
									]
								},
								"price_per_m2": {
									"oneOf": [
										{
											"$ref": "#/components/schemas/Money"
										},
										{
											"type": "null"
										}
									]
								},
								"at_requested_number": {
									"type": "boolean"
								}
							}
						}
					},
					"energy_diagnostics": {
						"type": "array",
						"items": {
							"type": "object"
						}
					},
					"nearby": {
						"type": "object"
					},
					"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",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "Ce que le site ne remplace pas, et ce qu il ne sert jamais (le proprietaire)."
					}
				}
			},
			"Municipality": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"addressed_by_arrondissements",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"type": "object"
					},
					"addressed_by_arrondissements": {
						"type": "boolean"
					},
					"arrondissements": {
						"type": "array",
						"items": {
							"type": "object"
						}
					},
					"market": {
						"type": [
							"object",
							"null"
						],
						"description": "Medianes du dernier millesime publie, jamais des moyennes."
					},
					"planning_document": {
						"type": [
							"object",
							"null"
						]
					},
					"housing_market_zone": {
						"type": [
							"object",
							"null"
						],
						"description": "La zone A bis, A, B1, B2 ou C de l arrete en vigueur."
					},
					"fibre": {
						"type": [
							"object",
							"null"
						]
					},
					"risks": {
						"oneOf": [
							{
								"$ref": "#/components/schemas/Risks"
							},
							{
								"type": "null"
							}
						]
					},
					"permits_url": {
						"type": "string",
						"format": "uri"
					},
					"streets": {
						"type": "array",
						"items": {
							"type": "object",
							"properties": {
								"id": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"numbers": {
									"type": "integer"
								},
								"url": {
									"type": "string",
									"format": "uri"
								},
								"page_url": {
									"type": "string",
									"format": "uri"
								}
							}
						}
					},
					"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",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "Ce que le site ne remplace pas, et ce qu il ne sert jamais (le proprietaire)."
					}
				}
			},
			"Permits": {
				"type": "object",
				"required": [
					"url",
					"municipality",
					"families_missing",
					"permits",
					"page",
					"page_url",
					"markdown_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"municipality": {
						"type": "object"
					},
					"families_missing": {
						"type": "array",
						"items": {
							"type": "string",
							"enum": [
								"logement",
								"local",
								"amenagement",
								"demolition"
							]
						},
						"description": "Les familles du fichier qui n ont pas repondu : le total est alors un plancher."
					},
					"permits": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/Permit"
						}
					},
					"page": {
						"type": "object",
						"required": [
							"total",
							"limit",
							"offset",
							"more",
							"next",
							"previous"
						],
						"properties": {
							"total": {
								"type": "integer"
							},
							"limit": {
								"type": "integer"
							},
							"offset": {
								"type": "integer"
							},
							"more": {
								"type": "boolean"
							},
							"next": {
								"type": [
									"string",
									"null"
								],
								"format": "uri"
							},
							"previous": {
								"type": [
									"string",
									"null"
								],
								"format": "uri"
							}
						}
					},
					"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",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "Ce que le site ne remplace pas, et ce qu il ne sert jamais (le proprietaire)."
					}
				}
			},
			"Parcel": {
				"type": "object",
				"required": [
					"url",
					"parcel",
					"municipality",
					"nearest_street",
					"page_url"
				],
				"properties": {
					"url": {
						"type": "string",
						"format": "uri"
					},
					"parcel": {
						"type": "object",
						"properties": {
							"id": {
								"type": "string"
							},
							"label": {
								"type": "string"
							},
							"section": {
								"type": "string"
							},
							"number": {
								"type": "string"
							},
							"prefix": {
								"type": "string"
							},
							"area_m2": {
								"type": "integer"
							},
							"outline": {
								"type": "array",
								"description": "Anneaux de coordonnees [lon, lat], WGS 84."
							}
						}
					},
					"municipality": {
						"type": "object"
					},
					"nearest_street": {
						"type": [
							"object",
							"null"
						]
					},
					"page_url": {
						"type": "string",
						"format": "uri",
						"description": "Une porte : elle redirige vers la voie la plus proche."
					},
					"source": {
						"type": "string",
						"description": "D'ou vient la DONNEE. Une citation recopie cette phrase."
					},
					"served_by": {
						"type": "object",
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"terms": {
						"type": "string"
					},
					"documentation": {
						"type": "string",
						"format": "uri"
					},
					"notice": {
						"type": "string",
						"description": "Ce que le site ne remplace pas, et ce qu il ne sert jamais (le proprietaire)."
					}
				}
			},
			"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://aucadastre.fr/api#invalid-insee-code",
							"https://aucadastre.fr/api#municipality-not-found",
							"https://aucadastre.fr/api#invalid-street-id",
							"https://aucadastre.fr/api#street-not-found",
							"https://aucadastre.fr/api#invalid-parcel-id",
							"https://aucadastre.fr/api#parcel-not-found",
							"https://aucadastre.fr/api#method-not-allowed",
							"https://aucadastre.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."
					}
				}
			}
		}
	}
}
