> ## 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 Destination Analytics

> Delivery totals, failure rate and response times for one webhook destination, overall and per UTC day, for any date range.



Get Webhook Destination Analytics API Prompt
        Copy prompt to clipboard



      
      

\<pre>

\`Read delivery statistics for one Didit webhook destination through the Management API.

Endpoint:
GET https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/analytics/

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

Goal:
\- Measure how reliably and how fast my endpoint accepts webhooks, to alert on failures or chart delivery health.

Path parameter:
\- destination_uuid: the destination uuid from GET /v3/webhook/destinations/.

Query parameters (optional):
\- date_from, date_to: UTC days as YYYY-MM-DD, both inclusive. Without them, every delivery of the destination is included. Delivery records are available for about 30 days, so no range reaches further back.

Behavior:
\- summary: total_deliveries, failed_deliveries, error_rate_percentage (whole number, 0 when there are no deliveries), min_response_time_ms, avg_response_time_ms, max_response_time_ms (null when there is no data). A delivery not attempted yet counts in total_deliveries, never in failed_deliveries, and has no response time.
\- points: one entry per UTC day that had deliveries, oldest first, with the same counters plus date. Days without deliveries are omitted, so fill the gaps with zeros when you chart them.
\- Every attempt counts: the first send of an event, each automatic retry and each resend.
\- Failed means HTTP 400 or above. A timeout is recorded as 504 and a connection failure as 503, so both count as failed.

Example call:
curl -X GET "https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/analytics/?date_from=2026-05-01&date_to=2026-05-31" \
-H "x-api-key: YOUR_API_KEY"

Failure modes:
\- 400: { "date_from": ["Date has wrong format. Use one of these formats instead: YYYY-MM-DD."] } or { "date_to": ["date_to must be greater than or equal to date_from."] }
\- 401: { "detail": "This API key has expired." }
\- 403: { "detail": "You do not have permission to perform this action." } or { "detail": "This API key has no read access to webhooks." }
\- 404: { "detail": "Webhook destination not found." }
\- 429: more than 600 GET requests per minute with this key; wait for Retry-After.

Side effects: none. This is a pure read.

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

\</pre>



      
      

Paste into

Use this endpoint to watch a destination over a period you choose. To see the individual attempts behind a failure, list them with [List Webhook Destination Deliveries](/management-api/webhook/list-deliveries.md) and open one with [Get Webhook Destination Delivery](/management-api/webhook/get-delivery.md).Which responses Didit retries automatically is described in the [retry policy](/integration/webhooks.md#retry-policy).


## OpenAPI

````yaml GET /v3/webhook/destinations/{destination_uuid}/analytics/
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/destinations/{destination_uuid}/analytics/:
    get:
      tags:
        - Webhook
      summary: Get webhook destination analytics
      description: >-
        Delivery totals, failure rate and response times for one webhook
        destination, over the whole range (`summary`) and per UTC day
        (`points`). Every attempt counts as a delivery: the first send of an
        event, each automatic
        [retry](https://docs.didit.me/integration/webhooks#retry-policy) and
        each resend. A delivery is failed when its recorded HTTP status is 400
        or above, so timeouts (recorded as `504`) and connection failures
        (`503`) count as failed; a delivery still queued counts in
        `total_deliveries` only. Delivery records are available for about 30
        days. A scoped API key needs `webhooks: read`.
      operationId: get_webhook_destination_analytics
      parameters:
        - name: destination_uuid
          in: path
          required: true
          description: >-
            UUID of the destination (the `uuid` returned by `GET
            /v3/webhook/destinations/`).
          schema:
            type: string
            format: uuid
          example: 11111111-2222-3333-4444-555555555555
        - name: date_from
          in: query
          required: false
          description: >-
            First UTC day to include, as `YYYY-MM-DD` (inclusive). Omit to start
            from the oldest delivery available. `dateFrom` is accepted as an
            alias.
          schema:
            type: string
            format: date
          example: '2026-10-01'
        - name: date_to
          in: query
          required: false
          description: >-
            Last UTC day to include, as `YYYY-MM-DD` (inclusive). Must not be
            earlier than `date_from`. `dateTo` is accepted as an alias.
          schema:
            type: string
            format: date
          example: '2026-10-16'
      responses:
        '200':
          description: Delivery statistics for the destination.
          content:
            application/json:
              schema:
                type: object
                required:
                  - summary
                  - points
                properties:
                  summary:
                    type: object
                    description: Totals over the requested range.
                    required:
                      - total_deliveries
                      - failed_deliveries
                      - min_response_time_ms
                      - avg_response_time_ms
                      - max_response_time_ms
                      - error_rate_percentage
                    properties:
                      total_deliveries:
                        type: integer
                        minimum: 0
                        description: Delivery attempts, including queued ones.
                      failed_deliveries:
                        type: integer
                        minimum: 0
                        description: Attempts whose recorded HTTP status is 400 or above.
                      min_response_time_ms:
                        type: integer
                        nullable: true
                        description: >-
                          Fastest attempt in milliseconds, or `null` when no
                          attempt has a recorded time.
                      avg_response_time_ms:
                        type: integer
                        nullable: true
                        description: >-
                          Mean attempt time in milliseconds, rounded, or `null`
                          when no attempt has a recorded time.
                      max_response_time_ms:
                        type: integer
                        nullable: true
                        description: >-
                          Slowest attempt in milliseconds, or `null` when no
                          attempt has a recorded time.
                      error_rate_percentage:
                        type: integer
                        minimum: 0
                        maximum: 100
                        description: >-
                          `failed_deliveries` / `total_deliveries` x 100,
                          rounded to a whole number. `0` when there are no
                          deliveries.
                  points:
                    type: array
                    description: >-
                      One entry per UTC day that had deliveries, oldest first.
                      Days without deliveries are omitted, so fill the gaps with
                      zeros when you chart them.
                    items:
                      type: object
                      required:
                        - date
                        - total_deliveries
                        - failed_deliveries
                        - min_response_time_ms
                        - avg_response_time_ms
                        - max_response_time_ms
                      properties:
                        date:
                          type: string
                          format: date
                          description: UTC day, `YYYY-MM-DD`.
                        total_deliveries:
                          type: integer
                          minimum: 0
                          description: Delivery attempts, including queued ones.
                        failed_deliveries:
                          type: integer
                          minimum: 0
                          description: Attempts whose recorded HTTP status is 400 or above.
                        min_response_time_ms:
                          type: integer
                          nullable: true
                          description: >-
                            Fastest attempt in milliseconds, or `null` when no
                            attempt has a recorded time.
                        avg_response_time_ms:
                          type: integer
                          nullable: true
                          description: >-
                            Mean attempt time in milliseconds, rounded, or
                            `null` when no attempt has a recorded time.
                        max_response_time_ms:
                          type: integer
                          nullable: true
                          description: >-
                            Slowest attempt in milliseconds, or `null` when no
                            attempt has a recorded time.
              examples:
                Three days of deliveries:
                  value:
                    summary:
                      total_deliveries: 1250
                      failed_deliveries: 12
                      min_response_time_ms: 38
                      avg_response_time_ms: 164
                      max_response_time_ms: 5004
                      error_rate_percentage: 1
                    points:
                      - date: '2026-10-14'
                        total_deliveries: 410
                        failed_deliveries: 0
                        min_response_time_ms: 38
                        avg_response_time_ms: 152
                        max_response_time_ms: 911
                      - date: '2026-10-15'
                        total_deliveries: 395
                        failed_deliveries: 12
                        min_response_time_ms: 41
                        avg_response_time_ms: 190
                        max_response_time_ms: 5004
                      - date: '2026-10-16'
                        total_deliveries: 445
                        failed_deliveries: 0
                        min_response_time_ms: 40
                        avg_response_time_ms: 151
                        max_response_time_ms: 1220
                No deliveries in range:
                  value:
                    summary:
                      total_deliveries: 0
                      failed_deliveries: 0
                      min_response_time_ms: null
                      avg_response_time_ms: null
                      max_response_time_ms: null
                      error_rate_percentage: 0
                    points: []
        '400':
          description: >-
            `date_from` or `date_to` is not a `YYYY-MM-DD` date, or `date_to` is
            earlier than `date_from`.
          content:
            application/json:
              schema:
                type: object
                description: Each invalid field mapped to a list of messages.
                additionalProperties:
                  type: array
                  items:
                    type: string
              examples:
                Malformed date:
                  value:
                    date_from:
                      - >-
                        Date has wrong format. Use one of these formats instead:
                        YYYY-MM-DD.
                Reversed range:
                  value:
                    date_to:
                      - date_to must be greater than or equal to date_from.
        '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.
        '404':
          description: >-
            No destination with this UUID exists for the application, or it has
            been deleted.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Human-readable error message.
              examples:
                Destination not found:
                  value:
                    detail: Webhook destination not found.
        '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/destinations/11111111-2222-3333-4444-555555555555/analytics/?date_from=2026-10-01&date_to=2026-10-16'
            \
              -H 'x-api-key: YOUR_API_KEY'
        - lang: python
          label: Python
          source: >-
            import os


            import requests


            destination_uuid = '11111111-2222-3333-4444-555555555555'

            resp = requests.get(
                f'https://verification.didit.me/v3/webhook/destinations/{destination_uuid}/analytics/',
                headers={'x-api-key': os.environ['DIDIT_API_KEY']},
                params={'date_from': '2026-10-01', 'date_to': '2026-10-16'},
                timeout=10,
            )

            resp.raise_for_status()

            summary = resp.json()['summary']

            print(f"{summary['failed_deliveries']} of
            {summary['total_deliveries']} failed
            ({summary['error_rate_percentage']}%)")
        - lang: javascript
          label: JavaScript
          source: >-
            const destinationUuid = '11111111-2222-3333-4444-555555555555';

            const params = new URLSearchParams({ date_from: '2026-10-01',
            date_to: '2026-10-16' });

            const resp = await
            fetch(`https://verification.didit.me/v3/webhook/destinations/${destinationUuid}/analytics/?${params}`,
            {
              headers: { 'x-api-key': process.env.DIDIT_API_KEY },
            });

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

            const { summary, points } = await resp.json();

            console.log(summary.error_rate_percentage, points.length);
components:
  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.