Aller au contenu

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é du ProjectFinancingRequestUserGuard s'applique — pas de check d'appartenance projet).

Query params

Validés via bodySafeParse_zod(pappersSearchQuerySchema, queryParams) :

{
  q: string (min 1),
  longueur?: number (coerce),
  types?: string[],
}

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) :

{
  siren: string (9 digits)
}

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