This page covers endpoint creation and the request inspector — the two things you’ll use on every webhook integration.
Creating an endpoint
In the dashboard, navigate to Endpoints and click New endpoint.
| Field | Required | Notes |
|---|---|---|
| Name | Yes | Internal label, e.g. Stripe production |
| Description | No | Helpful when you have many endpoints |
| Forward URL | No | HTTPS URL to auto-forward every webhook — leave blank for capture-only |
On save, HookDeploy generates a unique slug and your public URL:
https://hookdeploy.dev/h/{slug}
Slugs are short, URL-safe strings (typically 6 characters). They’re permanent for the life of the endpoint — you can’t change a slug after creation, but you can delete the endpoint and create a new one.
Via the API
You can also create endpoints programmatically:
curl -s -X POST "https://api.hookdeploy.dev/v1/endpoints" \
-H "Authorization: Bearer hd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Stripe webhooks",
"description": "Production Stripe events",
"forward_url": "https://staging.example.com/webhooks/stripe"
}'
Response (201 Created):
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"slug": "abc123",
"name": "Stripe webhooks",
"forward_url": "https://staging.example.com/webhooks/stripe",
"paused": false,
"created_at": "2025-05-23T12:00:00Z"
}
}
Send webhooks to https://hookdeploy.dev/h/abc123.
Copying the URL
The endpoint detail page shows your webhook URL with a copy button. The format is always:
https://hookdeploy.dev/h/{slug}
Paste this into your webhook provider’s configuration. HookDeploy accepts all standard HTTP methods: GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.
Sending test requests
curl
# JSON body
curl -X POST "https://hookdeploy.dev/h/abc123" \
-H "Content-Type: application/json" \
-H "X-Custom-Header: test-value" \
-d '{"type":"checkout.session.completed"}'
# Form-encoded body
curl -X POST "https://hookdeploy.dev/h/abc123" \
-d "event=invoice.paid&amount=9900"
# GET with query params
curl "https://hookdeploy.dev/h/abc123?source=test&version=1"
httpie
http POST https://hookdeploy.dev/h/abc123 \
Content-Type:application/json \
event=payment_intent.succeeded
Every request returns:
{"request_id":"<uuid>"}
Reading the inspector
Open an endpoint and click any request in the stream. The inspector has four panels:
Overview
Method badge, timestamp, source IP, body size, and content type. If auto-forwarding is enabled, you’ll also see forward status: HTTP status code, response time in milliseconds, and any error message.
Headers
Every header the sender included, displayed as name/value pairs. Header names are shown in lowercase for consistency. Cloudflare and proxy headers (cf-ray, x-forwarded-for, etc.) are preserved as received.
Query string
Parsed query parameters if the request included any. Empty for typical POST webhooks, useful for GET-based callbacks.
Body
The raw request body. JSON payloads are syntax-highlighted and pretty-printed. Binary or non-JSON bodies show as raw text. Bodies larger than your plan limit are rejected at ingestion with 413 — they never appear in the inspector.
Pausing an endpoint
Toggle Paused in endpoint settings. While paused:
- Incoming requests receive
423 Lockedwith{"error":"endpoint paused"} - Existing captured requests remain accessible
- Forwarding does not run
Useful when you’re done testing and don’t want stray webhooks filling your history.
Endpoint limits
Each plan caps the number of endpoints per organization:
| Plan | Max endpoints |
|---|---|
| Free | 5 |
| Starter | 25 |
| Team | 50 |
| Enterprise | Unlimited |
Creating an endpoint beyond your limit returns 429 with code plan_limit via the API, or an error in the dashboard.
Next steps
- Requests — Retention, payload limits, and what gets stored
- Replay — Re-send captured requests to localhost
- Endpoints API — CRUD endpoints programmatically