Le Pastis Mu' — API publique

Le répertoire du pastis français, en lecture seule, au format GeoJSON — version 1

Cette API expose gratuitement les références géolocalisées du répertoire du Pastis Mu' : pastis artisanaux, distilleries, communes, descriptions et lien vers chaque fiche. Elle est en lecture seule, servie en HTTPS, avec CORS ouvert (Access-Control-Allow-Origin: *) : vous pouvez l'appeler directement depuis un navigateur, depuis n'importe quel domaine, y compris github.io ou un fichier local (origine null). Les données évoluent au fil des ajouts à la collection et sont mises en cache 5 minutes (Cache-Control: public, max-age=300).

1. GET /api/v1/pastis — les points, en GeoJSON

URL complète : https://lepastismu.com/api/v1/pastis

ParamètreRôleExemple
bboxEmprise géographique sud,ouest,nord,est (latitudes puis longitudes, en degrés décimaux). Seuls les points à l'intérieur sont renvoyés. Latitudes bornées à [-90, 90], longitudes à [-180, 180] ; une bbox invalide renvoie un code 400 avec un message en JSON.bbox=43.0,4.8,43.6,5.7
departementFiltre par numéro de département (champ renseigné progressivement sur les fiches ; le filtre bbox est plus fiable).departement=13
qRecherche texte dans le nom, la distillerie, la commune, la région et la description (accents et majuscules ignorés).q=ricard
limitNombre maximal de points renvoyés : 200 par défaut, 1000 au maximum. Le total réel est toujours indiqué dans total.limit=1000

Exemples cliquables :
Tous les points Autour de Marseille q=bardouin limit=1000

Exemple de réponse complet

Attention : conformément à la norme GeoJSON, les coordonnées sont dans l'ordre [longitude, latitude] — c'est l'erreur la plus fréquente.
{
  "type": "FeatureCollection",
  "total": 111,
  "renvoyes": 111,
  "genere_le": "2026-08-22T14:00:00.000Z",
  "licence": "CC BY 4.0 — citation obligatoire : « Le Pastis Mu' » avec lien vers https://lepastismu.com",
  "attribution": "Le Pastis Mu' — https://lepastismu.com",
  "documentation": "https://lepastismu.com/api/",
  "features": [
    {
      "type": "Feature",
      "geometry": { "type": "Point", "coordinates": [5.447966, 43.529403] },
      "properties": {
        "id": "x001",
        "nom": "Pastis Garagaï",
        "type": "pastis",
        "distillerie": "Distillerie Garagaï",
        "commune": "Aix-en-Provence",
        "departement": "",
        "region": "Provence-Alpes-Côte d'Azur",
        "description": "18 plantes garrigue pied Sainte-Victoire, millésimé",
        "degre": 45,
        "couleur": "Jaune",
        "categorie": "Artisanal",
        "sans_alcool": false,
        "url": "https://lepastismu.com/#fiche=x001"
      }
    }
  ]
}

Chaque url ouvre directement la fiche détaillée de la bouteille sur Le Pastis Mu'. Plusieurs pastis d'une même distillerie partagent les mêmes coordonnées : pensez à un regroupement de marqueurs (par exemple Leaflet.markercluster) si besoin.

2. GET /api/v1/status — état de l'API

URL complète : https://lepastismu.com/api/v1/status — aucun paramètre.
Essayer

{
  "api": "Le Pastis Mu' — API publique",
  "version": "1.0.0",
  "references_total": 231,
  "references_geolocalisees": 111,
  "derniere_maj": "2026-08-21T18:32:10.000Z",
  "source_donnees": "firebase",
  "licence": "CC BY 4.0 — citation obligatoire : « Le Pastis Mu' » avec lien vers https://lepastismu.com",
  "attribution": "Le Pastis Mu' — https://lepastismu.com",
  "documentation": "https://lepastismu.com/api/",
  "contact": "Formulaire de contact sur https://lepastismu.com"
}

3. Codes d'erreur

Toutes les erreurs sont renvoyées en JSON, jamais en HTML, avec les en-têtes CORS, sous la forme {"error": "code_court", "message": "explication en français"}.

CodeSignification
400Paramètre invalide (bbox_invalide, limit_invalide) — le message explique quoi corriger.
404Point d'entrée inconnu (introuvable).
405Méthode autre que GET ou OPTIONS.
429Limite de débit dépassée (120 requêtes/minute par adresse) — en-tête Retry-After fourni.
500Erreur interne — réessayez, puis contactez-nous si elle persiste.

4. Exemple Leaflet prêt à coller

Cet exemple charge les points visibles à l'écran (via bbox) et les recharge à chaque déplacement de la carte :

<div id="carte" style="height:520px"></div>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css">
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
const carte = L.map('carte').setView([46.6, 2.4], 6);
L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png',
  { attribution: '&copy; OpenStreetMap — Données pastis : <a href="https://lepastismu.com">Le Pastis Mu\'</a> (CC BY 4.0)' }
).addTo(carte);

const couche = L.geoJSON(null, {
  onEachFeature: (f, m) => {
    const p = f.properties;
    m.bindPopup('<b>' + p.nom + '</b><br>' + p.distillerie +
      (p.commune ? ' — ' + p.commune : '') +
      '<br><a href="' + p.url + '" target="_blank">Voir la fiche sur Le Pastis Mu\'</a>');
  }
}).addTo(carte);

function charger() {
  const b = carte.getBounds();
  const bbox = [b.getSouth(), b.getWest(), b.getNorth(), b.getEast()]
    .map(v => v.toFixed(4)).join(',');
  fetch('https://lepastismu.com/api/v1/pastis?bbox=' + bbox + '&limit=1000')
    .then(r => r.json())
    .then(g => { couche.clearLayers(); couche.addData(g); })
    .catch(console.error);
}
carte.on('moveend', charger);
charger();
</script>

5. Licence, citation, contact

Licence : Creative Commons Attribution 4.0 (CC BY 4.0). Vous pouvez réutiliser, afficher et redistribuer ces données librement, y compris commercialement, à une condition : citer « Le Pastis Mu' » avec un lien vers https://lepastismu.com (dans l'attribution de la carte, une légende ou une page de crédits).

Contact : via le formulaire de contact sur lepastismu.com (bouton « Contact » en pied de page) — pour signaler une erreur de coordonnées, demander un champ supplémentaire ou simplement dire que vous utilisez l'API : ça fait toujours plaisir.

6. Tester le CORS depuis un autre domaine

Trois vérifications, de la plus simple à la plus complète :

a) Depuis la console d'un navigateur, sur n'importe quel autre site

Ouvrez un site quelconque (par exemple votre page github.io), appuyez sur F12 → onglet Console, et collez :

fetch('https://lepastismu.com/api/v1/status')
  .then(r => r.json())
  .then(console.log)
  .catch(e => console.error('CORS bloqué :', e));

Si l'objet JSON s'affiche, le CORS fonctionne. En cas de blocage, le navigateur affiche une erreur mentionnant « CORS policy ».

b) Vérifier les en-têtes avec curl

curl -i -H "Origin: https://exemple.github.io" \
  "https://lepastismu.com/api/v1/status"

La réponse doit contenir la ligne access-control-allow-origin: *.

c) Simuler la pré-vérification OPTIONS (preflight)

curl -i -X OPTIONS \
  -H "Origin: https://exemple.github.io" \
  -H "Access-Control-Request-Method: GET" \
  "https://lepastismu.com/api/v1/pastis"

Attendu : un code 204 avec access-control-allow-origin: * et access-control-allow-methods: GET, OPTIONS. Les fichiers locaux (origine null) sont également acceptés puisque l'autorisation est *.