> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trulayer.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Send a synthetic ping event to verify a webhook endpoint

> Sends a `{type: "ping", webhook_id, sent_at}` payload to the
webhook's configured endpoint, signed with the same HMAC-SHA256
scheme used for live deliveries. Returns the destination's HTTP
status and (truncated) response body. The delivery is ephemeral
and is not written to the delivery log. Same RBAC as create
(member+) and plan gate (Pro+).




## OpenAPI

````yaml /api-reference/openapi.yaml post /v1/webhooks/{id}/test
openapi: 3.1.0
info:
  title: TruLayer API
  version: 0.1.0
  description: |
    Trace ingestion, evaluation, query, and feedback API for TruLayer AI.

    ### Authentication

    Two auth schemes coexist: SDK API keys (`Authorization: Bearer tl_...`)
    and Clerk session JWTs (dashboard). Routes marked "requires Clerk auth"
    in their summary are unreachable via API key.

    ### Roles (TRU-234)

    Dashboard requests carry one of three organization roles: `owner`,
    `member`, `viewer`. Endpoints enforce role allowlists, not rank
    comparisons. See `docs/security.md` for the full role-permission
    matrix.

    - **owner** — full control including billing, member management,
      destructive deletes on failure-rules/model-routes/webhooks/eval-rules,
      control-loop execution, and DLQ resolution.
    - **member** — read + write (ingest, feedback, evals, API keys,
      projects, failure-rules, model-routes, webhooks).
    - **viewer** — read-only dashboard access plus compliance read access
      to `/v1/audit-log` and `/v1/dlq`.
servers:
  - url: https://api.trulayer.ai
    description: Production
  - url: http://localhost:8080
    description: Local development
security:
  - BearerAuth: []
tags:
  - name: health
  - name: ingest
  - name: traces
  - name: metrics
  - name: feedback
  - name: evals
  - name: eval-rules
  - name: control
  - name: apikeys
  - name: model-routes
  - name: datasets
  - name: search
  - name: anomaly
  - name: webhooks
  - name: failure-rules
  - name: eval-runs
  - name: ci
  - name: otlp
  - name: billing
  - name: deprecations
  - name: audit
  - name: failures
  - name: projects
  - name: compliance
  - name: dsr
  - name: policies
  - name: members
paths:
  /v1/webhooks/{id}/test:
    post:
      tags:
        - webhooks
      summary: Send a synthetic ping event to verify a webhook endpoint
      description: |
        Sends a `{type: "ping", webhook_id, sent_at}` payload to the
        webhook's configured endpoint, signed with the same HMAC-SHA256
        scheme used for live deliveries. Returns the destination's HTTP
        status and (truncated) response body. The delivery is ephemeral
        and is not written to the delivery log. Same RBAC as create
        (member+) and plan gate (Pro+).
      operationId: testWebhook
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: Test delivery completed; destination response captured
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TestWebhookResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
components:
  schemas:
    TestWebhookResponse:
      type: object
      required:
        - status
        - body
      description: |
        Result of a `POST /v1/webhooks/{id}/test` synthetic delivery.
        `status` is the destination's HTTP response code, or `0` when the
        destination was unreachable (DNS failure, refused connection,
        TLS error, timeout). `body` is the destination response body
        truncated at 4 KiB.
      properties:
        status:
          type: integer
          description: Destination HTTP status, or 0 on transport error
        body:
          type: string
          description: Destination response body, truncated at 4 KiB
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: string
  responses:
    Unauthorized:
      description: Missing or invalid credentials
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: Insufficient role
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: Resource not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    UnprocessableEntity:
      description: Request understood but cannot be processed in the current state
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: SDK API key (`tl_...`) or Clerk session JWT

````