---
title: "Send a synthetic test delivery"
method: POST
path: "/v1/webhook-endpoints/{id}/test"
tags: ["Webhooks"]
---

# Send a synthetic test delivery

`POST /v1/webhook-endpoints/{id}/test`

## Request

- Base URL: `https://api.letmepost.dev`
- URL: `https://api.letmepost.dev/v1/webhook-endpoints/{id}/test`
- Auth: HTTP bearer

Fires a synthetic event at the endpoint URL synchronously and returns what the consumer responded — bypasses the BullMQ delivery queue on purpose so operators get immediate feedback. The real signing secret is used; the consumer's HMAC verification path is identical to production.

## Path parameters

- `id` string, uuid, required

## Request body

- TestWebhookDeliveryRequest: Default body sends a synthetic `post.published` event.
  - `type` 'post.queued' | 'post.validated' | 'post.published' | 'post.rejected' | 'post.failed' | 'post.canceled' | 'post.rescheduled' | 'token.expiring' | 'token.revoked' | 'version.deprecated' | 'subscription.activated' | 'subscription.cancelled' | 'subscription.tier_changed' | 'quota.warning' | 'quota.exceeded' | 'billing.payment_failed' | 'billing.delinquent' | 'billing.recovered'
  - `data` unknown

## Response `200`

Delivery completed (the consumer may still have returned a non-2xx — see `delivered` and `status`).

- TestWebhookDeliveryResponse
  - `delivered` boolean, required
  - `status` integer, nullable, required
  - `durationMs` integer, required
  - `responseBody` string, nullable
  - `deliveryId` string, required
  - `nonRetryable` boolean
  - `errorName` string, nullable
  - `sentEvent` object, required

## Other responses

- `400`: `validation_failed` — request body or query parameters didn't match the schema. Rules surfaced include `body.json`, `targets.required`, `targets.max`, `mode_conflict`, `targets.options.platform_mismatch`, `targets.account.platform_mismatch`, `target.account.not_connected`, `target.account.ambiguous`, `scheduledAt.future`, `scheduledAt.no_first_comment`, `scheduledAt.no_bluesky_reply`.
- `401`: `unauthenticated` — missing or invalid Bearer key.
- `404`: `not_found` — the resource does not exist in the caller's organization (or, for profile-scoped keys, in the caller's profile).
- `429`: `rate_limited` — too many requests. Inspect `X-RateLimit-Limit` (static ceiling) and the IETF-draft `RateLimit-*` headers (sliding-window remaining/reset) before retrying.

---

[API](https://skmtc.dev/letmepost/apis/letmepost-dev-api.md) · [All operations](https://skmtc.dev/letmepost/apis/letmepost-dev-api/llms.txt) · [OpenAPI document](https://skmtc.dev/letmepost/apis/letmepost-dev-api/revisions/f6659001f96b?raw)
