Previabusiness expose une API REST JSON pour intégrer le scoring dans vos outils.
Tous les endpoints sont accessibles via https://previabusiness.local/api/...
(ou http://localhost:8000/api/... en développement).
https://previabusiness.local/api/
La plupart des endpoints API nécessitent une authentification via session Django. Pour vous authentifier :
POST /api/registerPOST /login/ (formulaire HTML)sessionid dans vos requêtes suivantesX-CSRFToken avec la valeur du cookie csrftoken.
Pour lire vos données depuis un script ou un outil externe, utilisez une clé API
plutôt que la session. Les clés donnent un accès lecture seule
aux endpoints /api/v1/.
Paramètres → Clés API →
« Créer une clé ». Le secret est affiché une seule fois : copiez-le
immédiatement (seul un hash est conservé côté serveur, il ne peut pas être réaffiché).
Authorization: Token <secret>.
Endpoints lisibles avec une clé : GET /api/v1/analyses/,
GET /api/v1/firms/, GET /api/v1/companies/{siren}/,
GET /api/v1/markets/. Lecture seule : les analyses se lancent depuis
le dashboard, pas par clé API. Une clé expire au bout de 30 jours, 3 clés actives
maximum par utilisateur.
docs/API.md, section
« Authentification par clé API ».
/api/plansAuth requise
Liste tous les plans d'abonnement disponibles.
/api/registerAuth non requise Rate limit: 3/min/IP
Crée un nouveau compte utilisateur avec abonnement Free.
/api/subscribeAuth requise
Change l'abonnement de l'utilisateur connecté.
/api/scoreAuth requise Rate limit: 10/min
Calcule le scoring complet pour un SIREN. Synchrone : le résultat est retourné en une réponse JSON.
/api/score/streamAuth requise Rate limit: 10/min
Lance le pipeline complet avec streaming SSE (Server-Sent Events). Le client reçoit des events step_start, step_progress, step_done et un event final avec le résultat complet.
/api/score/batchAuth requise Rate limit: 5/min
Lance le scoring pour plusieurs SIRENs en une seule requête. Le traitement est asynchrone : interrogez GET /api/score/batch/{"{job_id}"} pour le statut.
/api/score/batch/{job_id}Auth requise
Consulte le statut d'un batch de scoring lancé via POST /api/score/batch.
/api/score/pdfAuth requise
Télécharge le PDF du rapport de scoring pour un SIREN donné.
Fichier PDF (Content-Type: application/pdf). Statut 404 si le rapport n'existe pas.
/api/analysesAuth requise
Liste l'historique des analyses de l'utilisateur connecté.
/api/model-presetsAuth requise
Liste les modèles IA disponibles pour l'exploration et l'analyse marché.
/api/firmAuth requise
Retourne les informations du cabinet de l'utilisateur et la liste des membres.
/api/firm/createAuth requise
Crée un cabinet. L'utilisateur devient administrateur.
/api/firm/inviteAuth requise Rôle admin
Invite un utilisateur existant dans le cabinet.
/api/rgpd/exportAuth requise
Exporte toutes les données personnelles de l'utilisateur (RGPD Art. 15, 20).
/api/rgpd/deleteAuth requise
Supprime toutes les données personnelles de l'utilisateur (RGPD Art. 17). Les logs d'audit sont conservés (C. com. art. L224).
Previabusiness applique des limites de débit pour protéger l'infrastructure :
| Endpoint | Limite | Type |
|---|---|---|
POST /api/register |
3 requêtes/min | Par IP |
POST /api/score |
10 requêtes/min | Par utilisateur |
POST /api/score/stream |
10 requêtes/min | Par utilisateur |
POST /api/score/batch |
5 requêtes/min | Par utilisateur |
POST /api/subscribe |
5 requêtes/min | Par utilisateur |
| Autres endpoints | Non limités | n.d. |
En cas de dépassement, le serveur retourne 429 Too Many Requests.
| Code HTTP | Signification | Cause fréquente |
|---|---|---|
| 400 | Bad Request | SIREN invalide, JSON malformé, paramètre manquant |
| 302 / 401 | Non authentifié | Session manquante ou expirée |
| 403 | Forbidden | Quota dépassé, accès refusé |
| 404 | Not Found | SIREN inexistant, PDF non trouvé, batch introuvable |
| 409 | Conflict | Email déjà utilisé, déjà membre du cabinet |
| 429 | Too Many Requests | Rate limit dépassé |
| 500 | Internal Server Error | Erreur inattendue : contacter le support |
Toutes les erreurs retournent un corps JSON : {"error": "Description du problème"}