> ## 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.

# PDF-Bericht API: KYC- & KYB-Compliance-Berichte

> Mit Didit KYC- und KYB-Sitzungen als White-Label-PDF-Compliance-Bericht herunterladen: audit-fähig, Abrechnung pro Nutzung.



Prompt zur PDF-Generierung
        Prompt in die Zwischenablage kopieren



      
      

\<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>



      
      

Einfügen in

## KYC- und KYB-UnterstützungUnterstützt sowohl Sitzungen der **Benutzerverifizierung (KYC)** als auch der **Unternehmensverifizierung (KYB)**. Didit wählt automatisch die passende PDF-Vorlage aus:- Sitzung der **Benutzerverifizierung (KYC)** → Bericht mit den Abschnitten Ausweisverifizierung, Liveness-Erkennung, Gesichtsabgleich, AML und POA.
- Sitzung der **Unternehmensverifizierung (KYB)** → Bericht mit den Abschnitten Unternehmensregister, Schlüsselpersonen (UBOs/Organmitglieder), Dokumente, AML, Fragebogen, Telefon, E-Mail und IP-Analyse, sofern diese Funktionen Teil des Workflows sind.Beide nutzen dieselbe PDF-Erstellungspipeline und unterstützen die White-Label-Anpassung (Logo, URL der Datenschutzerklärung).## Dateinamenskonvention| Art | Dateiname |
| - | - |
| Benutzer | `session_<session_id>.pdf` |
| Unternehmen | `business_<session_id>.pdf` |Zurückgegeben über den Header `Content-Disposition: attachment; filename=...`.## StatusanforderungUm ein PDF zu erzeugen, muss die Sitzung den Status `APPROVED`, `DECLINED` oder `IN_REVIEW` haben. Laufende oder noch nicht gestartete Sitzungen geben `403` zurück.## Beispiele> [tab] PDF der Benutzerverifizierung (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 der Unternehmensverifizierung (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
> ```## White-LabelWenn für die Anwendung die White-Label-Anpassung aktiviert ist, verwendet das PDF Ihr Logo und Ihre URL zur Datenschutzerklärung. Konfigurieren Sie dies unter *Console → Customization*.## BerechtigungErforderlich ist `read:sessions`. Für beide Arten gilt derselbe Scope.## Verwandte Seiten- [Sitzungsübersicht](https://docs.didit.me/de/sessions-api/overview.md)
- [Sitzung abrufen](https://docs.didit.me/de/sessions-api/retrieve-session.md) — JSON-Version derselben Entscheidung
- [Verlaufs-PDF des Benutzers herunterladen](https://docs.didit.me/de/management-api/users/generate-pdf.md) — alle Sitzungen einer Person, für die ein Bericht erstellt werden kann, in einer einzigen Datei
- [KYB-Antwortschema](https://docs.didit.me/de/business-verification/response-schema.md) — Felder, die in Unternehmens-PDFs enthalten sind


## OpenAPI

````yaml de/openapi-25.json GET /v3/session/{sessionId}/generate-pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/session/{sessionId}/generate-pdf/:
    get:
      tags:
        - Sessions
      summary: Einen PDF-Bericht für eine Verifizierungssitzung herunterladen
      description: >-
        Rendern und Herunterladen eines compliance-konformen PDF-Berichts für
        eine abgeschlossene Verifizierungssitzung. Derselbe Pfad bedient sowohl
        Sitzungen der Benutzerverifizierung (KYC) als auch der
        Unternehmensverifizierung (KYB) – der Server gleicht die `sessionId` mit
        beiden Sitzungstypen ab und wählt die passende Berichtsvorlage aus.


        **Gültige Status.** Die Sitzung muss bereits einen finalen oder
        prüfbaren Status aufweisen:


        - KYC-Sitzungen: `Approved`, `Declined`, `In Review` oder `Kyc Expired`.

        - KYB-Sitzungen: `Approved`, `Declined` oder `In Review`.


        Jeder andere Status (`Not Started`, `In Progress`, `Expired`,
        `Abandoned`, …) gibt `403` mit einem erläuternden `detail`-String zurück
        – siehe die Antwort `403` unten.


        **Inhalt des Berichts.** Das PDF spiegelt die Sitzungsansicht der
        Konsole zum Zeitpunkt der Anfrage wider:


        - **KYC** – zusammengefasster Sitzungsstatus, die Warnungsliste und ein
        Abschnitt pro ausgeführter Funktion: Ausweisverifizierung
        (Dokumentbilder plus extrahierte Felder), NFC, Liveness,
        Gesichtsabgleich, E-Mail-Verifizierung, Telefonverifizierung,
        Adressnachweis, Fragebogen-Antworten, Datenbankvalidierung,
        AML-Screening und IP-Analyse – gefolgt von Sitzungs-Tags,
        Prüfungsaktivitäten in der Konsole (Kommentare und Statusänderungen) und
        der Sitzungs-Ereignis-Timeline.

        - **KYB** – Registerprüfungen (Unternehmensdaten), AML-Screenings,
        Verifizierungen von Unternehmensdokumenten, Prüfungen von
        Schlüsselpersonen, Fragebogen-Antworten,
        Telefon-/E-Mail-Verifizierungen, IP-Analysen und die
        Sitzungs-Ereignis-Timeline, gefolgt von Tags und Prüfungsaktivitäten.


        **Branding.** Wenn Ihre Anwendung über eine White-Label-Anpassung
        verfügt, wird der Bericht mit Ihrem Logo gerendert und verlinkt auf die
        URL Ihrer Datenschutzerklärung; andernfalls trägt er das Didit-Branding.
        Berichte werden auf Englisch gerendert – es gibt keinen Sprachparameter.


        **Kein Caching.** Jeder Aufruf rendert das PDF aus den aktuellen
        Sitzungsdaten neu, sodass ein nach einer manuellen Prüfung erstellter
        Bericht die Entscheidung des Prüfers widerspiegelt. Zwei Aufrufe für
        dieselbe Sitzung können Byte-unterschiedliche Dateien erzeugen –
        archivieren Sie die heruntergeladene Datei, wenn Sie eine
        unveränderliche Kopie benötigen.


        **Latenz.** Beim Rendern wird jedes gespeicherte Bild (Dokumentseiten,
        Selfies, zusätzliche Dateien) vor dem Zusammensetzen des PDFs
        heruntergeladen, sodass medienintensive Sitzungen mehrere Sekunden
        dauern können. Verwenden Sie ein großzügiges Client-Read-Timeout (60 s
        empfohlen) und streamen Sie den Body auf die Festplatte.


        **Nachgestellter Schrägstrich (Trailing Slash).** Die kanonische Route
        endet mit einem nachgestellten Schrägstrich (`…/generate-pdf/`). Eine
        Anfrage ohne diesen wird direkt mit derselben Antwort bedient – es gibt
        keine `301`-Weiterleitung, sodass kein Client Weiterleitungen folgen
        muss und `curl` kein `-L` benötigt. Verwenden Sie die URL mit
        Schrägstrich wie in den Beispielen.


        Wenn Sie die zugrunde liegenden Daten als JSON anstelle eines
        gerenderten Berichts benötigen, verwenden Sie `GET
        /v3/session/{sessionId}/decision/`. Für alle berichtsfähigen Sitzungen
        eines Benutzers in einem einzigen Dokument verwenden Sie `GET
        /v3/users/{vendor_data}/generate-pdf/`.
      operationId: get_v3_session_generate_pdf
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID der zu rendernden Sitzung der Benutzerverifizierung (KYC) oder
            Unternehmensverifizierung (KYB) — die von `POST /v3/session/`
            zurückgegebene `session_id`. Derselbe Pfad funktioniert für beide
            Sitzungsarten; verwenden Sie den Dateinamen im
            `Content-Disposition`-Header der Antwort, um festzustellen, welchen
            Berichtstyp Sie erhalten haben.


            **Muss eine wohlgeformte UUID in Kleinbuchstaben sein.** Die Route
            stimmt nur mit gültigen UUIDs überein, sodass ein fehlerhafter Wert
            vom URL-Router abgelehnt wird, bevor jeglicher Anwendungscode
            ausgeführt wird, und die Antwort eine `404`-**HTML**-Seite anstelle
            der unten gezeigten JSON-Envelope `{"detail": ...}` ist. Der
            UUID-Konverter der Route stimmt nur mit der kanonischen
            Kleinschreibung überein — UUIDs mit Hexadezimal-Großbuchstaben
            werden mit dem HTML-404-Fehler abgelehnt.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
      responses:
        '200':
          description: >-
            Das gerenderte PDF-Dokument, direkt als binäres `application/pdf`
            zurückgegeben — es gibt keinen JSON-Wrapper und keine
            Download-URL-Umleitung. Der Body beginnt mit den Magic Bytes `%PDF`
            (PDF 1.7). Speichern Sie es in einer `.pdf`-Datei oder leiten Sie es
            per Stream an Ihren Aufrufer weiter.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=session_{sessionId}.pdf` für
                KYC-Sitzungen, `attachment; filename=business_{sessionId}.pdf`
                für KYB-Sitzungen — das Präfix gibt an, welche Berichtsvorlage
                gerendert wurde.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=session_11111111-2222-3333-4444-555555555555.pdf
            Content-Length:
              description: >-
                Gesamtgröße des PDFs in Bytes; der Nachrichtentext ist nicht in
                Chunks aufgeteilt.
              schema:
                type: integer
                example: 25191
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '403':
          description: >-
            Fehler bei Authentifizierung, Autorisierung oder Sitzungsstatus. Ein
            fehlender Schlüssel gibt `403` zurück; ein falscher, widerrufener
            oder abgelaufener Schlüssel gibt `401` zurück. Unterscheiden Sie die
            Fehlertypen anhand des `detail`-Strings:


            - `"Authentication credentials were not provided or are invalid."` —
            Kein `x-api-key`-Header (und kein `Authorization: Bearer`-Token),
            oder die übergebenen Anmeldedaten haben die Introspektion nicht
            bestanden (widerrufen, abgelaufen oder fehlerhaft formatiert).

            - `"You do not have permission to perform this action."` — Die
            Anmeldedaten sind gültig, können diese Sitzung jedoch nicht lesen:
            Einem Bearer-Token eines Console-Benutzers fehlt die Berechtigung
            `read:sessions` oder er kann nicht auf die zuständige Anwendung
            zugreifen, oder ein API-Schlüssel gehört zu einer anderen
            Organisation als die Sitzung.

            - `"You can only generate a PDF for sessions in review, declined,
            approved or kyc expired"` — Die KYC-Sitzung existiert, befindet sich
            jedoch noch nicht in einem geeigneten Status (zum Beispiel `Not
            Started` oder `In Progress`). Warten Sie auf den Webhook
            `status.updated`, bevor Sie den Bericht anfordern.

            - `"You can only generate a PDF for sessions in review, declined or
            approved"` — Dieselbe Bedingung für KYB-Sitzungen.


            Beachten Sie, dass der Endpoint bei einer völlig unbekannten
            `sessionId` die zuständige Anwendung auflöst, bevor die Anmeldedaten
            validiert werden; daher gibt eine fehlende Sitzung selbst dann `404`
            zurück, wenn die Anmeldedaten fehlen oder ungültig sind.
          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: >-
                    Kein x-api-key-Header vorhanden oder die
                    Schlüssel-Introspektion ist fehlgeschlagen
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Insufficient permissions:
                  summary: >-
                    Gültige Anmeldedaten, denen read:sessions oder der Zugriff
                    auf die zugehörige Anwendung fehlt
                  value:
                    detail: You do not have permission to perform this action.
                KYC session not finished:
                  summary: KYC-Sitzung noch nicht gestartet / in Bearbeitung
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined, approved or kyc expired
                KYB session not finished:
                  summary: KYB-Sitzung noch nicht gestartet / in Bearbeitung
                  value:
                    detail: >-
                      You can only generate a PDF for sessions in review,
                      declined or approved
        '404':
          description: >-
            Es existiert keine aktive Sitzung mit dieser `sessionId` – sie wurde
            nie erstellt oder bereits gelöscht. Die Eigentümerauflösung erfolgt
            vor der Validierung der Anmeldedaten, daher wird dieser `404` auch
            bei nicht authentifizierten Anfragen zurückgegeben. Je nachdem,
            welche Abfrage fehlschlägt, lautet der `detail`-String `"Not
            found."` (der Regelfall) oder `"Session not found."`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    example: Not found.
              examples:
                Unknown session:
                  summary: sessionId stimmt mit keiner KYC- oder KYB-Sitzung überein
                  value:
                    detail: Not found.
                Recently deleted session:
                  summary: Sitzung wurde zwischen den Abfragen gelöscht
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Rate-Limit überschritten. Die PDF-Generierung hat zusätzlich zum
            globalen GET-Limit von 600/Min ein dediziertes Limit von **50
            Anfragen pro Minute pro Anmeldeinformation** (API-Schlüssel,
            Bearer-Token oder Quell-IP, wenn nicht authentifiziert). Warten Sie
            `Retry-After` Sekunden (wird auch in den `X-RateLimit-*`-Headern
            widergespiegelt) und versuchen Sie es dann erneut. Berichte werden
            serverseitig nicht zwischengespeichert; laden Sie daher jeden
            Bericht einmal herunter und speichern Sie die Datei, anstatt sie
            erneut abzurufen.
          headers:
            Retry-After:
              description: >-
                Anzahl der Sekunden, die vor einer erneuten Anfrage gewartet
                werden muss.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: >-
                Maximale Anzahl an PDF-Generierungen, die im aktuellen
                Zeitfenster zulässig sind (50).
              schema:
                type: integer
                example: 50
            X-RateLimit-Remaining:
              description: Im aktuellen Zeitfenster verbleibende Anfragen.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: >-
                Unix-Zeitstempel (Sekunden), zu dem das aktuelle Zeitfenster
                zurückgesetzt wird.
              schema:
                type: integer
                example: 1750000000
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Lesbare Erklärung der Rate-Limit-Überschreitung.
                    example: >-
                      Session PDF generation rate limit exceeded. You can make
                      up to 50 requests per minute.
              examples:
                Throttled:
                  summary: >-
                    Mehr als 50 PDF-Generierungen in einer Minute mit denselben
                    Zugangsdaten
                  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: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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