{
  "openapi": "3.1.0",
  "info": {
    "title": "API EssenceRadar",
    "version": "1.0.0",
    "summary": "Ruptures de carburant et prix des stations-service en France, d'après le flux officiel.",
    "description": "Lecture seule, en JSON. Chaque réponse porte l'heure des données officielles (donnees_du), la source et les licences. Limites par formule : Essentiel (essentiel) : 10000 requêtes par jour, 5 par seconde (jusqu'à 20 d'affilée) ; Pro (pro) : 100000 requêtes par jour, 20 par seconde (jusqu'à 60 d'affilée). Les enseignes et les noms de stations viennent d'OpenStreetMap (Open Database License 1.0 (© contributeurs OpenStreetMap)) : l'API ne les fournit pas, pour que ses données restent sous Licence Ouverte, sans l'obligation de partage à l'identique de l'ODbL. Documentation : https://essenceradar.fr/pro/api. Souscrire : https://essenceradar.fr/pro#api.",
    "contact": {
      "name": "EssenceRadar",
      "url": "https://essenceradar.fr/pro/api"
    },
    "license": {
      "name": "Licence Ouverte 2.0 (données officielles)",
      "url": "https://www.data.gouv.fr/pages/legal/licences/etalab-2.0"
    }
  },
  "servers": [
    {
      "url": "https://essenceradar.fr/api/v1"
    }
  ],
  "security": [
    {
      "cle": []
    }
  ],
  "paths": {
    "/france": {
      "get": {
        "summary": "Chiffres nationaux du dernier fichier officiel",
        "operationId": "france",
        "responses": {
          "200": {
            "description": "Chiffres de la France et compteur national.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "definitions": {
                          "type": "object"
                        },
                        "france": {
                          "anyOf": [
                            {
                              "$ref": "#/components/schemas/Chiffres"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "compteur": {
                          "type": [
                            "object",
                            "null"
                          ]
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/departements": {
      "get": {
        "summary": "Chiffres de chaque département",
        "operationId": "departements",
        "responses": {
          "200": {
            "description": "Un élément par département présent dans le flux.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "definitions": {
                          "type": "object"
                        },
                        "departements": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ChiffresDepartement"
                          }
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/departements/{code}": {
      "get": {
        "summary": "Chiffres d'un département",
        "operationId": "departement",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Numéro (21, 2A, 971) ou nom d'adresse (cote-d-or)."
          }
        ],
        "responses": {
          "200": {
            "description": "Chiffres du département.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "definitions": {
                          "type": "object"
                        },
                        "departement": {
                          "anyOf": [
                            {
                              "$ref": "#/components/schemas/ChiffresDepartement"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Code invalide (parametres_invalides).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Département inconnu (introuvable).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/departements/{code}/historique": {
      "get": {
        "summary": "Part des stations en rupture, jour par jour",
        "operationId": "historique",
        "parameters": [
          {
            "name": "code",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "jours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 366,
              "default": 30
            }
          },
          {
            "name": "carburant",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "gazole",
                "sp95",
                "sp98",
                "e10",
                "e85",
                "gplc"
              ]
            },
            "description": "Un carburant ; sans lui, « tous » (une station compte dès qu'un de ses carburants est en rupture)."
          }
        ],
        "responses": {
          "200": {
            "description": "Jours de l'entrepôt, du plus ancien au plus récent (un jour absent n'est pas encore calculé).",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "departement": {
                          "type": "object"
                        },
                        "carburant": {
                          "type": "string"
                        },
                        "du": {
                          "type": "string",
                          "format": "date"
                        },
                        "au": {
                          "type": "string",
                          "format": "date"
                        },
                        "definitions": {
                          "type": "object"
                        },
                        "jours": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/JourHistorique"
                          }
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides (parametres_invalides).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Département inconnu (introuvable).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/ruptures": {
      "get": {
        "summary": "Stations en rupture d'un département, d'une commune ou autour d'un point",
        "operationId": "ruptures",
        "description": "Une seule zone par requête : departement, commune (code INSEE), ou lat et lon.",
        "parameters": [
          {
            "name": "departement",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "commune",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^(\\d{5}|2[AB]\\d{3})$"
            },
            "description": "Code INSEE."
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": -90,
              "maximum": 90
            }
          },
          {
            "name": "lon",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": -180,
              "maximum": 180
            }
          },
          {
            "name": "rayon",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0,
              "maximum": 50,
              "default": 10
            },
            "description": "En km, avec lat et lon."
          },
          {
            "name": "limite",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "description": "Avec lat et lon."
          },
          {
            "name": "carburant",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "gazole",
                "sp95",
                "sp98",
                "e10",
                "e85",
                "gplc"
              ]
            },
            "description": "Filtre sur un carburant."
          }
        ],
        "responses": {
          "200": {
            "description": "Stations en rupture, les plus récentes d'abord (les plus proches d'abord autour d'un point).",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "zone": {
                          "type": "object"
                        },
                        "carburant": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "definition": {
                          "type": "string"
                        },
                        "comptes": {
                          "type": "object",
                          "description": "Absent autour d'un point."
                        },
                        "total": {
                          "type": "integer"
                        },
                        "tronque": {
                          "type": "boolean",
                          "description": "Vrai quand la zone compte plus de 2000 stations en rupture."
                        },
                        "stations": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/StationEnRupture"
                          }
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Paramètres invalides (parametres_invalides).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Zone inconnue (introuvable).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/stations/{id}": {
      "get": {
        "summary": "Une station : statut officiel, prix, horaires, signalements",
        "operationId": "station",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Identifiant du flux officiel (7 ou 8 chiffres)."
          }
        ],
        "responses": {
          "200": {
            "description": "Fiche de la station.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Enveloppe"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "station": {
                          "$ref": "#/components/schemas/Station"
                        },
                        "presence": {
                          "type": "object"
                        },
                        "ouverture": {
                          "type": "object"
                        },
                        "carburants": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Carburant"
                          }
                        },
                        "signalements": {
                          "type": "object"
                        }
                      },
                      "required": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Identifiant invalide (parametres_invalides).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "404": {
            "description": "Station inconnue (introuvable).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    },
    "/compte": {
      "get": {
        "summary": "Formule de la clé et consommation du jour",
        "operationId": "compte",
        "responses": {
          "200": {
            "description": "Formule, quota, requêtes utilisées et restantes.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Quota du jour de la clé.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requêtes restantes aujourd'hui (jour de Paris).",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Remise à zéro du quota (minuit, heure de Paris), en secondes Unix.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "description": "Clé absente, dans l'adresse, inconnue, ou accès terminé (codes cle_manquante, cle_dans_l_adresse, cle_invalide, acces_termine).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "429": {
            "description": "Rafale ou quota du jour dépassé (codes trop_de_requetes, quota_journalier_atteint).",
            "headers": {
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          },
          "503": {
            "description": "Données momentanément indisponibles (code indisponible).",
            "headers": {
              "Retry-After": {
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Erreur"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "cle": {
        "type": "http",
        "scheme": "bearer",
        "description": "En-tête Authorization : Bearer suivi de votre clé (erk_...). Jamais dans l'adresse."
      }
    },
    "schemas": {
      "Enveloppe": {
        "type": "object",
        "required": [
          "api",
          "donnees_du",
          "genere_le",
          "source",
          "licences",
          "enseignes",
          "citation",
          "documentation"
        ],
        "properties": {
          "api": {
            "type": "string"
          },
          "donnees_du": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Heure des données officielles (heure de Paris avec son décalage)."
          },
          "genere_le": {
            "type": "string",
            "format": "date-time"
          },
          "source": {
            "type": "object",
            "properties": {
              "nom": {
                "type": "string"
              },
              "url": {
                "type": "string"
              },
              "licence": {
                "type": "string"
              },
              "licence_url": {
                "type": "string"
              }
            }
          },
          "licences": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "porte_sur": {
                  "type": "string"
                },
                "nom": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "attribution": {
                  "type": "string"
                }
              }
            }
          },
          "enseignes": {
            "type": "string"
          },
          "citation": {
            "type": "string"
          },
          "documentation": {
            "type": "string"
          }
        }
      },
      "Erreur": {
        "type": "object",
        "required": [
          "erreur",
          "message"
        ],
        "properties": {
          "erreur": {
            "type": "string",
            "enum": [
              "cle_manquante",
              "cle_dans_l_adresse",
              "cle_invalide",
              "acces_termine",
              "trop_de_requetes",
              "quota_journalier_atteint",
              "parametres_invalides",
              "introuvable",
              "indisponible"
            ]
          },
          "message": {
            "type": "string"
          },
          "documentation": {
            "type": "string"
          }
        }
      },
      "Chiffres": {
        "type": "object",
        "properties": {
          "stations": {
            "type": "integer"
          },
          "stations_en_rupture": {
            "type": "integer"
          },
          "part_en_rupture_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "stations_a_sec": {
            "type": "integer"
          },
          "rupture": {
            "type": "object",
            "properties": {
              "gazole": {
                "type": "integer"
              },
              "sp95": {
                "type": "integer"
              },
              "sp98": {
                "type": "integer"
              },
              "e10": {
                "type": "integer"
              },
              "e85": {
                "type": "integer"
              },
              "gplc": {
                "type": "integer"
              }
            },
            "required": [
              "gazole",
              "sp95",
              "sp98",
              "e10",
              "e85",
              "gplc"
            ]
          },
          "vendu": {
            "type": "object",
            "properties": {
              "gazole": {
                "type": "integer"
              },
              "sp95": {
                "type": "integer"
              },
              "sp98": {
                "type": "integer"
              },
              "e10": {
                "type": "integer"
              },
              "e85": {
                "type": "integer"
              },
              "gplc": {
                "type": "integer"
              }
            },
            "required": [
              "gazole",
              "sp95",
              "sp98",
              "e10",
              "e85",
              "gplc"
            ]
          },
          "prix_median": {
            "type": "object",
            "properties": {
              "gazole": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "sp95": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "sp98": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "e10": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "e85": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "gplc": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "gazole",
              "sp95",
              "sp98",
              "e10",
              "e85",
              "gplc"
            ]
          }
        }
      },
      "ChiffresDepartement": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Chiffres"
          },
          {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "nom": {
                "type": "string"
              },
              "page": {
                "type": [
                  "string",
                  "null"
                ]
              }
            }
          }
        ]
      },
      "StationRef": {
        "type": "object",
        "description": "Une station, sans enseigne ni nom (OpenStreetMap, ODbL).",
        "properties": {
          "id": {
            "type": "integer"
          },
          "adresse": {
            "type": [
              "string",
              "null"
            ]
          },
          "code_postal": {
            "type": "string"
          },
          "ville": {
            "type": "string"
          },
          "commune": {
            "type": [
              "string",
              "null"
            ]
          },
          "autoroute": {
            "type": "boolean"
          },
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "page": {
            "type": "string"
          }
        }
      },
      "Station": {
        "allOf": [
          {
            "$ref": "#/components/schemas/StationRef"
          },
          {
            "type": "object",
            "properties": {
              "insee": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "departement": {
                "type": "object"
              },
              "services": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "automate_24_24": {
                "type": [
                  "boolean",
                  "null"
                ]
              }
            }
          }
        ]
      },
      "StationEnRupture": {
        "type": "object",
        "properties": {
          "station": {
            "$ref": "#/components/schemas/StationRef"
          },
          "ouverte_maintenant": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "distance_km": {
            "type": "number",
            "description": "Autour d'un point seulement."
          },
          "ruptures": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "carburant": {
                  "type": "string",
                  "enum": [
                    "gazole",
                    "sp95",
                    "sp98",
                    "e10",
                    "e85",
                    "gplc"
                  ]
                },
                "depuis": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "format": "date-time"
                },
                "depuis_minutes": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "rupture_ancienne": {
                  "type": "boolean"
                },
                "station_approvisionnee_proche": {
                  "description": "Département et commune seulement.",
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/StationRef"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            }
          }
        }
      },
      "Carburant": {
        "type": "object",
        "properties": {
          "carburant": {
            "type": "string",
            "enum": [
              "gazole",
              "sp95",
              "sp98",
              "e10",
              "e85",
              "gplc"
            ]
          },
          "libelle": {
            "type": "string"
          },
          "statut": {
            "type": "string",
            "enum": [
              "dispo",
              "rupture",
              "a_verifier",
              "inconnu",
              "non_vendu"
            ]
          },
          "statut_officiel": {
            "type": [
              "string",
              "null"
            ]
          },
          "prix": {
            "type": [
              "number",
              "null"
            ]
          },
          "prix_du": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "prix_ancien": {
            "type": "boolean"
          },
          "rupture_depuis": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "rupture_ancienne": {
            "type": "boolean"
          },
          "signalement": {
            "type": [
              "object",
              "null"
            ]
          }
        }
      },
      "JourHistorique": {
        "type": "object",
        "properties": {
          "jour": {
            "type": "string",
            "format": "date"
          },
          "parc": {
            "type": "integer"
          },
          "ruptures": {
            "type": "integer"
          },
          "part_en_rupture_pct": {
            "type": [
              "number",
              "null"
            ]
          },
          "nouvelles_ruptures": {
            "type": "integer"
          },
          "retours": {
            "type": "integer"
          },
          "prix_median": {
            "type": [
              "number",
              "null"
            ]
          },
          "definitif": {
            "type": "boolean"
          }
        }
      }
    }
  }
}
