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

# Get Webhook Configuration

> Read your application's webhook settings: legacy webhook URL and secret, destinations, subscribable events, retention policy and wallet return hosts.



Get Webhook Configuration API Prompt
        Copy prompt to clipboard



      
      

\<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.
\- 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 or invalid key; { "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>



      
      

Paste into

This endpoint returns the application-level webhook from before destinations existed, together with the list of destinations. Didit delivers webhooks to your [webhook destinations](/management-api/webhook/list-destinations.md), each signed with its own `secret_shared_key`; the top-level `webhook_url`, `webhook_version` and `secret_shared_key` are used only while no destination is enabled, and then only for `status.updated` and `data.updated`.> [!WARNING]
>
> The response contains every signing secret of your application. Keep it out of logs and client-side code.To change these settings, use [Update Webhook Configuration](/management-api/webhook/update-config.md). For signature verification and payloads, see the [webhooks guide](/integration/webhooks.md). For the retention fields, see [Data retention](/console/data-retention.md).


## OpenAPI

````yaml GET /v3/webhook/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: Identity verification API. Authenticate with x-api-key header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/webhook/:
    get:
      tags:
        - Webhook
      summary: Get webhook configuration
      description: >-
        Return the application's webhook settings in one call: every [webhook
        destination](https://docs.didit.me/management-api/webhook/list-destinations)
        with its signing secret, the event types a destination can subscribe to,
        the application-level (legacy) webhook URL, version and secret, the data
        and biometric-template retention policy, and the Digital ID wallet
        return hosts. Didit delivers webhooks to destinations, each signed with
        its own `secret_shared_key`; the top-level `webhook_url`,
        `webhook_version` and `secret_shared_key` are used only while no
        destination is enabled, and then only for `status.updated` and
        `data.updated`. The response contains signing secrets, so keep it out of
        logs and client-side code. A scoped API key needs `webhooks: read`.
      operationId: get_webhook_config
      parameters: []
      responses:
        '200':
          description: The webhook configuration.
          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
                    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: >-
            The API key has expired: it was created with an expiry date that has
            passed. A missing, invalid or revoked key gets `403`, not `401`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Human-readable error message.
              examples:
                Expired key:
                  value:
                    detail: This API key has expired.
        '403':
          description: >-
            The request is not allowed. A missing, invalid or revoked
            `x-api-key` gets `You do not have permission to perform this
            action.` A scoped key without the access this endpoint needs gets a
            message naming the missing access, and a key used from outside its
            IP allowlist gets `This API key can't be used from this IP address.`
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Human-readable error message.
              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: >-
            Rate limit exceeded: more than 600 GET requests in the current
            one-minute window for this API key. Wait `Retry-After` seconds
            before retrying.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                minimum: 1
                example: 30
            X-RateLimit-Limit:
              description: Requests allowed in the one-minute window (600).
              schema:
                type: integer
                example: 600
            X-RateLimit-Remaining:
              description: Requests left in the current window.
              schema:
                type: integer
                example: 0
            X-RateLimit-Reset:
              description: Unix time (seconds) when the current window resets.
              schema:
                type: integer
                example: 1792056120
            X-RateLimit-Scope:
              description: Name of the budget that was exceeded.
              schema:
                type: string
                example: generic-get
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Human-readable error message.
              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: |-
            import os

            import requests

            resp = requests.get(
                'https://verification.didit.me/v3/webhook/',
                headers={'x-api-key': os.environ['DIDIT_API_KEY']},
                timeout=10,
            )
            resp.raise_for_status()
            config = resp.json()
            for destination in config['endpoints']:
                print(destination['label'], destination['url'], destination['subscribed_events'])
        - lang: javascript
          label: JavaScript
          source: >-
            const resp = await
            fetch('https://verification.didit.me/v3/webhook/', {
              headers: { 'x-api-key': process.env.DIDIT_API_KEY },
            });

            if (!resp.ok) throw new Error(`Request failed: ${resp.status}`);

            const config = await resp.json();

            for (const destination of config.endpoints) {
              console.log(destination.label, destination.url, destination.subscribed_events);
            }
components:
  schemas:
    WebhookConfig:
      type: object
      description: >-
        Application-level webhook configuration, retention policy and Digital ID
        wallet return hosts, with every webhook destination.
      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: >-
            Application-level (legacy) webhook URL. Didit sends to it only while
            the application has no enabled destination, and then only
            `status.updated` and `data.updated`. Every create, update or delete
            of a destination sets it to the URL of the oldest enabled
            destination, or `null` when none is enabled.
        webhook_version:
          type: string
          enum:
            - v1
            - v2
            - v3
          description: >-
            Payload version of the legacy `webhook_url`. Each destination has
            its own `webhook_version`.
        secret_shared_key:
          type: string
          description: >-
            Application-level signing secret (43-character URL-safe token). It
            signs only deliveries to the legacy `webhook_url`; each destination
            signs with its own `secret_shared_key`. API-key callers always
            receive it in full; Console users without `read:webhooks` receive an
            empty string.
        capture_method:
          type: string
          enum:
            - MOBILE
            - MOBILE_AND_DESKTOP
          description: >-
            Legacy application setting. The verification flow does not read it:
            capture options are configured per workflow.
        data_retention_months:
          type: integer
          nullable: true
          minimum: 1
          maximum: 120
          description: >-
            Automatic deletion window. User verification sessions created more
            than this many months ago (a month counts as 30 days) are deleted
            automatically, and that deletion is irreversible. `null` means
            sessions are never deleted automatically. See [Data
            retention](https://docs.didit.me/console/data-retention).
        face_retention_policy:
          type: string
          enum:
            - delete_with_session
            - retain_until_user_deleted
          description: >-
            What happens to a session's face embedding when the session is
            deleted. `delete_with_session` (default) deletes it with the
            session. `retain_until_user_deleted` is the opt-in [biometric
            template
            retention](https://docs.didit.me/console/data-retention#biometric-template-retention):
            an image-free biometric template linked to the User is managed
            separately until its retention period ends, the User is deleted, or
            you purge it.
        face_retention_days:
          type: integer
          nullable: true
          minimum: 1
          maximum: 3650
          description: >-
            Retention period, in days, of biometric templates under
            `retain_until_user_deleted`. Required when that policy is set.
        available_events:
          type: array
          description: >-
            Every event type a destination can subscribe to, with a display
            label.
          items:
            type: object
            required:
              - value
              - label
            properties:
              value:
                $ref: '#/components/schemas/WebhookEvent'
              label:
                type: string
                description: Display label, for example `Session status updated`.
        allowed_return_hosts:
          type: array
          maxItems: 20
          description: >-
            Hostnames (exact match, HTTPS only) a standalone Digital ID wallet
            verification may send the user back to with its `return_url`. Your
            white-label domain is always allowed as well. See [Register your
            return
            destination](https://docs.didit.me/standalone-apis/digital-id-wallets#register-your-return-destination).
          items:
            type: string
            maxLength: 253
        endpoints:
          type: array
          description: >-
            Every webhook destination of the application, oldest first, each
            with its signing secret. Read only here: manage destinations with
            the `/v3/webhook/destinations/` endpoints.
          items:
            $ref: '#/components/schemas/WebhookConfigDestination'
    WebhookEvent:
      type: string
      description: >-
        Supported webhook event name. Use these exact strings in
        `subscribed_events`; unsupported values are rejected.
      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
        - 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: >-
        A webhook destination as listed in the webhook configuration, without
        delivery metrics. `GET /v3/webhook/destinations/{destination_uuid}/`
        adds its delivery summary.
      required:
        - uuid
        - label
        - url
        - enabled
        - webhook_version
        - secret_shared_key
        - subscribed_events
        - created_at
        - updated_at
      properties:
        uuid:
          type: string
          format: uuid
          description: Destination ID.
        label:
          type: string
          maxLength: 255
          description: Human-readable name.
        url:
          type: string
          format: uri
          maxLength: 2000
          description: HTTPS endpoint Didit posts events to.
        enabled:
          type: boolean
          description: '`false` pauses deliveries to this destination.'
        webhook_version:
          type: string
          enum:
            - v1
            - v2
            - v3
          description: Payload version sent to this destination.
        secret_shared_key:
          type: string
          description: >-
            This destination's signing secret (43-character URL-safe token).
            Verify each webhook with the secret of the destination it was sent
            to. API-key callers always receive it in full; Console users without
            `read:webhooks` receive an empty string.
        subscribed_events:
          type: array
          uniqueItems: true
          description: >-
            Event types delivered to this destination. Empty when the
            destination was created without events, in which case it receives
            nothing.
          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: >-
        Your application's API key, from Developers -> API keys in the Business
        Console. The primary key has full access. A named key can be scoped:
        none, read or write per resource, limited to some workflows or to
        approved sessions, to a list of IP addresses, and to an expiry date. 401
        means the key is missing, wrong, revoked or expired; 403 means the key
        has no access to this resource or action, or the request came from an
        address outside its IP list; 404 on a session route means the session is
        outside the key's workflows or statuses. A key without media access
        receives image, video and PDF URLs as null, and a key without sessions
        write receives session links and tokens as null. See
        https://docs.didit.me/console/api-keys.

````

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