> ## 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 Liste des événements de session

> Lisez la chronologie d'une session Didit : étapes de l'appareil, changements de statut et routage, du plus récent au plus ancien, paginée.

Prompt de l'API permettant de lister les événements de session
Copier le prompt dans le presse-papiers

<pre>
  \`Read the event timeline of one Didit verification session through the API.

  Endpoint:
  GET [https://verification.didit.me/v3/session/\{session\_id}/events/](https://verification.didit.me/v3/session/\{session_id}/events/)

  Authentication:
  Send my Didit API key in the x-api-key header. A scoped key needs sessions: read and decisions: read.

  Goal:

  * See what happened during a session, step by step: which screens the user saw, where they stopped, which attempts failed, when the status changed and how the workflow routed the session.

  Behavior:

  * Works for user (KYC) and business (KYB) session IDs.
  * Ordered by sent\_at, newest first. sent\_at is a Unix timestamp in milliseconds.
  * Paginated with limit (default 50) and offset. The response is { count, next, previous, results }. Follow next until it is null.
  * Device-reported event types: LINK\_OPENED, STEP\_RENDERED, BUTTON\_CLICKED, FORM\_SUBMITTED, FILE\_UPLOADED, ATTEMPT\_FAILED, LOG. Server-recorded types include SESSION\_CREATED, SESSION\_STATUS\_CHANGED (details.old\_status, details.current\_status), FEATURE\_STEP\_CHANGED, WORKFLOW\_BRANCH\_EVALUATED and WORKFLOW\_STATUS\_NODE\_REACHED.
  * Events are stored asynchronously, so a new event can take a few seconds to appear.
  * file\_url is a short-lived presigned link; a scoped key without media: read receives it as null.

  Example call:
  curl -X GET "[https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50](https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50)" \
  -H "x-api-key: YOUR\_API\_KEY"

  What to read from the response:

  * results\[].event\_type, feature\_step (OCR, LIVENESS, FACE\_MATCH, ...) and step (the screen, for example DOCUMENT\_CAPTURE\_FRONT).
  * results\[].details: event-specific data; the keys vary by event\_type.
  * results\[].ip\_address, user\_agent and device\_info for device-reported events.
  * count, next and previous for pagination.

  Failure modes:

  * 400: limit or offset above 1,000,000.
  * 401: the API key has expired.
  * 403: missing key (a wrong, revoked or expired key gets 401), a key of another application, a scoped key without the permissions above, or a request from outside the key's IP allowlist.
  * 404: the session does not exist, was deleted, or is outside a scoped key's workflow or status limits.

  Side effects: none. This is a pure read.

  For the full integration shape, see /integration/integration-prompt.\`
</pre>

Coller dans

Les événements de routage du workflow (`WORKFLOW_BRANCH_EVALUATED`, `WORKFLOW_STATUS_NODE_REACHED`) et leurs `details` sont décrits dans [Récupérer une session](https://docs.didit.me/fr/sessions-api/retrieve-session.md), qui peut également renvoyer la chronologie d'une session de Vérification des utilisateurs (KYC) dans sa décision avec `?include=events`.


## OpenAPI

````yaml fr/openapi-25.json GET /v3/session/{sessionId}/events/
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}/events/:
    get:
      tags:
        - Sessions
      summary: Lister les événements de session
      description: >-
        Consultez la chronologie des événements d'une session de vérification,
        du plus récent au plus ancien selon `sent_at` : les écrans vus par
        l'utilisateur, les boutons et les téléversements, les tentatives
        échouées, les changements de statut et d'étapes de fonctionnalités,
        ainsi que la trace de routage du workflow. Fonctionne pour les
        identifiants de session de Vérification des utilisateurs (KYC) et de
        Vérification d'entreprise (KYB). Les événements étant stockés de manière
        asynchrone, un nouvel événement peut mettre quelques secondes à
        apparaître. Les résultats sont paginés avec `limit` et `offset` ; suivez
        `next` jusqu'à ce qu'il soit `null`. Une clé API restreinte nécessite
        `sessions: read` et `decisions: read`, et sans `media: read`, elle
        reçoit `file_url` avec la valeur `null`. Les événements de routage sont
        décrits dans [Retrieve
        session](https://docs.didit.me/fr/sessions-api/retrieve-session).
      operationId: get_v3_session_events
      parameters:
        - name: sessionId
          in: path
          required: true
          description: >-
            UUID de la session de vérification (le `session_id` renvoyé par
            `POST /v3/session/`). Accepte les identifiants de session de
            Vérification des utilisateurs (KYC) et de Vérification d'entreprise
            (KYB) : le serveur résout l'identifiant pour les deux types de
            session. Doit être un UUID bien formé ; une valeur malformée ne
            correspond pas à la route et renvoie une erreur HTML `404`.
          schema:
            type: string
            format: uuid
            example: 11111111-2222-3333-4444-555555555555
        - name: limit
          in: query
          required: false
          description: "Nombre maximal d'événements par page. Vaut par défaut 50. Une valeur inférieure à 1 ou non numérique revient à 50\_; une valeur supérieure à 1,000,000 renvoie `400`."
          schema:
            type: integer
            default: 50
            minimum: 1
            maximum: 1000000
            example: 50
        - name: offset
          in: query
          required: false
          description: >-
            Nombre de résultats à ignorer avant le premier renvoyé. La valeur
            par défaut est 0 ; une valeur négative ou non numérique revient à 0,
            une valeur supérieure à 1,000,000 renvoie `400`. Privilégiez
            l'utilisation des URL `next` et `previous`.
          schema:
            type: integer
            default: 0
            minimum: 0
            maximum: 1000000
            example: 0
        - name: ordering
          in: query
          required: false
          description: >-
            Remplacement de tri optionnel. L'ordre par défaut est `-sent_at`.
            Transmettez le nom d'un champ de résultat (par exemple `sent_at`,
            `created_at`, `event_type`, `feature_step` ou `step`) pour un tri
            croissant, préfixez-le par `-` pour un tri décroissant, et séparez
            plusieurs champs par des virgules. Les champs inconnus sont ignorés.
          schema:
            type: string
            example: sent_at
      responses:
        '200':
          description: Une page d'événements de la session, du plus récent au plus ancien.
          content:
            application/json:
              schema:
                type: object
                required:
                  - count
                  - next
                  - previous
                  - results
                properties:
                  count:
                    type: integer
                    description: Nombre total d'événements de la session.
                  next:
                    type: string
                    format: uri
                    nullable: true
                    description: URL de la page suivante, ou `null` sur la dernière page.
                  previous:
                    type: string
                    format: uri
                    nullable: true
                    description: URL de la page précédente, ou `null` sur la première page.
                  results:
                    type: array
                    items:
                      $ref: '#/components/schemas/SessionEvent'
              examples:
                Completed session:
                  value:
                    count: 3
                    next: null
                    previous: null
                    results:
                      - uuid: aaaaaaaa-1111-2222-3333-444444444444
                        event_type: SESSION_STATUS_CHANGED
                        created_at: '2026-09-14T10:02:13.904512Z'
                        component: null
                        feature_step: null
                        step: null
                        details:
                          old_status: In Progress
                          current_status: Approved
                        ip_address: null
                        user_agent: null
                        device_info: null
                        file_url: null
                        sent_at: 1789380131482
                      - uuid: bbbbbbbb-1111-2222-3333-444444444444
                        event_type: FEATURE_STEP_CHANGED
                        created_at: '2026-09-14T10:01:49.210377Z'
                        component: null
                        feature_step: null
                        step: null
                        details:
                          old_feature_step: OCR
                          current_feature_step: LIVENESS
                        ip_address: null
                        user_agent: null
                        device_info: null
                        file_url: null
                        sent_at: 1789380107103
                      - uuid: cccccccc-1111-2222-3333-444444444444
                        event_type: STEP_RENDERED
                        created_at: '2026-09-14T10:01:00.581930Z'
                        component: DocumentCapture
                        feature_step: OCR
                        step: DOCUMENT_CAPTURE_FRONT
                        details: {}
                        ip_address: 203.0.113.24
                        user_agent: >-
                          Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X)
                          AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5
                          Mobile/15E148 Safari/604.1
                        device_info:
                          device_model: iPhone
                        file_url: null
                        sent_at: 1789380058776
        '400':
          description: >-
            `limit` ou `offset` est supérieur à 1 000 000. Le corps est un
            tableau JSON contenant un seul message.
          content:
            application/json:
              examples:
                Limit too large:
                  summary: limit=2000000
                  value:
                    - limit must not exceed 1000000.
                Offset too large:
                  summary: offset=2000000
                  value:
                    - offset must not exceed 1000000.
              schema:
                type: array
                items:
                  type: string
        '401':
          description: >-
            La clé API restreinte a expiré. C'est le seul cas qui renvoie `401`
            : une clé manquante, invalide ou révoquée renvoie `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Expired key:
                  summary: La date d'expiration de la clé est dépassée
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            Échec d'authentification ou d'autorisation. Une clé manquante
            renvoie `403`, tout comme la clé d'une autre application, une clé
            restreinte ne disposant pas de l'autorisation requise par cet
            endpoint, ou une requête provenant de l'extérieur de la liste
            d'adresses IP autorisées de la clé ; une clé incorrecte, révoquée ou
            expirée renvoie `401`. Distinguez-les grâce au champ `detail`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Missing or invalid credentials:
                  summary: Aucun en-tête x-api-key, ou la validation de la clé a échoué
                  value:
                    detail: >-
                      Authentication credentials were not provided or are
                      invalid.
                Other application:
                  summary: >-
                    Une clé valide qui appartient à une application différente
                    de la session
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without sessions read:
                  summary: 'La clé restreinte ne dispose pas de sessions: read'
                  value:
                    detail: This API key has no read access to sessions.
                Scoped key without decisions read:
                  summary: 'La clé restreinte ne dispose pas de decisions: read'
                  value:
                    detail: This API key has no read access to decisions.
                IP not allowed:
                  summary: >-
                    Requête provenant de l'extérieur de la liste d'adresses IP
                    autorisées de la clé
                  value:
                    detail: This API key can't be used from this IP address.
        '404':
          description: >-
            La session n'existe pas, a été supprimée, ou se trouve en dehors des
            limites de workflow ou réservées aux sessions approuvées d'une clé
            restreinte. La recherche de session s'exécute avant la vérification
            des identifiants, donc un `sessionId` inconnu renvoie `404` même
            sans clé valide.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Unknown session:
                  summary: Aucune session avec cet ID n'existe, ou elle a été supprimée
                  value:
                    detail: Not found.
                Outside key limits:
                  summary: >-
                    La session se trouve en dehors des limites de workflow ou
                    réservées aux sessions approuvées d'une clé restreinte
                  value:
                    detail: Session not found.
        '429':
          description: >-
            Limite de débit dépassée : 600 requêtes GET par minute par clé API.
            Attendez `Retry-After` secondes avant de réessayer ; les en-têtes
            `X-RateLimit-*` indiquent le quota.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Message d'erreur lisible par l'humain.
              examples:
                Rate limited:
                  summary: Budget épuisé pour la minute en cours
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
          headers:
            Retry-After:
              description: Secondes à attendre avant de réessayer.
              schema:
                type: integer
                minimum: 1
                example: 30
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X GET
            'https://verification.didit.me/v3/session/11111111-2222-3333-4444-555555555555/events/?limit=50'
            \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            for item in client.sessions.list_events(
                "11111111-2222-3333-4444-555555555555",
            ):
                print(item)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            for await (const item of
            didit.sessions.listEvents("11111111-2222-3333-4444-555555555555")) {
              console.log(item);
            }
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\niter := client.Sessions.ListEventsAutoPaging(ctx, \"11111111-2222-3333-4444-555555555555\", didit.SessionsListEventsParams{})\nfor iter.Next() {\n\tfmt.Printf(\"%+v\\n\", iter.Current())\n}\nif err := iter.Err(); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            for (var item :
            client.sessions().listEvents("11111111-2222-3333-4444-555555555555"))
            {
                System.out.println(item);
            }
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            foreach
            ($didit->sessions->listEvents('11111111-2222-3333-4444-555555555555')
            as $item) {
                print_r($item->toArray());
            }
        - lang: ruby
          label: Ruby
          source: >-
            require "didit"


            # Reads DIDIT_API_KEY.

            didit = Didit::Client.new


            didit.sessions.list_events("11111111-2222-3333-4444-555555555555").auto_paging_each
            do |item|
              puts item.to_h
            end
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            await foreach (var item in await
            client.Sessions.ListEventsAsync("11111111-2222-3333-4444-555555555555"))

            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }
components:
  schemas:
    SessionEvent:
      type: object
      description: >-
        Une entrée dans la chronologie des événements d'une session de
        vérification.
      required:
        - uuid
        - event_type
        - created_at
        - component
        - feature_step
        - step
        - details
        - ip_address
        - user_agent
        - device_info
        - file_url
        - sent_at
      properties:
        uuid:
          type: string
          format: uuid
          description: Identifiant de l'événement.
        event_type:
          type: string
          enum:
            - SESSION_CREATED
            - SESSION_COMPLETED
            - SESSION_STATUS_CHANGED
            - LINK_OPENED
            - FORM_SUBMITTED
            - BUTTON_CLICKED
            - FILE_UPLOADED
            - ATTEMPT_FAILED
            - FEATURE_STEP_CHANGED
            - STEP_RENDERED
            - NOTE_ADDED
            - MANUAL_REVIEW_STARTED
            - WORKFLOW_BRANCH_EVALUATED
            - WORKFLOW_STATUS_NODE_REACHED
            - LOG
          description: >-
            Ce qui s'est passé. Signalé par l'appareil pendant le flux hébergé
            ou le SDK : `LINK_OPENED`, `STEP_RENDERED`, `BUTTON_CLICKED`,
            `FORM_SUBMITTED`, `FILE_UPLOADED`, `ATTEMPT_FAILED` et `LOG`
            (débogage). Enregistré par le serveur : `SESSION_CREATED`,
            `SESSION_STATUS_CHANGED` (`details.old_status`,
            `details.current_status`), `FEATURE_STEP_CHANGED`
            (`details.old_feature_step`, `details.current_feature_step`),
            `WORKFLOW_BRANCH_EVALUATED` et `WORKFLOW_STATUS_NODE_REACHED` (la
            trace de routage du workflow). `SESSION_COMPLETED`, `NOTE_ADDED` et
            `MANUAL_REVIEW_STARTED` peuvent apparaître sur les sessions plus
            anciennes.
        created_at:
          type: string
          format: date-time
          description: >-
            Date et heure auxquelles Didit a stocké l'événement. Les événements
            sont stockés de manière asynchrone, quelques secondes après
            `sent_at`.
        component:
          type: string
          nullable: true
          description: >-
            Composant d'interface utilisateur ayant signalé l'événement
            (événements de l'appareil uniquement).
        feature_step:
          type: string
          nullable: true
          enum:
            - OCR
            - OCR_BACK
            - NFC
            - AML
            - FACE
            - LIVENESS
            - FACE_MATCH
            - IP_ANALYSIS
            - AGE_ESTIMATION
            - PROOF_OF_ADDRESS
            - PHONE_VERIFICATION
            - EMAIL_VERIFICATION
            - FACE_SEARCH
            - DATABASE_VALIDATION
            - QUESTIONNAIRE
            - KYB_REGISTRY
            - KYB_DOCUMENTS
            - KYB_KEY_PEOPLE
            - DOCUMENT_AI
            - GEOLOCATION
            - null
          description: >-
            Fonctionnalité de vérification sur laquelle se trouvait la session
            lorsque l'événement s'est produit.
        step:
          type: string
          nullable: true
          description: >-
            Écran au sein de la fonctionnalité, par exemple
            `DOCUMENT_CAPTURE_FRONT` ou `FACE_PASSIVE_LIVENESS`.
        details:
          type: object
          nullable: true
          additionalProperties: true
          description: >-
            Données spécifiques à l'événement. Les clés dépendent de
            `event_type`.
        ip_address:
          type: string
          nullable: true
          description: >-
            Adresse depuis laquelle l'appareil a signalé l'événement. `null`
            pour les événements enregistrés côté serveur.
        user_agent:
          type: string
          nullable: true
          description: >-
            Agent utilisateur de l'appareil. `null` pour les événements
            enregistrés par le serveur.
        device_info:
          type: object
          nullable: true
          additionalProperties: true
          description: Détails de l'appareil signalés par le SDK ou le navigateur.
        file_url:
          type: string
          format: uri
          nullable: true
          description: >-
            Lien pré-signé de courte durée vers un fichier joint à l'événement
            (par exemple une image capturée). `null` lorsqu'il n'y en a pas, et
            systématiquement `null` pour une clé API restreinte sans `media:
            read`.
        sent_at:
          type: integer
          format: int64
          description: >-
            Date et heure de l'événement, sous forme de timestamp Unix en
            millisecondes. Les résultats sont triés selon cette valeur.
  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.