API Documentation
Reference complete des endpoints serveur Phollio. Pour la plupart des cas d'usage, utilise plutot le SDK Supabase JS directement depuis le frontend.
Authentification
Tous les endpoints sauf /api/health et
/api/newsletter-subscribe requierent un JWT Supabase
dans le header :
Authorization: Bearer <jwt_supabase>
Le JWT est obtenu via supabase.auth.getSession() apres
connexion (Google ou email + mot de passe).
GET /api/me
Retourne les infos consolidees du photographe connecte.
Réponse 200
{
"ok": true,
"photographe": { "id": "uuid", "email": "...", "nom_studio": "...", ... },
"stats": { "nb_total": 12, "nb_signes": 8, "ca_total_euros": 15000, ... },
"formules": [{ "id": "uuid", "nom": "Le Grand Jour", "prix": 185000, ... }],
"trial": { "ends_at": "...", "jours_restants": 23, "expired": false },
"onboarding": { "step1_studio": true, "step1b_formules": true, ... }
}
GET /api/stats
Stats detaillees : CA mensuel, top formules, conversion.
Réponse 200
{
"ok": true,
"annee_courante": 2026,
"ca_mensuel": { "2026-01": 0, "2026-02": 6800, ..., "2026-12": 0 },
"top_formules": [{ "nom": "Le Grand Jour", "nb_signatures": 8, "ca_euros": 14800 }],
"conversion": { "devis_envoyes": 24, "devis_signes": 12, "taux_pct": 50.0 }
}
GET /api/pdf-devis
Génère et retourne un PDF du devis avec branding photographe.
Réponse 200
Content-Type: application/pdf · bytes du PDF
GET /api/health
Health check public (pas d'auth).
Réponse 200 ou 503
{
"ok": true,
"version": "abcdef0",
"checks": { "supabase": { "ok": true, "latency_ms": 45 } }
}
POST /api/newsletter-subscribe
Inscription newsletter (Resend Audiences). Public, pas d'auth.
Body
{ "email": "...", "prenom": "..." }
Webhooks recus
Phollio expose 2 endpoints pour recevoir des webhooks externes :
Stripe customer.subscription.* + invoice.payment_*
Resend email.opened, .clicked, .bounced, .complained
Codes erreur
| Code | Signification |
|---|---|
missing_auth | Header Authorization absent |
invalid_token | JWT invalide ou expire |
missing_client_id | Param client_id obligatoire |
not_found | Ressource introuvable |
forbidden | RLS bloque (client autre photographe) |
resend_not_configured | RESEND_API_KEY pas en env |
stripe_not_configured | STRIPE_SECRET_KEY pas en env |
internal | Erreur serveur (voir détails) |