API REST custom pour AgencyOS permettant l'intégration avec des systèmes tiers et l'automatisation.
- INDEX.md - Index de navigation dans la documentation
- STRUCTURE.md - Architecture et guide de développement
- MIGRATION_GUIDE.md - Guide de migration depuis
/api/v1/ - REORGANIZATION_SUMMARY.md - Résumé de la réorganisation
- openapi.yaml - Spécification OpenAPI 3.0
https://your-domain.com/api
L'API utilise des tokens API pour l'authentification. Chaque requête doit inclure le token dans l'en-tête Authorization :
Authorization: Bearer agsk_your_api_token_here
- Connectez-vous à AgencyOS
- Allez dans Paramètres > API Tokens
- Cliquez sur "Créer un token"
- Configurez les permissions (scopes) et limites de taux
- Important : Copiez le token immédiatement, il ne sera affiché qu'une seule fois
Les scopes définissent les permissions d'un token :
leads:read- Lire les leadsleads:write- Créer/modifier/supprimer les leadstasks:read- Lire les tâchestasks:write- Créer/modifier/supprimer les tâchesprojects:read- Lire les projetsprojects:write- Créer/modifier/supprimer les projets*- Accès complet (tous les scopes)
Les scopes peuvent utiliser des wildcards :
leads:*- Toutes les opérations sur les leads
L'API applique des limites de taux pour protéger le service :
- Par défaut : 60 requêtes/minute, 1000/heure, 10000/jour
- Les limites peuvent être personnalisées lors de la création du token
- Les headers de réponse incluent les informations de rate limit :
X-RateLimit-Minute-LimitX-RateLimit-Minute-RemainingX-RateLimit-Minute-Reset- (Même chose pour
HouretDay)
En cas de dépassement, vous recevrez une réponse 429 Too Many Requests avec un header Retry-After.
{
"data": { ... }
}{
"error": "Error Type",
"message": "Description de l'erreur"
}200- Succès201- Créé204- Pas de contenu (suppression réussie)400- Requête invalide401- Non authentifié403- Interdit (scope manquant)404- Non trouvé429- Trop de requêtes (rate limit)500- Erreur serveur
GET /api/leads
Query parameters :
page(int, default: 1) - Numéro de pagelimit(int, default: 50, max: 100) - Nombre d'éléments par pagestatus(string) - Filtrer par statutstage(string) - Filtrer par étapeassigned_to(uuid) - Filtrer par assignésearch(string) - Recherche dans nom, email, companysort_by(string, default: created_at) - Champ de trisort_order(string, default: desc) - Ordre de tri (asc/desc)
Réponse :
{
"data": [
{
"id": "uuid",
"name": "John Doe",
"email": "john@example.com",
...
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"total_pages": 3
}
}GET /api/leads/:id
POST /api/leads
Body :
{
"name": "John Doe",
"email": "john@example.com",
"company": "Acme Corp",
"status": "new",
"stage": "lead",
...
}PUT /api/leads/:id
DELETE /api/leads/:id
GET /api/tasks
Query parameters : (similaires aux leads)
page,limit,status,priority,assigned_to,project_id,search,sort_by,sort_order
GET /api/tasks/:id
POST /api/tasks
Body :
{
"title": "Tâche exemple",
"description": "Description de la tâche",
"status": "todo",
"priority": "medium",
"due_date": "2025-12-31T23:59:59Z",
...
}PUT /api/tasks/:id
DELETE /api/tasks/:id
GET /api/tokens
POST /api/tokens
Body :
{
"name": "Token pour intégration",
"scopes": ["leads:read", "tasks:write"],
"rate_limit_per_minute": 100,
"rate_limit_per_hour": 5000,
"rate_limit_per_day": 50000,
"expires_at": "2026-12-31T23:59:59Z",
"ip_whitelist": ["192.168.1.1"]
}Réponse :
{
"data": {
"id": "uuid",
"name": "Token pour intégration",
"token": "agsk_...",
"token_prefix": "agsk_...",
...
},
"warning": "Save this token securely. It will not be shown again."
}PATCH /api/tokens/:id
Body :
{
"name": "Nouveau nom",
"is_active": false,
"scopes": ["leads:*"]
}DELETE /api/tokens/:id
# Liste des leads
curl -X GET "https://your-domain.com/api/leads?page=1&limit=10" \
-H "Authorization: Bearer agsk_your_token_here"
# Créer un lead
curl -X POST "https://your-domain.com/api/leads" \
-H "Authorization: Bearer agsk_your_token_here" \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"email": "john@example.com",
"company": "Acme Corp"
}'const API_BASE = 'https://your-domain.com/api';
const API_TOKEN = 'agsk_your_token_here';
// Liste des leads
const response = await fetch(`${API_BASE}/leads?page=1&limit=10`, {
headers: {
'Authorization': `Bearer ${API_TOKEN}`
}
});
const data = await response.json();
console.log(data);
// Créer un lead
const newLead = await fetch(`${API_BASE}/leads`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_TOKEN}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com',
company: 'Acme Corp'
})
});import requests
API_BASE = 'https://your-domain.com/api'
API_TOKEN = 'agsk_your_token_here'
headers = {
'Authorization': f'Bearer {API_TOKEN}'
}
# Liste des leads
response = requests.get(f'{API_BASE}/leads', headers=headers, params={'page': 1, 'limit': 10})
data = response.json()
print(data)
# Créer un lead
new_lead = requests.post(
f'{API_BASE}/leads',
headers={**headers, 'Content-Type': 'application/json'},
json={
'name': 'John Doe',
'email': 'john@example.com',
'company': 'Acme Corp'
}
)L'API n'utilise pas de versioning par URL. Tous les endpoints sont disponibles directement sous /api/.
Toutes les requêtes API sont loggées dans la table api_logs pour :
- Débogage
- Audit
- Analytics
- Détection d'anomalies
Les logs incluent :
- Token utilisé
- Endpoint appelé
- Méthode HTTP
- Code de statut
- Temps de réponse
- IP et User-Agent
- Body de requête/réponse (tronqué si > 10KB)
- STRUCTURE.md - Architecture et guide de développement de l'API
- MIGRATION_GUIDE.md - Guide de migration depuis l'ancienne structure
/api/v1/ - REORGANIZATION_SUMMARY.md - Résumé complet de la réorganisation
- openapi.yaml - Spécification OpenAPI 3.0 complète
Pour toute question ou problème :
- Documentation : docs.agencyos.com/api
- Support : support@agencyos.com
- Issues : GitHub Issues