Où déjeuner avec tes titres-restaurant, depuis ton terminal.
CLI non officielle pour Swile — en lecture seule, sans mot de passe.
$ cantine places --near "place Mejane, Valbonne" --radius 400m --category restaurant
Place Mejane 06560 Valbonne · 43.6226, 7.0467 · rayon 400 m
LE RESTO MINUT 5 place Mejane, 06560 VALBONNE 22 m Restaurant
LA BRASSERIE 3 place Mejane, 06560 VALBONNE 22 m Restaurant
RESTAURANT LES AMOURIERS 1 pl Deis Amouriers, 06560 VALBONNE 28 m Restaurant
NAMASTE INDIA 2 pl Mejane, 06560 VALBONNE 30 m Restaurant
LE COIN GOURMAND 7 rue de la Bastide Vieille, 06560 VALBONNE 98 m Restaurant
$ cantine balance
Meal vouchers 272.82 € 25.00 € dispo aujourd'hui
Personal wallet 0.00 €brew install DnzzL/tap/cantine # macOS · Linux (Homebrew ≥ 4.5)
go install github.com/DnzzL/cantine@latest # partoutBinaires macOS / Linux / Windows, en amd64 et arm64, également disponibles dans les releases.
Le binaire n'est ni signé ni notarisé — pas de certificat Apple Developer. Le cask lève lui-même la quarantaine Gatekeeper à l'installation ; pour un téléchargement manuel sur macOS, il faut faire
xattr -dr com.apple.quarantine ./cantine.
Connecte-toi sur team.swile.co dans ton navigateur, puis :
cantine auth import --browser chrome
cantine places --near "35 rue de Rivoli, Paris"C'est tout. cantine ne demande jamais ton mot de passe et ne touche jamais à la double authentification : il emprunte la session que ton navigateur détient déjà, la stocke dans le trousseau de ton système, et renouvelle le jeton automatiquement. Ta session navigateur n'est pas affectée.
Ton système demandera l'autorisation de lire la clé de chiffrement des cookies (« Chrome Safe Storage » sur macOS) — sans elle, ils restent illisibles.
Autres navigateurs, profil non standard
Chrome, Firefox, Safari, Edge, Brave, Chromium, Opera, Vivaldi. Sans
--browser, cantine cherche partout et prend la session la plus récente.
cantine auth import --profile ~/chemin/vers/le/profil
cantine auth status # qui suis-je, jusqu'à quand
cantine auth logout # oublier la sessionMachine sans navigateur (VPS, conteneur, SSH)
Là où il n'y a aucun navigateur dont emprunter la session, le jeton arrive d'ailleurs : d'une machine qui en a un, ou de ton presse-papier.
cantine auth export | ssh vps cantine auth paste # depuis une machine déjà connectée
cantine auth paste # ou à la main : colle, Entréeauth export sort le jeton sur stdout et refuse de s'exécuter si stdout est un
terminal : un refresh token vaut pour tout le compte, il n'a rien à faire dans
un scrollback ni dans un log de CI.
À la main, la valeur se lit dans devtools › Application › Cookies ›
lunchr:rt : 43 caractères, sans point. Si tu en as ~800 avec deux points,
c'est lunchr:jwt, l'access token — /oauth/token le refuse.
cantine valide le jeton immédiatement et le stocke — dans le trousseau s'il y
en a un, sinon dans ~/.config/cantine/session.json en 0600. Ensuite il se
renouvelle tout seul ; un cantine auth status de temps en temps (cron)
suffit à garder la session vivante.
Swile ne propose ni device authorization grant ni découverte OIDC : il n'y a donc pas de « ouvre cette URL sur ton téléphone » à implémenter. Coller le jeton, c'est tout le protocole.
cantine places --near "Châtelet, Paris"
cantine places --near "Valbonne" --radius 2km --category restaurant
cantine places --lat 43.6252 --lng 7.0483 --radius 500m
cantine places --near "Lyon" --name "brasserie"
cantine categories # les codes de --categoryLe géocodage passe par la Base Adresse Nationale :
--near ne fonctionne donc qu'en France. Ailleurs, --lat / --lng.
--namefiltre localement. L'API Swile ne sait pas chercher par nom : elle ne répond qu'à des zones géographiques. En zone dense, elle ne renvoie qu'une fraction des commerçants présents — cantine te dit toujours laquelle :! zone dense : Swile a renvoyé 178 commerçants sur 4304 présents dans la zone.Une absence de résultat n'est jamais une preuve d'absence.
cantine balance
cantine balance --json | jq '.[] | select(.type=="meal_voucher") | .balance.value'cantine tx
cantine tx --since 2026-01-01 --limit 500 --csv > titres-resto-2026.csv| Option | Pour |
|---|---|
| (défaut) | lecture humaine, colonnes alignées, couleurs |
--json |
jq, scripts, agents |
--plain |
awk, cut — colonnes séparées par des tabulations |
--csv |
tx uniquement — tableur, note de frais |
NO_COLOR et TERM=dumb sont respectés, et la couleur disparaît dès que la
sortie n'est pas un terminal. Les avertissements partent sur stderr : un pipe
ne reçoit que des données.
Lecture seule. Aucun endpoint d'écriture n'est appelé — ni commande, ni carte, ni opération bancaire. C'est une règle du projet, inscrite dans le code : un outil qu'on lance depuis un shell ne doit jamais pouvoir dépenser d'argent.
Pas d'extraction massive. Rayon plafonné à 10 km, throttle à 1 requête par seconde sans moyen de le désactiver, ni commande de dump, ni tuilage automatique. cantine sert à trouver où déjeuner. La base des commerçants agréés appartient à Swile et relève du droit du producteur de bases de données (art. L341-1 CPI) : son extraction en volume n'est pas un usage que ce projet entend rendre possible.
Pas de contournement d'authentification. Ni flow mot de passe, ni 2FA, ni signature d'appareil de confiance. cantine emprunte une session que tu as ouverte toi-même.
cantine parle aux mêmes endpoints que l'application web team.swile.co :
| Service | Usage |
|---|---|
directory.swile.co/oauth/token |
renouvellement du jeton |
places-api.swile.co |
commerçants et catégories |
employee-bff-api.swile.co |
soldes |
neobank-api.swile.co |
historique |
Aucun n'est documenté ni supporté par Swile. Ils peuvent changer sans préavis et casser cet outil : c'est le contrat.
Les issues et les PR sont bienvenues — voir CONTRIBUTING.md. Le périmètre est volontairement étroit ; lis-le avant de proposer une fonctionnalité.
MIT — voir LICENSE.
Note
Projet indépendant, sans aucun lien avec Swile SAS. « Swile » est une marque de son propriétaire, employée ici uniquement pour désigner le service avec lequel cet outil interopère.
In English
cantine is an unofficial command-line client for Swile, the French meal-voucher and employee-benefits card. It finds nearby merchants that accept your card, shows your balances, and exports your transaction history as CSV.
It authenticates by borrowing the session cookies your browser already holds — no password, no two-factor flow, no app registration — in the spirit of spogo. It is strictly read-only, rate-limited, and deliberately incapable of bulk-extracting Swile's merchant directory.
Address lookup uses France's official open address database, so --near is
France-only; use --lat / --lng elsewhere. Install with
brew install DnzzL/tap/cantine.