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.

GET /api/me

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.

GET /api/stats

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.

GET /api/pdf-devis?id=<client_id>

Réponse 200

Content-Type: application/pdf · bytes du PDF

GET /api/health

Health check public (pas d'auth).

GET /api/health

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.

POST /api/newsletter-subscribe

Body

{ "email": "...", "prenom": "..." }

Webhooks recus

Phollio expose 2 endpoints pour recevoir des webhooks externes :

POST /api/stripe-webhook

Stripe customer.subscription.* + invoice.payment_*

POST /api/resend-webhook

Resend email.opened, .clicked, .bounced, .complained

Codes erreur

CodeSignification
missing_authHeader Authorization absent
invalid_tokenJWT invalide ou expire
missing_client_idParam client_id obligatoire
not_foundRessource introuvable
forbiddenRLS bloque (client autre photographe)
resend_not_configuredRESEND_API_KEY pas en env
stripe_not_configuredSTRIPE_SECRET_KEY pas en env
internalErreur serveur (voir détails)
💡 Besoin d'une integration custom ? Ecris-moi a contact@ferdiphotographe.fr.