HookDeploy

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:

FieldRequiredRules
nameyes1–100 characters
descriptionnostring or null
forward_urlnomust 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:

FieldTypeNotes
namestring1–100 characters
descriptionstring or null
forward_urlstring or nullmust start with https://
pausedbooleanWhen 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