Quickstart
From signup to your first delivered webhook in about five minutes.
Harepost takes an outbound HTTP request, queues it, and delivers it to your endpoint with automatic retries when the target is down. You call one endpoint, and we handle the queue, the backoff, and the dead-lettering.
This guide takes you from nothing to a delivered webhook.
1. Get an API key
Create a free account at harepost.com. You will get a key that looks like hp_live_....
Save it when it is shown. The key appears once and cannot be recovered. Treat it like a password, keep it on your server, and never commit it or expose it in a browser.
2. Verify a sending domain
A key can only deliver to domains you have proven you control. This is what keeps Harepost from being used to attack endpoints you do not own.
Add the domain you will send webhooks to:
curl -X POST https://api.harepost.com/v1/domains \
-H "Authorization: Bearer hp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"your-app.com"}'
You will get back a DNS record to add:
{
"domain": "your-app.com",
"status": "pending",
"record": {
"type": "TXT",
"name": "_harepost-challenge.your-app.com",
"value": "harepost-verify=abc123..."
}
}
Add that TXT record at your DNS provider, then verify it:
curl -X POST https://api.harepost.com/v1/domains/verify \
-H "Authorization: Bearer hp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"domain":"your-app.com"}'
A verified status means you are ready to send. DNS can take a few minutes to propagate, so if you get pending, wait and run verify again.
3. Send your first webhook
Point a request at any endpoint on your verified domain:
curl -X POST https://api.harepost.com/v1/send \
-H "Authorization: Bearer hp_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"target": "https://your-app.com/webhook",
"body": { "event": "order.paid", "id": "ord_123" }
}'
Harepost responds immediately with a queue id:
{
"queue_id": "hr_9f2a81k2",
"status": "queued",
"created_at": "2026-06-10T14:22:10Z"
}
The 202 means the request is accepted and queued, not that your endpoint has received it yet. Delivery happens right after, and Harepost retries on a backoff schedule if your endpoint is down.
4. Confirm it arrived
Look up the delivery by its queue id to see what happened:
curl https://api.harepost.com/v1/deliveries/hr_9f2a81k2 \
-H "Authorization: Bearer hp_live_YOUR_KEY"
You get the delivery and its full attempt history, including the status code and latency of each try:
{
"queue_id": "hr_9f2a81k2",
"status": "delivered",
"target": "https://your-app.com/webhook",
"attempts": [
{
"attempt": 1,
"outcome": "delivered",
"http_status": 200,
"latency_ms": 84
}
]
}
A delivered status with a 2xx means your endpoint received it.
What happens when an endpoint fails
If your endpoint returns a 5xx, times out, or is unreachable, Harepost retries with exponential backoff and jitter. If it returns a 4xx that is a deliberate rejection, Harepost does not retry, since that wastes your endpoint’s resources. After the attempts run out, the delivery moves to a dead-letter queue where it is held for inspection rather than dropped.
Next steps
- Tune retries, timeouts, and backoff per request in the send reference.
- Verify that a request really came from Harepost in signature verification.