Get started
Quickstart
Create a source, a destination and a flow, then send a test event end to end.
In this quickstart you create a source, point it at a destination, and send a webhook through it. It takes a few minutes and needs only a URL that can receive a POST. A request inspector URL is fine.
You will:
- Create a destination.
- Create a source.
- Connect them with a flow.
- Send a test event.
- Read the event’s timeline.
Before you begin
Sign in to the dashboard. To follow along over the API instead, create an API key under Settings → API keys & MCP; the API introduction covers authentication.
1. Create a destination
Open Destinations → New destination, name it, and enter the URL that should receive events, for example https://api.example.com/webhooks/ensue.
curl -X POST https://api.getensue.com/v1/destinations \
-H "authorization: Bearer ens_<key>" -H "content-type: application/json" \
-d '{"name": "billing-api", "url": "https://api.example.com/webhooks/ensue"}'
2. Create a source
Open Sources → New source, name it, and choose how the sender signs its requests. Use None for this test; switch to a real method before going live (Verify incoming webhooks).
curl -X POST https://api.getensue.com/v1/sources \
-H "authorization: Bearer ens_<key>" -H "content-type: application/json" \
-d '{"name": "stripe-test"}'
The response includes the source’s ingest URL:
https://hooks.getensue.com/in/<token>
This is the URL you paste into the sender’s webhook settings.
3. Connect them with a flow
Open Flows → New flow, choose the source and the destination, and activate it. You can add a filter or transformation now or later.
curl -X POST https://api.getensue.com/v1/flows \
-H "authorization: Bearer ens_<key>" -H "content-type: application/json" \
-d '{"source_id": "src_…", "destination_id": "dst_…"}'
4. Send a test event
Post to the source URL as a sender would:
curl -X POST https://hooks.getensue.com/in/<token> \
-H "content-type: application/json" \
-d '{"type": "test.ping", "data": {"hello": "world"}}'
Ensue answers as soon as the request is stored:
{ "received": true, "request_id": "req_…", "events": 1 }
events: 1 means one flow matched and one event was queued for delivery. You can also use Send test event on the source page, which needs no curl.
5. Read the timeline
Open Events and select the event. The timeline shows when it was received, whether it was verified, each delivery attempt, your service’s response and how long it took.
12:04:11 received · verified
12:04:11 matched flow stripe-test → billing-api
12:04:11 attempt 1 · 200 in 142ms
What your service receives
Ensue forwards the request body and adds headers so you can verify and de-duplicate:
| Header | Meaning |
|---|---|
x-ensue-event-id |
The event ID. Stable across retries. |
idempotency-key |
The same value, for libraries that look for this header. |
x-ensue-request-id |
The request that created the event. |
x-ensue-timestamp |
When this attempt was sent, in Unix seconds. |
x-ensue-signature |
t=<timestamp>,v1=<hex>: the HMAC-SHA256 of "<timestamp>.<body>" using the destination’s secret. |
What you have learned
You created the three objects every Gateway setup is made of and watched an event travel through them. Next:
- Verify incoming webhooks so only the real sender can post to your source.
- Delivery policy to control retries and rate.
- Replay and dead letters for when your service is down.