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

# Send a test webhook delivery

> Deliver one signed test event to your endpoint so you can verify your handler without waiting for a real event.

Use this while you are building your handler: it signs and posts a real delivery to your registered endpoint immediately, so you can check your signature verification, your parsing, and your response — without waiting for a watcher run.

## What gets sent

The delivery is identical to a live one — same headers, same signature scheme, and the same [envelope](/api/webhooks/events#delivery-body) with the event payload in `data` — with two differences that let you tell it apart:

* The envelope carries `"test": true`.
* The event ID starts with `evt_test_`.

```json theme={"dark"}
{
  "id": "evt_test_9c1f2a5b7d3e4f6a8b0c1d2e",
  "type": "profile.updated",
  "created": "1788451200",
  "test": true,
  "data": { "orbitId": "11111111-1111-4111-8111-111111111111", "newEventCount": 1, "events": [] }
}
```

`data` is your most recent event of this type from the last 30 days when you have one, and the documented example payload for a dummy profile otherwise — `payload_source` in the response says which. Either way the field names, shapes and caps match a live delivery, so a handler written against a test delivery works unchanged against the real one. Verify the signature exactly as you would for a live delivery: see [Events & signatures](/api/webhooks/events).

Omit `event_type` to test the first event type the endpoint subscribes to. Slack incoming-webhook endpoints receive the same formatted Slack message a live delivery would.

## Reading the result

A `200` means Orbit attempted the delivery and is reporting the outcome — including a failure on your side:

```json theme={"dark"}
{
  "delivered": false,
  "response_status": 500,
  "duration_ms": 88,
  "error": "http_500"
}
```

`delivered` is true only when your server answered `2xx`. When it never answered, `response_status` is null and `error` carries the reason, for example `ECONNREFUSED` or `timeout of 10000ms exceeded`.

<Note>
  Test deliveries are free, are attempted exactly once with no retries, and are
  not recorded in your delivery history. A failed test never counts toward the
  20 consecutive failures that disable an endpoint, so you can iterate on your
  handler safely.
</Note>

Because each call makes an outbound request, this route is [rate limited](/concepts/rate-limits) more tightly than the rest of the API: 0.5 requests/second with a burst of 10.


## OpenAPI

````yaml openapi.json POST /v3/webhooks/{webhook_id}/test
openapi: 3.1.0
info:
  title: Orbit API
  version: 3.0.0
  description: Search for people and enrich known Orbit profiles.
servers:
  - url: https://api.orbitsearch.com
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Search
    description: Find people and poll search results.
  - name: Enrich
    description: Read or enrich known Orbit profiles.
  - name: Watchers
    description: Watch a profile on a schedule and read what each run found.
  - name: Webhooks
    description: Register endpoints that receive signed event deliveries.
paths:
  /v3/webhooks/{webhook_id}/test:
    post:
      tags:
        - Webhooks
      summary: Send a test delivery
      description: >-
        Delivers one signed test event to the endpoint so you can verify your
        handler without waiting for a real event. The body is your most recent
        event of this type when you have one and the documented example payload
        otherwise; either way the envelope carries `"test": true` and an
        `evt_test_` event ID. Test deliveries are free, are never retried, and
        are not recorded in your delivery history. Requires the `webhooks:write`
        scope and is rate limited more tightly than other routes.
      operationId: testWebhook
      parameters:
        - $ref: '#/components/parameters/WebhookId'
      requestBody:
        required: false
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookTestRequest'
            example:
              event_type: profile.updated
      responses:
        '200':
          description: >-
            The delivery was attempted. A non-2xx response from your server is
            reported here, not as an API error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebhookTestResponse'
              example:
                webhook_id: 6f2f1f37-8f9f-4a51-9a2f-2f1cbb1a9d20
                url: https://example.com/***hook
                event_id: evt_test_9c1f2a5b7d3e4f6a8b0c1d2e
                event_type: profile.updated
                payload_source: example
                delivered: true
                response_status: 200
                duration_ms: 143
                error: null
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  parameters:
    WebhookId:
      name: webhook_id
      in: path
      required: true
      description: The webhook endpoint ID returned at creation.
      schema:
        type: string
        format: uuid
  schemas:
    WebhookTestRequest:
      type: object
      properties:
        event_type:
          $ref: '#/components/schemas/WebhookEventType'
      description: >-
        Optional. Defaults to the first event type the endpoint subscribes to;
        must be one of its subscribed types.
    WebhookTestResponse:
      type: object
      required:
        - webhook_id
        - event_id
        - event_type
        - payload_source
        - delivered
        - duration_ms
      properties:
        webhook_id:
          type: string
          format: uuid
        url:
          type: string
          description: >-
            The endpoint URL the test was delivered to, redacted the same way
            list responses redact it.
        event_id:
          type: string
          description: >-
            The delivery ID sent in `x-orbit-webhook-event-id`. Test deliveries
            always start with `evt_test_`.
        event_type:
          $ref: '#/components/schemas/WebhookEventType'
        payload_source:
          type: string
          enum:
            - recent_event
            - example
          description: >-
            `recent_event` when the body replayed your most recent event of this
            type from the last 30 days, `example` when it carried the documented
            example payload.
        delivered:
          type: boolean
          description: True when your server answered `2xx`.
        response_status:
          type:
            - integer
            - 'null'
          description: >-
            The HTTP status your server returned, or null when the request never
            completed.
        duration_ms:
          type: integer
          description: How long the attempt took, in milliseconds.
        error:
          type:
            - string
            - 'null'
          description: >-
            Why the delivery failed, for example `http_500` or `ECONNREFUSED`.
            Null on success.
    WebhookEventType:
      type: string
      enum:
        - profile.updated
        - company.thesis.changed
        - company.alert
        - portfolio.changed
    ErrorResponse:
      type: object
      required:
        - status
        - error
      properties:
        status:
          type: string
          enum:
            - failed
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
            message:
              type: string
  responses:
    BadRequest:
      description: The request is not valid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Unauthorized:
      description: The API key is missing or not valid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    Forbidden:
      description: The API key does not have the required scope.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    NotFound:
      description: The requested resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
    RateLimited:
      description: The API key exceeded a rate limit.
      headers:
        Retry-After:
          description: Seconds to wait before another request.
          schema:
            type: integer
            minimum: 0
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Orbit API key
      description: Use an Orbit API key from the developer dashboard.

````