The Endpoints API manages your webhook receivers — create URLs, configure forwarding, pause endpoints, and delete them programmatically.
List endpoints
GET /v1/endpoints
Returns all endpoints for the authenticated organization.
curl -s "https://api.hookdeploy.dev/v1/endpoints" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
Response:
{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"organization_id": "660e8400-e29b-41d4-a716-446655440001",
"created_by": null,
"slug": "abc123",
"name": "Stripe webhooks",
"description": "Production Stripe events",
"forward_url": "https://example.com/webhooks/stripe",
"paused": false,
"created_at": "2025-05-23T12:00:00Z",
"updated_at": "2025-05-23T12:00:00Z"
}
]
}
Send webhooks to https://hookdeploy.dev/h/{slug}.
Create endpoint
POST /v1/endpoints
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://example.com/webhooks/stripe"
}'
Body fields:
| Field | Required | Rules |
|---|---|---|
name | yes | 1–100 characters |
description | no | string or null |
forward_url | no | must start with https:// if provided |
Response: 201 Created with the endpoint object in data.
If you’ve reached your plan’s endpoint limit:
HTTP/1.1 429 Too Many Requests
{
"error": {
"code": "plan_limit",
"message": "Maximum endpoints reached for your plan."
}
}
Get endpoint
GET /v1/endpoints/:id
curl -s "https://api.hookdeploy.dev/v1/endpoints/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
Response: endpoint object in data, or 404 not_found.
Update endpoint
PATCH /v1/endpoints/:id
Partial update — only include fields you want to change.
curl -s -X PATCH "https://api.hookdeploy.dev/v1/endpoints/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer hd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Updated name",
"description": "New description",
"forward_url": "https://example.com/new-url",
"paused": true
}'
All body fields optional:
| Field | Type | Notes |
|---|---|---|
name | string | 1–100 characters |
description | string or null | |
forward_url | string or null | must start with https:// |
paused | boolean | When true, rejects incoming webhooks with 423 |
Response: updated endpoint object in data.
Delete endpoint
DELETE /v1/endpoints/:id
Permanently deletes the endpoint and all captured requests (cascade).
curl -s -X DELETE "https://api.hookdeploy.dev/v1/endpoints/550e8400-e29b-41d4-a716-446655440000" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
Response: 204 No Content
The public URL https://hookdeploy.dev/h/{slug} immediately returns 404.
Complete workflow example
# 1. Create
ENDPOINT=$(curl -s -X POST "https://api.hookdeploy.dev/v1/endpoints" \
-H "Authorization: Bearer hd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Test", "forward_url": "https://webhook.site/unique-id"}')
ENDPOINT_ID=$(echo $ENDPOINT | jq -r '.data.id')
SLUG=$(echo $ENDPOINT | jq -r '.data.slug')
# 2. Send a test webhook
curl -s -X POST "https://hookdeploy.dev/h/$SLUG" \
-H "Content-Type: application/json" \
-d '{"test": true}'
# 3. List requests
curl -s "https://api.hookdeploy.dev/v1/endpoints/$ENDPOINT_ID/requests" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
# 4. Pause
curl -s -X PATCH "https://api.hookdeploy.dev/v1/endpoints/$ENDPOINT_ID" \
-H "Authorization: Bearer hd_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"paused": true}'
# 5. Delete
curl -s -X DELETE "https://api.hookdeploy.dev/v1/endpoints/$ENDPOINT_ID" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
Next steps
- Requests API — List captured requests for an endpoint
- Endpoints concept — Slugs, pausing, forwarding
- Usage API — Check endpoint count against plan limits