# POST /v1/webhooks/{webhookId}:test

**Service:** Webhooks  
**Operation:** `WebhookService_TestWebhook`

POSTs a synthetic `ping` event through the real signing and delivery path and reports what the endpoint answered. The ping is recorded as a `webhook.test` delivery (visible in the delivery log, resendable from the Factory UI) but retries do not apply — this is a live round trip for verifying an endpoint and its signature check.

## Parameters

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `webhookId` | path | string | yes | The subscription whose endpoint to ping. |

## Request body

`TestWebhookBody` (application/json)

## Responses

| Status | Schema | Description |
| --- | --- | --- |
| 200 | `TestWebhookResponse` | A successful response. |
| 400 | `Error` | The request was rejected because it was malformed — for example a webhook id that is not a whsub_ id. The body is a validation-failure envelope: an overall type and message and one entry per problem (each with a stable code, a message, and a param pointing at the offending parameter). |
| 401 | `Error` | The request is missing a valid bearer token, or the token is invalid or expired. |
| 403 | `Error` | The token is valid but does not permit this action, or the resource belongs to a company the token cannot act for. The error type is permission_denied. |
| 404 | `Error` | No webhook subscription with the given id exists for the authenticated company. |
| 429 | `Error` | The request was throttled (rate_limited) or exceeded a size limit (resource_exhausted). When throttled, the Retry-After header says how many seconds to wait before retrying; a resource_exhausted request will fail the same way if retried unchanged. |
| default | `Error` | Any other error. The body is the same error envelope every error uses: a short stable type identifying the kind of failure, a human-readable message, and the request's idempotency key echoed back when one was supplied. |

## Returns

`TestWebhookResponse`

| Field | Type | Description |
| --- | --- | --- |
| `statusCode` | integer | The HTTP status the endpoint returned; 0 when no response arrived (timeout or connection failure). |
| `responseSnippet` | string | The start of the endpoint's response body, truncated to 1000 characters. |
| `durationMs` | string | How long the round trip took. |

---

Source: https://developer.factory.app/reference/webhooks/test-webhook · Factory Sales API v1
