Ce document décrit la structure et l'organisation de l'API REST d'AgencyOS.
/api/
├── middleware/ # Middleware partagés
│ ├── auth.ts # Authentification par tokens API
│ ├── rateLimit.ts # Rate limiting configurable
│ └── logging.ts # Logging automatique des requêtes
│
├── utils/ # Utilitaires partagés
│ ├── config.ts # Configuration Supabase centralisée
│ └── errors.ts # Gestion d'erreurs standardisée
│
├── leads/ # Gestion des leads
│ └── index.ts # CRUD complet (GET, POST, PUT, DELETE)
│
├── tasks/ # Gestion des tâches
│ └── index.ts # CRUD complet (GET, POST, PUT, DELETE)
│
├── tokens/ # Gestion des tokens API
│ └── index.ts # CRUD tokens (GET, POST, PATCH, DELETE)
│
├── reports/ # Rapports automatisés
│ └── process.ts # Traitement des rapports (POST)
│
├── saml/ # SSO SAML
│ ├── initiate.ts # Initiation SSO (POST)
│ └── assert.ts # Traitement assertion (POST)
│
├── email/ # Envoi d'emails
│ └── send.ts # Envoi multi-providers (POST)
│
└── tracking/ # Tracking emails
├── email.ts # Tracking ouvertures (GET)
└── redirect.ts # Tracking clics (GET)
Tous les endpoints utilisent la configuration centralisée dans utils/config.ts :
import { supabase } from '../utils/config';
import { supabaseAnon } from '../utils/config'; // Pour endpoints publicsLes endpoints authentifiés utilisent les middleware standardisés :
import { authenticateApiToken, requireScope } from '../middleware/auth';
import { rateLimitMiddleware } from '../middleware/rateLimit';
import { withLogging } from '../middleware/logging';Tous les endpoints sont directement sous /api/ sans préfixe de version :
- ✅
/api/leads - ❌
/api/v1/leads(ancienne structure)
Utilisation des utilitaires d'erreurs pour des réponses cohérentes :
import { sendError, sendSuccess, sendPaginated } from '../utils/errors';Requièrent un token API dans l'en-tête Authorization: Bearer <token> :
/api/leads/*/api/tasks/*/api/tokens/*/api/reports/process
Accessibles sans authentification :
/api/email/send/api/tracking/email/api/tracking/redirect/api/saml/*
- Vérifie la validité du token API
- Vérifie les scopes requis
- Vérifie l'expiration et la whitelist IP
- Attache les informations utilisateur à la requête
- Limites par minute, heure et jour
- Headers de réponse avec informations de quota
- Retourne 429 si limite dépassée
- Enregistre toutes les requêtes authentifiées
- Stocke les métadonnées (IP, User-Agent, temps de réponse)
- Limite la taille des bodies loggés (10KB max)
Toutes les variables sont lues depuis utils/config.ts :
VITE_SUPABASE_URLouSUPABASE_URL- URL SupabaseSUPABASE_SERVICE_ROLE_KEY- Clé service role (admin)VITE_SUPABASE_ANON_KEYouSUPABASE_ANON_KEY- Clé anonyme (public)
Tous les fichiers api/**/*.ts sont configurés dans frontend/vercel.json :
{
"functions": {
"api/**/*.ts": {
"runtime": "@vercel/node"
}
}
}Pour ajouter un nouvel endpoint :
- Créer le dossier dans
/api/(ex:/api/projects/) - Créer
index.tsavec le handler - Importer la config centralisée :
import { supabase } from '../utils/config' - Utiliser les middleware si authentification requise
- Documenter dans
README.mdetopenapi.yaml
Exemple :
// api/projects/index.ts
import type { VercelRequest, VercelResponse } from '@vercel/node';
import { supabase } from '../utils/config';
import { authenticateApiToken, requireScope, AuthenticatedRequest } from '../middleware/auth';
import { rateLimitMiddleware } from '../middleware/rateLimit';
import { withLogging } from '../middleware/logging';
export default withLogging(async (req: AuthenticatedRequest, res: VercelResponse) => {
await authenticateApiToken(req, res, async () => {
await rateLimitMiddleware(req, res, async () => {
// Votre logique ici
});
});
});- README.md : Guide complet de l'API avec exemples
- openapi.yaml : Spécification OpenAPI 3.0
- MIGRATION_GUIDE.md : Guide de migration depuis l'ancienne structure
- STRUCTURE.md : Ce document
Pour toute question :
- Consultez
api/README.mdpour la documentation complète - Voir
api/MIGRATION_GUIDE.mdpour la migration - Voir
doc/DOCUMENTATION_TECHNIQUE.mdpour l'architecture globale