Pappers Search¶
Contrôleur HTTP de proxy vers l'API Pappers pour la recherche d'entreprises côté porteur de projet (autocomplete SIREN / nom). Source : pappers-search.controller.ts.
Tous les endpoints requièrent un porteur de projet authentifié via better-auth (ProjectFinancingRequestUserGuard). Le guard récupère le ProjectOwner à partir de la session et le rattache à la requête.
GET /project-financing-request/pappers/search¶
Recherche d'entreprise par nom ou par SIREN, servie par deux endpoints Pappers selon la saisie. L'aiguillage vit dans le provider : pappers.api.ts.
Saisie q |
Endpoint Pappers appelé | Résultat |
|---|---|---|
| 9 chiffres (espaces tolérés) | /entreprise |
la fiche, mappée en une suggestion unique |
| autre chose | /suggestions |
resultats_nom_entreprise tel quel |
Sans cet aiguillage, une saisie de SIREN ne renvoie rien : Pappers ne remplit jamais resultats_siren sur /suggestions, et un SIREN ne matche aucun nom d'entreprise (BRI-1859).
Un SIREN inconnu de Pappers renvoie 200 avec une liste vide, pas une erreur — c'est un résultat de recherche, pas une panne.
Pré-conditions¶
- Porteur de projet authentifié (la route ne porte pas de
:projectId, donc seul le check d'identité duProjectFinancingRequestUserGuards'applique — pas de check d'appartenance projet).
Query params¶
Validés via bodySafeParse_zod(pappersSearchQuerySchema, queryParams) :
longueur par défaut à 10 côté provider Pappers si absent. types est jointuré en CSV avant transmission.
Response¶
Type SearchPappersResponse :
{
"resultats_nom_entreprise?": [
{
"siren": "string",
"nom_entreprise": "string",
"date_creation": "ISO date?",
"domaine_activite": "string?",
"forme_juridique": "string?",
"capital": "number?",
"greffe": "string?",
"siege": {
"code_pays": "string?",
"adresse_ligne_1": "string?",
"code_postal": "string?",
"ville": "string?"
}
}
]
}
forme_juridique et capital sont portés par /suggestions (EntrepriseBase). greffe (ville du RCS) n'y figure pas — il arrive via /entreprise post-sélection, ou sur une suggestion mappée depuis une fiche SIREN.
date_creation et domaine_activite sont optionnels à l'inverse : seul /suggestions les porte.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
validation-body |
400 | q vide ou query params invalides |
pappers-search-failed |
400 | L'appel Pappers a échoué (réseau / 5xx) ou la réponse n'a pas validé le schéma. Sur la branche SIREN, seul un 404 échappe à cette règle — c'est un SIREN inconnu, donc une liste vide |
GET /project-financing-request/pappers/company¶
Proxy vers l'endpoint /entreprise de Pappers. Renvoie un subset de la fiche entreprise (SIREN, siège, representants) pour préremplir le formulaire emprunteur après sélection. Voir pappers-search.controller.ts.
Pré-conditions¶
- Porteur de projet authentifié (même guard que
/search— pas de check d'appartenance projet).
Query params¶
Validés via bodySafeParse_zod(getPappersCompanyQuerySchema, queryParams) :
Response¶
Type GetPappersCompanyResponse :
{
"siren": "string",
"nom_entreprise": "string",
"forme_juridique": "string?",
"capital": "number?",
"greffe": "string?",
"siege": {
"code_pays": "string?",
"adresse_ligne_1": "string?",
"code_postal": "string?",
"ville": "string?"
},
"representants": [
{
"nom": "string?",
"denomination": "string?",
"prenom": "string?",
"prenom_usuel": "string?",
"date_de_naissance": "string?",
"ville_de_naissance": "string?",
"pays_de_naissance": "string?",
"personne_morale": "boolean?",
"qualite": "string?"
}
]
}
forme_juridique → statut juridique, capital (euros) → capital social, greffe → ville du RCS.
Erreurs¶
| Code | Statut | Cause |
|---|---|---|
validation-body |
400 | siren manquant ou invalide (≠ 9 digits) |
pappers-company-failed |
400 | L'appel Pappers a échoué (réseau / 5xx) ou la réponse n'a pas validé le schéma |
Liens¶
- Provider Pappers :
pappers.api.ts - Endpoint provider search :
search-for-company.endpoint.ts - Endpoint provider company :
get-company-by-siren.endpoint.ts - Guard :
project-financing-request-user.guard.ts