Exemples d'appels API
Statut
Document de référence — v1.0 — relu le 2026-05-10.
URL de base
https://api.danmonvillage.fr/api/v1
Headers communs
| Header | Valeur | Obligatoire |
|---|---|---|
Content-Type | application/json | Pour les requêtes POST/PUT/PATCH |
Accept | application/json | Recommandé |
Authorization | Bearer {sanctum_token} | Routes protégées |
X-App-Source | dmv | backoffice | playloop | assosuite | mairie | Routes avec identify.app |
Authentification
Échanger un token Supabase
POST /api/v1/auth/exchange
Content-Type: application/json
X-App-Source: dmv
{
"supabase_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Réponse 200 :
{
"token": "1|abc123...",
"token_type": "Bearer",
"user": {
"userId": "uuid",
"email": "user@example.com",
"roles": ["user"],
"acteurs": []
}
}
Réponse 401 :
{
"error": "invalid_token",
"message": "Token JWT invalide ou expiré."
}
Obtenir l'utilisateur courant
GET /api/v1/auth/me
Authorization: Bearer 1|abc123...
X-App-Source: dmv
Se déconnecter
POST /api/v1/auth/logout
Authorization: Bearer 1|abc123...
X-App-Source: dmv
Acteurs
Lister les acteurs
GET /api/v1/acteurs?commune_id=<uuid-commune>&kind=association&page=1
X-App-Source: dmv
Obtenir un acteur par slug
GET /api/v1/acteurs/association-les-amis-du-village
X-App-Source: dmv
Documents d'un acteur
GET /api/v1/acteurs/association-les-amis-du-village/documents
X-App-Source: dmv
PlayLoop (devices)
Authentification device
Les devices PlayLoop s'authentifient via un token opaque (pas de JWT Supabase).
GET /api/v1/playloop/device/playlist
Authorization: Bearer device_token_opaque_xxx
Réponse 401 si token invalide :
{
"error": "invalid_device_token",
"message": "Token device invalide ou révoqué."
}
Health check
GET /api/v1/health
Réponse 200 :
{
"status": "ok",
"version": "0.1.0",
"env": "production"
}
Erreurs courantes
400 — Header manquant
{
"error": "missing_app_source",
"message": "Le header X-App-Source est obligatoire.",
"allowed": ["dmv", "backoffice", "playloop", "assosuite", "mairie"]
}
401 — Non authentifié
{
"message": "Unauthenticated."
}
403 — Scope violé
{
"error": "scope_violation",
"message": "Cette action dépasse votre périmètre autorisé."
}
422 — Validation échouée
{
"message": "The supabase_token field is required.",
"errors": {
"supabase_token": ["The supabase_token field is required."]
}
}