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

# Configuración de webhooks: API para consultarla

> Consulta con la API de Didit la configuración de webhooks: URL y secreto heredados, destinos, eventos, retención y hosts de retorno de wallet.



Prompt de la API para obtener la configuración de webhook
        Copiar el prompt al portapapeles



      
      

\<pre>

\`Read my Didit application's webhook configuration through the Management API.

Endpoint:
GET https://verification.didit.me/v3/webhook/

Authentication:
Use the x-api-key header with my Didit API key. A scoped API key needs webhooks: read.

Goal:
\- Get every setting that controls how Didit sends webhooks for my application, plus the data-retention policy and the Digital ID wallet return hosts, in one call. Use it to audit the setup or to show the current configuration in a back office.

Behavior:
\- Didit delivers webhooks to webhook destinations (/v3/webhook/destinations/). Each destination has its own url, webhook_version, secret_shared_key and subscribed_events.
\- webhook_url, webhook_version and secret_shared_key at the top level are the application-level (legacy) webhook. Didit uses them only while the application has no enabled destination, and then only for status.updated and data.updated.
\- Every create, update or delete of a destination sets webhook_url to the URL of the oldest enabled destination, or null when none is enabled.
\- API-key callers always receive the application secret and every destination secret in full.

Example call:
curl -X GET "https://verification.didit.me/v3/webhook/" \
-H "x-api-key: YOUR_API_KEY"

What to read from the response:
\- endpoints: every destination, oldest first, with uuid, label, url, enabled, webhook_version, secret_shared_key and subscribed_events. Verify each webhook with the secret of the destination it was sent to.
\- available_events: every event type you can subscribe a destination to ({ value, label }).
\- webhook_url, webhook_version, secret_shared_key: the legacy webhook, only relevant when no destination is enabled.
\- data_retention_months (null means no automatic deletion), face_retention_policy and face_retention_days: the retention policy.
\- allowed_return_hosts: hosts a Digital ID wallet verification may send the person back to.
\- allowed_domains: web origins the hosted verification flow may be embedded in and may send the user back to; empty means no restriction.
\- capture_method: MOBILE or MOBILE_AND_DESKTOP. A legacy setting with no effect; capture options are set per workflow.

Failure modes:
\- 401: { "detail": "This API key has expired." }
\- 403: { "detail": "You do not have permission to perform this action." } for a missing key (a wrong, revoked or expired key gets 401); { "detail": "This API key has no read access to webhooks." } for a scoped key without webhooks: read.
\- 429: more than 600 GET requests per minute with this key; wait for Retry-After.

Side effects: none. This is a pure read, and the response contains signing secrets: never log it.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

Pegar en

Este endpoint devuelve el webhook a nivel de aplicación, el que se usaba antes de que existieran los destinos, junto con la lista de destinos. Didit entrega los webhooks a tus [destinos de webhook](https://docs.didit.me/es/management-api/webhook/list-destinations.md), cada uno firmado con su propio `secret_shared_key`. Los campos de nivel superior `webhook_url`, `webhook_version` y `secret_shared_key` solo se usan mientras no haya ningún destino habilitado, y en ese caso únicamente para `status.updated` y `data.updated`.> [!WARNING]
>
> La respuesta contiene todos los secretos de firma de tu aplicación. No la incluyas en registros ni en código del lado del cliente.Para cambiar esta configuración, usa [Actualizar configuración de webhook](https://docs.didit.me/es/management-api/webhook/update-config.md). Para la verificación de firma y los payloads, consulta la [guía de webhooks](https://docs.didit.me/es/integration/webhooks.md). Para los campos de retención, consulta [Retención de datos](https://docs.didit.me/es/console/data-retention.md).


## OpenAPI

````yaml es/openapi-25.json GET /v3/webhook/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/webhook/:
    get:
      tags:
        - Webhook
      summary: Obtener la configuración de webhooks
      description: >-
        Devuelve la configuración de webhooks de la aplicación en una sola
        llamada: cada [destino de
        webhook](https://docs.didit.me/es/management-api/webhook/list-destinations)
        con su secreto de firma, los tipos de evento a los que se puede
        suscribir un destino, la URL, la versión y el secreto del webhook a
        nivel de aplicación (heredado), la política de retención de datos y de
        plantillas biométricas, y los hosts de retorno de la wallet de Digital
        ID. Didit entrega los webhooks a los destinos, cada uno firmado con su
        propio `secret_shared_key`; los campos de nivel superior `webhook_url`,
        `webhook_version` y `secret_shared_key` solo se usan mientras no haya
        ningún destino habilitado, y en ese caso solo para `status.updated` y
        `data.updated`. La respuesta contiene secretos de firma, así que
        mantenla fuera de los registros y del código del lado del cliente. Una
        clave de API con permisos limitados necesita `webhooks: read`.
      operationId: get_webhook_config
      parameters: []
      responses:
        '200':
          description: La configuración del webhook.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookConfig'
              examples:
                One destination:
                  value:
                    webhook_url: https://yourapp.com/webhooks/didit
                    webhook_version: v3
                    secret_shared_key: dGhpcy1pcy10aGUtYXBwLWxldmVsLXNlY3JldC0wMDA
                    capture_method: MOBILE
                    data_retention_months: 24
                    face_retention_policy: delete_with_session
                    face_retention_days: null
                    biometric_consent_mode: auto
                    available_events:
                      - value: status.updated
                        label: Session status updated
                      - value: data.updated
                        label: Session data updated
                      - value: user.status.updated
                        label: User status updated
                      - value: user.data.updated
                        label: User data updated
                      - value: business.status.updated
                        label: Business status updated
                      - value: business.data.updated
                        label: Business data updated
                      - value: activity.created
                        label: Activity created
                      - value: transaction.created
                        label: Transaction created
                      - value: transaction.status.updated
                        label: Transaction status updated
                      - value: travel_rule.status.updated
                        label: Travel Rule Status Updated
                      - value: workflow.compliance_changed
                        label: Workflow Compliance Changed
                    allowed_return_hosts:
                      - shop.example.com
                    endpoints:
                      - uuid: 11111111-2222-3333-4444-555555555555
                        label: Production session webhooks
                        url: https://yourapp.com/webhooks/didit
                        enabled: true
                        webhook_version: v3
                        secret_shared_key: dGhpcy1pcy1hbi1leGFtcGxlLXNlY3JldC0wMDAwMDA
                        subscribed_events:
                          - status.updated
                          - data.updated
                        created_at: '2026-01-04T08:00:00.000000Z'
                        updated_at: '2026-04-22T14:09:11.523671Z'
        '401':
          description: >-
            La clave de API ha expirado: se creó con una fecha de caducidad que
            ya pasó. Una clave incorrecta o revocada también recibe `401`; si
            falta la clave, se recibe `403`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            La solicitud no está permitida. Si falta `x-api-key`, o no es válida
            o está revocada, se recibe `You do not have permission to perform
            this action.` Una clave con alcance limitado sin el acceso que
            necesita este endpoint recibe un mensaje que indica el acceso que
            falta, y una clave usada desde fuera de su lista de IP permitidas
            recibe `This API key can't be used from this IP address.`
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Missing or invalid key:
                  value:
                    detail: You do not have permission to perform this action.
                Scoped key without webhooks read:
                  value:
                    detail: This API key has no read access to webhooks.
                Outside the IP allowlist:
                  value:
                    detail: This API key can't be used from this IP address.
        '429':
          description: >-
            Límite de solicitudes superado: más de 600 solicitudes GET en la
            ventana actual de un minuto para esta clave de API. Espera
            `Retry-After` segundos antes de reintentar.
          headers:
            Retry-After:
              description: Segundos que hay que esperar antes de reintentar.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: Solicitudes permitidas en la ventana de un minuto (600).
              schema:
                type: integer
                example: 600
            X-RateLimit-Remaining:
              description: Solicitudes restantes en la ventana actual.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Tiempo Unix (segundos) en que se restablece la ventana actual.
              schema:
                type: integer
                example: 1792056120
            X-RateLimit-Scope:
              description: Nombre del presupuesto que se superó.
              schema:
                type: string
                example: generic-get
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Mensaje de error legible.
              examples:
                Throttled:
                  value:
                    detail: >-
                      GET request rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X GET 'https://verification.didit.me/v3/webhook/' \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.webhooks.retrieve_config()
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.webhooks.retrieveConfig();
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Webhooks.RetrieveConfig(ctx)\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.webhooks().retrieveConfig();
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->webhooks->retrieveConfig();
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.webhooks.retrieve_config
            puts result.to_h
        - lang: csharp
          label: .NET
          source: |-
            using System;
            using System.Text.Json;
            using Didit;

            // Reads DIDIT_API_KEY.
            using var client = new DiditClient();

            var result = await client.Webhooks.RetrieveConfigAsync();
            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    WebhookConfig:
      type: object
      description: >-
        Configuración de webhooks a nivel de aplicación, política de retención y
        hosts de retorno de la wallet de Digital ID, con todos los destinos de
        webhook.
      required:
        - webhook_url
        - webhook_version
        - secret_shared_key
        - capture_method
        - data_retention_months
        - face_retention_policy
        - face_retention_days
        - available_events
        - allowed_return_hosts
        - endpoints
      properties:
        webhook_url:
          type: string
          format: uri
          nullable: true
          description: >-
            URL de webhook a nivel de aplicación (heredada). Didit envía a ella
            solo mientras la aplicación no tiene ningún destino de webhook
            habilitado, y en ese caso solo `status.updated` y `data.updated`.
            Cada vez que se crea, actualiza o elimina un destino, se establece
            en la URL del destino habilitado más antiguo, o en `null` si no hay
            ninguno habilitado.
        webhook_version:
          type: string
          enum:
            - v1
            - v2
            - v3
          description: >-
            Versión del payload de la `webhook_url` heredada. Cada destino tiene
            su propia `webhook_version`.
        secret_shared_key:
          type: string
          description: >-
            Secreto de firma a nivel de aplicación (token de 43 caracteres
            seguro para URL). Solo firma las entregas al `webhook_url` heredado;
            cada destino firma con su propio `secret_shared_key`. Quien llama
            con una clave de API siempre lo recibe completo; los usuarios de la
            consola sin `read:webhooks` reciben una cadena vacía.
        capture_method:
          type: string
          enum:
            - MOBILE
            - MOBILE_AND_DESKTOP
          description: >-
            Configuración heredada de la aplicación. El flujo de verificación no
            la lee: las opciones de captura se configuran por flujo.
        data_retention_months:
          type: integer
          nullable: true
          minimum: 1
          maximum: 120
          description: >-
            Plazo de eliminación automática. Las sesiones de verificación de
            usuarios creadas hace más de este número de meses (un mes equivale a
            30 días) se eliminan automáticamente, y esa eliminación es
            irreversible. `null` significa que las sesiones nunca se eliminan
            automáticamente. Consulta [Retención de
            datos](https://docs.didit.me/es/console/data-retention).
        face_retention_policy:
          type: string
          enum:
            - delete_with_session
            - retain_until_user_deleted
          description: >-
            Qué ocurre con el embedding facial de una sesión cuando se elimina
            la sesión. `delete_with_session` (valor predeterminado) lo elimina
            junto con la sesión. `retain_until_user_deleted` es la [retención de
            plantillas
            biométricas](https://docs.didit.me/es/console/data-retention#retención-de-plantillas-biométricas)
            opcional: una plantilla biométrica sin imágenes vinculada al User se
            gestiona por separado hasta que finaliza su periodo de retención, se
            elimina el User o la purgas.
        face_retention_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: >-
            Periodo de retención, en días, de las plantillas biométricas con
            `retain_until_user_deleted`. Obligatorio cuando se define esa
            política.
        biometric_consent_mode:
          type: string
          enum:
            - auto
            - always
            - never
          description: >-
            Cuándo el flujo alojado y los SDK nativos piden a la persona su
            consentimiento biométrico explícito antes de capturar el rostro.
            `auto` (predeterminado) lo pide solo donde aplica un disparador: un
            estado declarado, la IP de la persona o el emisor del documento de
            identidad está en Illinois, Texas o Colorado, o la persona parece
            estar en EE. UU. sin un estado conocido. `always` lo pide a toda
            persona cuyo flujo capture el rostro. `never` nunca muestra el paso,
            y tú mismo recoges el consentimiento antes del selfie. Cada cambio
            se registra en el registro de auditoría. Consulta [Consentimiento
            biométrico](https://docs.didit.me/es/getting-started/biometric-consent).
        available_events:
          type: array
          description: >-
            Todos los tipos de evento a los que se puede suscribir un destino,
            con una etiqueta visible.
          items:
            type: object
            required:
              - value
              - label
            properties:
              value:
                $ref: '#/components/schemas/WebhookEvent'
              label:
                type: string
                description: Etiqueta visible, por ejemplo `Session status updated`.
        allowed_return_hosts:
          type: array
          maxItems: 20
          description: >-
            Nombres de host (coincidencia exacta, solo HTTPS) a los que una
            verificación independiente de wallet de Digital ID puede devolver al
            usuario con su `return_url`. Tu dominio de marca blanca también está
            siempre permitido. Consulta [Registra tu destino de
            retorno](https://docs.didit.me/es/standalone-apis/digital-id-wallets#registra-tu-destino-de-retorno).
          items:
            type: string
            maxLength: 253
        endpoints:
          type: array
          description: >-
            Todos los destinos de webhook de la aplicación, del más antiguo al
            más reciente, cada uno con su secreto de firma. Aquí solo se pueden
            leer: gestiona los destinos con los endpoints
            `/v3/webhook/destinations/`.
          items:
            $ref: '#/components/schemas/WebhookConfigDestination'
        allowed_domains:
          type: array
          maxItems: 50
          items:
            type: string
            maxLength: 300
          description: >-
            Orígenes (por ejemplo `https://app.example.com`; `http` solo para
            `localhost`) en los que puede incrustarse el flujo de verificación
            alojado y a los que puede devolver al usuario con un callback de
            sesión. Las llamadas de servidor a servidor no se ven afectadas. Una
            lista vacía significa que no hay restricción. Didit almacena cada
            origen en minúsculas y sin puerto predeterminado. Una entrada no
            válida falla con `400` en `allowed_domains`.
          example:
            - https://app.example.com
    WebhookEvent:
      type: string
      description: >-
        Nombre de evento de webhook admitido. Usa exactamente estas cadenas en
        `subscribed_events`; los valores no admitidos se rechazan.
      enum:
        - status.updated
        - data.updated
        - user.status.updated
        - user.data.updated
        - business.status.updated
        - business.data.updated
        - activity.created
        - transaction.created
        - transaction.status.updated
        - travel_rule.status.updated
        - workflow.compliance_changed
        - transaction_rule_suggestions.created
        - auth.signup
        - auth.login
        - auth.login_failed
        - auth.password_reset_requested
        - auth.password_reset_completed
        - auth.mfa_changed
        - auth.new_device
        - auth.account_locked
        - investigator.report.ready
        - investigator.decision.automated
        - investigator.decision.overridden
        - investigator.decision.contested
        - investigator.question.raised
        - investigator.automation.paused
        - investigator.rfi.answered
        - investigator.rfi.overdue
        - investigator.drift.detected
        - investigator.sla.breached
        - investigator.qa.failed
        - investigator.external.report.ready
    WebhookConfigDestination:
      type: object
      description: >-
        Un destino de webhook tal como aparece en la configuración de webhooks,
        sin métricas de entrega. `GET
        /v3/webhook/destinations/{destination_uuid}/` añade su resumen de
        entregas.
      required:
        - uuid
        - label
        - url
        - enabled
        - webhook_version
        - secret_shared_key
        - subscribed_events
        - created_at
        - updated_at
      properties:
        uuid:
          type: string
          format: uuid
          description: ID del destino.
        label:
          type: string
          maxLength: 255
          description: Nombre legible.
        url:
          type: string
          format: uri
          maxLength: 2000
          description: Endpoint HTTPS al que Didit envía los eventos.
        enabled:
          type: boolean
          description: '`false` pausa las entregas a este destino.'
        webhook_version:
          type: string
          enum:
            - v1
            - v2
            - v3
          description: Versión del payload que se envía a este destino.
        secret_shared_key:
          type: string
          description: >-
            El secreto de firma de este destino (token URL-safe de 43
            caracteres). Verifica cada webhook con el secreto del destino al que
            se envió. Quienes llaman con clave de API siempre lo reciben
            completo; los usuarios de la Console sin `read:webhooks` reciben una
            cadena vacía.
        subscribed_events:
          type: array
          uniqueItems: true
          description: >-
            Tipos de evento que se entregan a este destino. Está vacío si el
            destino se creó sin eventos; en ese caso no recibe nada.
          items:
            $ref: '#/components/schemas/WebhookEvent'
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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