> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API de génération PDF : rapports de conformité KYC et KYB

> Didit : téléchargez des rapports PDF KYC ou KYB en marque blanche, prêts pour l'audit, via GET /v3/session/{id}/generate-pdf/.



Prompt de génération du PDF
        Copier le prompt dans le presse-papiers



      
      

\<pre>

\`Download an audit-ready PDF report for a finished Didit verification session.

Endpoint:
GET https://verification.didit.me/v3/session/{session_id}/generate-pdf/

Authentication:
Use the x-api-key header with your Didit API key (or a user-auth token). Privilege: read:sessions.

Path parameter:
\- session_id (UUID) — works for both User Verification (KYC) and Business Verification (KYB) sessions. Didit routes to the correct template automatically.

Prerequisites:
\- Session status must be one of "Approved", "Declined", "In Review". Any other status returns 403.
\- Session must belong to the authenticated application — cross-application reads return 404.

curl example — save the PDF to disk:
curl https://verification.didit.me/v3/session/<SESSION_ID>/generate-pdf/ \
-H "x-api-key: <API_KEY>" \
-o report.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Type: application/pdf
\- Content-Disposition: attachment; filename=session_<session_id>.pdf for KYC sessions, business_<session_id>.pdf for KYB sessions.
\- Typical wall time ~1-3s (server-side WeasyPrint rendering).

Template contents:
\- KYC PDF: Identity (OCR), Liveness, Face Match, AML, POA, IP analysis, reviews, events.
\- KYB PDF: Company registry data, officers, beneficial owners (UBOs), KYB documents, AML hits, questionnaires, phone verification, email verification, IP analysis, reviews, events.

White-label:
If white-label customization is enabled on your application, the PDF uses your logo and privacy-policy URL. Configure at Console → Customization.

Failure modes:
\- 401 — invalid credentials.
\- 403 — { "detail": "You do not have permission to perform this action." } when the key lacks read:sessions OR when the session is in a non-printable status (Not Started, In Progress, Expired, Abandoned, Kyc Expired, Resubmitted, Awaiting User).
\- 404 — { "detail": "Not found." } when the session is not visible to this application.

Idempotency & cost:
Safe to retry — generation is read-only. Counts against the standard rate limit.

When to call:
\- Compliance archives (regulator submissions, internal audit binders).
\- Customer support replies (proof of decision for a specific session).
\- After approve / decline via /sessions-api/update-status — render and store the resulting PDF.
\- For every session of one user in a single file, use GET /v3/users/{vendor_data}/generate-pdf/ instead (see /management-api/users/generate-pdf).

For end-to-end Didit integration, paste in the full prompt at /integration/integration-prompt.`

\</pre>



      
      

Coller dans

## Prise en charge de KYC et KYBCette fonctionnalité fonctionne pour les sessions **Vérification des utilisateurs (KYC)** et **Vérification d'entreprise (KYB)**. Didit achemine automatiquement chaque session vers le modèle de PDF approprié :- Session Vérification des utilisateurs (KYC) → rapport avec des sections consacrées à la vérification d'identité, à la détection du vivant, à la correspondance faciale, à l'AML et au justificatif de domicile (POA).
- Session Vérification d'entreprise (KYB) → rapport avec registre des sociétés, personnes clés (bénéficiaires effectifs et dirigeants), documents, AML, questionnaire, téléphone, e-mail et analyse de l’IP, lorsque ces fonctionnalités font partie du workflow.Les deux types utilisent le même pipeline de génération de PDF et prennent en charge la personnalisation en marque blanche (logo, URL de la politique de confidentialité).## Convention de nommage des fichiers| Type | Nom de fichier |
| - | - |
| Utilisateur | `session_<session_id>.pdf` |
| Entreprise | `business_<session_id>.pdf` |Le fichier est renvoyé dans l'en-tête `Content-Disposition: attachment; filename=...`.## Exigence de statutLa session doit être dans l'état `APPROVED`, `DECLINED` ou `IN_REVIEW` pour générer un PDF. Les sessions en cours ou non démarrées renvoient `403`.## Exemples> [tab] PDF de vérification des utilisateurs (KYC)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/4c5c7f3a-.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyc-report.pdf
> ```> [tab] PDF de vérification d'entreprise (KYB)
>
> ```bash theme={null}
> curl https://verification.didit.me/v3/session/bs-01HJX1.../generate-pdf/ \
>   -H "x-api-key: YOUR_API_KEY" \
>   -o kyb-report.pdf
> ```## Marque blancheLorsque la personnalisation en marque blanche est activée pour l'application, le PDF utilise votre logo et votre URL de politique de confidentialité. Configurez-les dans *Console → Customization*.## AutorisationRequiert `read:sessions`. La même portée s'applique aux deux types.## Voir aussi- [Vue d'ensemble des sessions](https://docs.didit.me/fr/sessions-api/overview.md)
- [Récupérer la session](https://docs.didit.me/fr/sessions-api/retrieve-session.md) — version JSON de la même décision
- [Télécharger le PDF de l'historique utilisateur](https://docs.didit.me/fr/management-api/users/generate-pdf.md) — toutes les sessions pouvant faire l'objet d'un rapport pour un utilisateur, dans un seul fichier
- [Schéma de réponse KYB](https://docs.didit.me/fr/business-verification/response-schema.md) — champs inclus dans les PDF entreprise


## OpenAPI

````yaml fr/openapi-25.json GET /v3/session/{sessionId}/generate-pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Télécharger un rapport PDF pour une session de vérification
      description: >-
        Génère et télécharge un rapport PDF prêt pour la conformité pour une
        session de vérification terminée. Le même chemin dessert à la fois les
        sessions de Vérification des utilisateurs (KYC) et de Vérification
        d'entreprise (KYB) — le serveur résout le `sessionId` parmi les deux
        types de session et sélectionne le modèle de rapport correspondant.


        **Statuts éligibles.** La session doit déjà avoir un statut final ou
        pouvant faire l'objet d'un examen :


        - Sessions KYC : `Approved`, `Declined`, `In Review` ou `Kyc Expired`.

        - Sessions KYB : `Approved`, `Declined` ou `In Review`.


        Tout autre statut (`Not Started`, `In Progress`, `Expired`, `Abandoned`,
        …) renvoie `403` avec une chaîne explicative `detail` — voir la réponse
        `403` ci-dessous.


        **Contenu du rapport.** Le PDF reflète la vue de la session dans la
        console au moment de la requête :


        - **KYC** — statut global de la session, liste des avertissements et une
        section par fonctionnalité exécutée : Vérification d'identité (images du
        document et champs extraits), NFC, Détection du vivant, Correspondance
        faciale, Vérification de l'e-mail, Vérification du téléphone,
        Justificatif de domicile, réponses aux Questionnaires, Validation en
        base de données, Filtrage AML et Analyse IP — suivis des tags de la
        session, de l'activité d'examen dans la console (commentaires et
        changements de statut) et de la chronologie des événements de la
        session.

        - **KYB** — vérifications du registre des sociétés (données de
        l'entreprise), filtrages AML, vérifications des documents de
        l'entreprise, vérifications des personnes clés, réponses aux
        Questionnaires, vérifications du téléphone/de l'e-mail, analyses IP et
        chronologie des événements de la session, suivis des tags et de
        l'activité d'examen.


        **Image de marque.** Si votre application dispose d'une personnalisation
        en marque blanche, le rapport est généré avec votre logo et des liens
        vers l'URL de votre politique de confidentialité ; sinon, il porte la
        marque Didit. Les rapports sont générés en anglais — il n'y a pas de
        paramètre de langue.


        **Aucune mise en cache.** Chaque appel régénère le PDF à partir des
        données actuelles de la session, de sorte qu'un rapport généré après un
        examen manuel reflète la décision du réviseur. Deux appels pour la même
        session peuvent produire des fichiers différents à l'octet près —
        archivez le fichier téléchargé si vous avez besoin d'une copie immuable.


        **Latence.** La génération télécharge chaque image stockée (recto/verso
        des documents, selfies, fichiers supplémentaires) avant de composer le
        PDF, de sorte que les sessions riches en fichiers multimédias peuvent
        prendre plusieurs secondes. Utilisez un délai d'attente de lecture
        client généreux (60 s recommandé) et écrivez le corps en flux vers le
        disque.


        **Barre oblique finale.** La route canonique se termine par une barre
        oblique finale (`…/generate-pdf/`). Une requête sans cette barre oblique
        est traitée directement avec la même réponse — il n'y a pas de
        redirection `301`, aucun client n'a donc besoin de suivre les
        redirections et `curl` ne requiert pas `-L`. Utilisez l'URL avec barre
        oblique comme dans les exemples.


        Si vous avez besoin des données sous-jacentes au format JSON plutôt que
        d'un rapport généré, utilisez `GET /v3/session/{sessionId}/decision/`.
        Pour obtenir l'ensemble des sessions d'un utilisateur pouvant faire
        l'objet d'un rapport dans un seul document, utilisez `GET
        /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la session de Vérification des utilisateurs (KYC) ou de
            Vérification d'entreprise (KYB) à générer — le `session_id` renvoyé
            par `POST /v3/session/`. Le même chemin fonctionne pour les deux
            types de session ; utilisez le nom de fichier dans
            `Content-Disposition` sur la réponse pour identifier le type de
            rapport que vous avez reçu.


            **Doit être un UUID bien formé en minuscules.** La route ne
            correspond qu'aux UUID valides ; par conséquent, une valeur mal
            formée est rejetée par le routeur d'URL avant même l'exécution du
            code de l'application, et la réponse est une page **HTML** `404`
            plutôt que l'enveloppe JSON `{"detail": ...}` illustrée ci-dessous.
            Le convertisseur d'UUID de la route ne correspond qu'à la forme
            canonique en minuscules — les UUID avec des valeurs hexadécimales en
            majuscules sont rejetés avec l'erreur HTML 404.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            Le document PDF généré, renvoyé directement au format binaire
            `application/pdf` — il n'y a pas d'encapsulation JSON ni
            d'indirection par URL de téléchargement. Le corps commence par les
            octets magiques `%PDF` (PDF 1.7). Enregistrez-le dans un fichier
            `.pdf` ou transmettez-le à votre appelant sous forme de flux.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` pour les sessions
                KYC, `attachment; filename=business_{sessionId}.pdf` pour les
                sessions KYB — le préfixe vous indique quel modèle de rapport a
                été généré.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: Taille totale du PDF en octets ; le corps n'est pas segmenté.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: "Échec d'authentification, d'autorisation ou de statut de session. Une clé manquante renvoie `403`\_; une clé incorrecte, révoquée ou expirée renvoie `401`. Distinguez les différents cas d'échec grâce à la chaîne `detail`\_:\n\n- `\"Authentication credentials were not provided or are invalid.\"` — aucun en-tête `x-api-key` (et aucun token `Authorization: Bearer`), ou l'identifiant fourni a échoué à l'introspection (révoqué, expiré ou malformé).\n- `\"You do not have permission to perform this action.\"` — l'identifiant est valide mais ne peut pas lire cette session\_: un token Bearer d'utilisateur de la console ne possède pas l'autorisation `read:sessions` ou ne peut pas accéder à l'application propriétaire, ou une clé API appartient à une organisation différente de celle de la session.\n- `\"You can only generate a PDF for sessions in review, declined, approved or kyc expired\"` — la session KYC existe mais n'a pas encore de statut éligible (par exemple `Not Started` ou `In Progress`). Attendez le webhook `status.updated` avant de demander le rapport.\n- `\"You can only generate a PDF for sessions in review, declined or approved\"` — même condition pour les sessions KYB.\n\nNotez que pour un `sessionId` complètement inconnu, l'endpoint résout l'application propriétaire avant de valider les identifiants\_; une session manquante renvoie donc `404` même si les identifiants d'authentification sont manquants ou non valides."
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
              examples:
                Missing or invalid credentials:
                  summary: >-
                    Aucun en-tête x-api-key, ou l'introspection de la clé a
                    échoué
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Identifiant valide ne disposant pas de read:sessions ou d'un
                    accès à l'application propriétaire
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: Session KYC toujours non commencée / en cours
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: Session KYB toujours non commencée / en cours
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            Aucune session active avec ce `sessionId` n'existe — elle n'a jamais
            été créée ou elle a été supprimée. La résolution du propriétaire
            intervient avant la validation des identifiants, ce `404` est donc
            renvoyé même pour les requêtes non authentifiées. Selon la recherche
            qui échoue, la chaîne `detail` est `"Not found."` (le cas courant)
            ou `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId ne correspond à aucune session KYC ou KYB
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: La session a été supprimée entre les recherches
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Limite de débit dépassée. La génération de PDF fait l'objet d'une
            limite dédiée de **50 requêtes par minute par identifiant
            d'authentification** (clé API, token Bearer ou IP source en cas de
            requête non authentifiée), en plus de la limite globale de 600
            GET/min. Attendez le nombre de secondes indiqué par `Retry-After`
            (également indiqué dans les en-têtes `X-RateLimit-*`), puis
            réessayez. Les rapports ne sont pas mis en cache côté serveur,
            téléchargez donc chaque rapport une seule fois et conservez le
            fichier au lieu de le récupérer à nouveau.
          headers:
            Retry-After:
              description: Secondes à attendre avant de réessayer la requête.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Nombre maximal de générations de PDF autorisées dans la fenêtre
                actuelle (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Requêtes restantes dans la fenêtre actuelle.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Horodatage Unix (en secondes) auquel la fenêtre actuelle se
                réinitialise.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: >-
                      Explication lisible par l'humain du dépassement de la
                      limite de débit.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Plus de 50 générations de PDF en une minute avec le même
                    identifiant
                  value:
                    detail: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: cURL
          source: |-
            curl --fail \
              https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/generate-pdf/ \
              -H 'x-api-key: YOUR_API_KEY' \
              --output report.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.sessions.generate_pdf(
                "11111111-2222-3333-4444-555555555555",
            )
            with open("download.pdf", "wb") as file:
                file.write(content)
        - lang: javascript
          label: Node.js
          source: >-
            import { writeFile } from "node:fs/promises";

            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const content = await
            didit.sessions.generatePdf("11111111-2222-3333-4444-555555555555");

            await writeFile("download.pdf", Buffer.from(await
            content.arrayBuffer()));
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.Sessions.GeneratePDF(ctx, \"11111111-2222-3333-4444-555555555555\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: >-
            import java.nio.file.Path;

            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            client.sessions().generatePdf("11111111-2222-3333-4444-555555555555")
                    .writeTo(Path.of("download.pdf"));
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $content =
            $didit->sessions->generatePdf('11111111-2222-3333-4444-555555555555');

            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            content =
            didit.sessions.generate_pdf("11111111-2222-3333-4444-555555555555")

            File.binwrite("download.pdf", content)
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var content = await
            client.Sessions.GeneratePdfAsync("11111111-2222-3333-4444-555555555555");

            await content.SaveToAsync("download.pdf");
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.