---
title: Testing webhooks
description: Send a test event to one endpoint, read the delivery back, and replay what a broken receiver missed.
type: how-to
product: webhooks
summary: The test method, what the test event looks like, and how to read the delivery.
updated: 2026-10-01
order: 3
---

You do not need a real event to try a receiver. The
[`test`](/docs/api/webhook_endpoints#test) method sends one event to one
endpoint, through the same signing, retries and delivery log as any other
event.

<Prerequisites
	items={[
		'A receiver that answers a POST over https and verifies the signature - see receiving webhooks',
		'A webhook endpoint pointing at it, and a key with the events:write scope',
		'A tunnel in front of a receiver on your laptop: the endpoint address must be public https, and redirects are not followed',
	]}
/>

## Send the test event

<CodeTabs>
	<CodeTab
		label="CLI"
		language="bash"
		code={`sylphx events webhook-endpoints test orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint`}
	/>
	<CodeTab
		label="cURL"
		language="bash"
		code={`curl -X POST "https://api.sylphx.com/v1/orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint:test" \\
  -H "Authorization: Bearer $SYLPHX_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{}'`}
	/>
	<CodeTab
		label="TypeScript"
		language="ts"
		code={`import { Sylphx } from '@sylphx/sdk'

const sylphx = new Sylphx()
const { webhookDelivery } = await sylphx.events.webhookEndpoints.test({
  name: 'orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint',
})
console.log(webhookDelivery?.name, webhookDelivery?.state)`}
	/>
</CodeTabs>

The answer is the delivery that was queued for the endpoint.

## What your receiver gets

A CloudEvent of type `sylphx.webhook.test`:

```json
{
  "specversion": "1.0",
  "id": "…",
  "source": "https://api.sylphx.com/events",
  "type": "sylphx.webhook.test",
  "subject": "orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint",
  "time": "2026-10-01T12:00:00Z",
  "datacontenttype": "application/json",
  "data": {
    "message": "A test event from Sylphx Events.",
    "webhook_endpoint": "orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint"
  }
}
```

It is signed with the endpoint's secret and carries the three Standard Webhooks
headers, so a receiver that passes the test verifies real deliveries the same
way.

## Read the delivery back

Read the delivery by its name until it lands. `state` becomes `delivered` once
your receiver answered `2xx`; `dead_lettered` means it did not, and the
attempts record what your endpoint answered.

```bash
sylphx events webhook-deliveries get orgs/acme/projects/shop/envs/production/webhook_endpoints/my-endpoint/webhook_deliveries/<delivery>
```

A receiver that answers `4xx` (other than `408`, `425` and `429`) or a redirect
is dead-lettered at once; `408`, `425`, `429` and `5xx` are retried on the
[schedule](/docs/webhooks/receiving#retries).

## When the receiver was down

Fix the receiver, then
[`replay`](/docs/api/webhook_endpoints#replay) the endpoint for the time range
it missed: every dead-lettered delivery created in that range is sent again, as
a new attempt, up to 10,000 per replay.

<RelatedDocs
	links={[
		{
			href: '/docs/webhooks/receiving',
			label: 'Receiving webhooks',
			description: 'Verify the signature, answer quickly and handle duplicates.',
		},
		{
			href: '/docs/api/webhook_deliveries',
			label: 'The webhook_deliveries collection',
			description: 'Read a delivery, its attempts and what your endpoint answered.',
		},
	]}
/>
