API Documentation

Bureau API — Référence développeurs

L'API Bureau permet d'intégrer la production de contenu, la gestion de portail client et la facturation directement dans vos systèmes existants. Cette page documente l'ensemble des endpoints publics et les flows d'intégration recommandés.

Introduction

Bureau expose 12 endpoints serverless organisés en 4 catégories :

Base URL

https://bureau-app.com/api

Tous les endpoints retournent du JSON (sauf /api/stripe-webhook qui attend du raw body). Les headers Content-Type: application/json sont attendus sur les requêtes POST.

Authentification

Les endpoints publics ne requièrent aucune authentification. Les endpoints agence seront progressivement protégés par un token Bearer une fois le client Supabase côté frontend activé.

Note : l'authentification par token API est sur la roadmap. Voir le programme partenaires pour un accès anticipé.

Rate limits

Chaque endpoint a un rate limit individuel basé sur l'IP source, réinitialisé toutes les heures :

Endpoint Limite Fenêtre
/api/generate501 heure
/api/auth-signup51 heure
/api/waitlist101 heure
/api/create-checkout201 heure
/api/portal (GET)2001 heure
/api/track3001 heure

Une réponse 429 Too Many Requests inclut un header Retry-After en secondes.

Codes d'erreur

Code Signification
200Succès
400Validation d'input échouée (format, longueur, champs manquants)
401Authentication manquante ou invalide
404Ressource introuvable (ex : slug portail inexistant)
429Rate limit atteint
500Erreur serveur — à signaler
503Service externe dégradé (Anthropic crédits épuisés, Stripe indisponible, etc.) — avec champ queued si applicable

Endpoint : Health

GET/api/health

Vérifie l'état de tous les services externes en parallèle (Anthropic, Stripe, Brevo, Supabase) et retourne le statut global + latence par service + présence des variables d'environnement critiques.

Exemple :

curl -s https://bureau-app.com/api/health | jq

Réponse :

{
  "status": "ok",
  "version": "1.4",
  "ms": 873,
  "timestamp": "2026-04-11T18:55:00.000Z",
  "services": {
    "anthropic": { "name": "anthropic", "ok": true, "ms": 120 },
    "stripe":    { "name": "stripe",    "ok": true, "ms": 40 },
    "brevo":     { "name": "brevo",     "ok": true, "ms": 372 },
    "supabase":  { "name": "supabase",  "ok": true, "ms": 324 }
  },
  "env": {
    "BREVO_API_KEY": true,
    "STRIPE_SECRET_KEY": true,
    "ANTHROPIC_API_KEY": true,
    "SUPABASE_URL": true,
    "EMAIL_FROM": "hello@bureau-app.com"
  }
}

Codes : 200 (tout OK ou dégradé non critique), 503 (plusieurs services down).

Endpoint : Portal — lookup

GET/api/portal?slug={slug}

Récupère les données publiques d'une agence via son slug de portail. Utilisé par le frontend SPA pour charger le portail client à l'URL /p/:slug.
ParamètreTypeDescription
slugREQUISstringSlug de l'agence (100 chars max, lowercase, alphanumeric + tirets)

Exemple :

curl -s "https://bureau-app.com/api/portal?slug=atelier-lumiere"

Réponse (200) :

{
  "firm": {
    "slug": "atelier-lumiere",
    "name": "Atelier Lumière",
    "description": "Production éditoriale premium",
    "color": "#C8A96E",
    "icon": "star",
    "services": [...],
    "tiers": [...],
    "logo_url": null
  }
}

Codes : 200 (trouvé), 400 (slug manquant), 404 (introuvable).

Endpoint : Portal — submit brief

POST/api/portal

Soumet un brief client depuis le portail public. Génère une référence unique et forward à Make.com si configuré.
Body fieldTypeDescription
slugREQUISstringSlug de l'agence destinataire
clientEmailREQUISemailEmail du client soumettant le brief
clientNameREQUISstringNom du client (120 chars max)
serviceREQUISstringType de service demandé
briefREQUISstringContenu du brief (20-5000 chars)
clientCompanystringNom de l'entreprise (optionnel)
tierstringTier de service (optionnel)

Exemple :

curl -X POST https://bureau-app.com/api/portal \
  -H "Content-Type: application/json" \
  -d '{
    "slug": "atelier-lumiere",
    "clientEmail": "marie@exemple.com",
    "clientName": "Marie Dupont",
    "service": "Article de blog",
    "brief": "Article sur les bonnes pratiques SEO 2026 pour e-commerce, 1500 mots, ton expert accessible"
  }'

Réponse :

{ "ok": true, "ref": "REQ-MKQXL-7A3" }

Endpoint : Waitlist

POST/api/waitlist

Inscrit un prospect sur la liste d'attente. Envoie un email de confirmation au prospect et une notification interne.
Body fieldTypeDescription
emailREQUISemailEmail du prospect
firstNamestringPrénom
agencyNamestringNom de l'agence
agencyTypestringmarketing, communication, conseil, coaching, juridique, comptabilité, immobilier, autre
monthlyVolumestring<10, 10-50, 50-200, >200
sourcestringSource du lead (default: landing)
curl -X POST https://bureau-app.com/api/waitlist \
  -H "Content-Type: application/json" \
  -d '{
    "email": "marie@exemple.com",
    "firstName": "Marie",
    "agencyName": "Atelier Lumière",
    "agencyType": "marketing",
    "monthlyVolume": "10-50"
  }'

Endpoint : Analytics tracking

POST/api/track

Enregistre un événement analytics anonyme (pageview, action utilisateur). Les logs sont visibles dans Vercel et optionnellement forwardés à Make.com.
curl -X POST https://bureau-app.com/api/track \
  -H "Content-Type: application/json" \
  -d '{ "event": "landing_view", "page": "/landing" }'

Endpoint : Generate deliverable

POST/api/generate

Proxy vers Claude API (Anthropic). Produit un livrable structuré basé sur le système prompt et les messages fournis. Inclut retry automatique, validation de longueur minimum optionnelle, et mise en file d'attente automatique si les crédits Anthropic sont épuisés.
Body fieldTypeDescription
messagesREQUISarrayHistorique de messages au format Anthropic [{role, content}, ...]
systemstringSystem prompt (jusqu'à 50 000 chars incluant messages)
max_tokensnumberMax output tokens (default 4000, max 8192)
modelstringModel ID Anthropic (default claude-sonnet-4)
min_wordsnumberNombre de mots minimum. Si le livrable est plus court, le serveur appelle Claude une seconde fois pour l'étendre.
curl -X POST https://bureau-app.com/api/generate \
  -H "Content-Type: application/json" \
  -d '{
    "system": "Tu es un rédacteur senior...",
    "messages": [
      { "role": "user", "content": "Écris un article sur le SEO 2026" }
    ],
    "max_tokens": 4000,
    "min_words": 900
  }'
Queue credits épuisés : si Anthropic retourne "credit balance too low", l'endpoint répond avec un code 503 et un body {"queued": true, "retryAfterMinutes": 15}. La requête est sauvegardée en Supabase et retentée automatiquement par /api/cron?task=retryQueued.

Endpoint : Deliver

POST/api/deliver

Envoie un email de livraison au client final une fois le livrable validé par l'agence. Utilise le template emailLivrableDisponible.
curl -X POST https://bureau-app.com/api/deliver \
  -H "Content-Type: application/json" \
  -d '{
    "clientEmail": "marie@exemple.com",
    "clientName": "Marie",
    "serviceName": "Article blog SEO",
    "agencyName": "Atelier Lumière",
    "portalUrl": "https://bureau-app.com/p/atelier-lumiere"
  }'

Endpoint : Checkout

POST/api/create-checkout

Crée une session Stripe Checkout pour un upgrade de plan. Retourne une URL à laquelle rediriger l'utilisateur.
curl -X POST https://bureau-app.com/api/create-checkout \
  -H "Content-Type: application/json" \
  -d '{
    "plan": "pro",
    "userId": "user_123",
    "userEmail": "pro@exemple.com"
  }'

Réponse :

{
  "url": "https://checkout.stripe.com/c/pay/cs_live_...",
  "id": "cs_live_..."
}

Endpoint : Stripe Portal

POST/api/stripe-portal

Crée une session Stripe Customer Portal pour qu'un utilisateur existant gère son abonnement (changer de plan, annuler, mettre à jour sa CB).
curl -X POST https://bureau-app.com/api/stripe-portal \
  -H "Content-Type: application/json" \
  -d '{ "email": "user@exemple.com" }'

Réponse :

{ "url": "https://billing.stripe.com/session/..." }

Webhook : Stripe

POST/api/stripe-webhook

Reçoit les événements Stripe avec vérification de signature raw-body. Déclenche automatiquement les emails transactionnels correspondants (upgrade, paiement reçu, rappel de paiement).

Events gérés :

  • checkout.session.completed
  • customer.subscription.created → email upgrade
  • customer.subscription.updated
  • customer.subscription.deleted
  • invoice.paid → email paiement reçu
  • invoice.payment_failed → email rappel paiement
Configuration requise : le header stripe-signature doit être présent et STRIPE_WEBHOOK_SECRET doit être défini dans les env vars Vercel, sinon la signature n'est pas vérifiée et les events sont traités mais loggés comme warning.

Webhook : Generic events

POST/api/webhook

Receveur générique d'événements internes. Forward vers Make.com si configuré et déclenche l'email de bienvenue sur event signup.
curl -X POST https://bureau-app.com/api/webhook \
  -H "Content-Type: application/json" \
  -d '{
    "event": "signup",
    "email": "new@exemple.com",
    "name": "Nouvel utilisateur"
  }'

Changelog

Roadmap