The HookDeploy REST API provides programmatic access to endpoints, destinations, captured requests, incidents, replays, usage, members, and integration subscriptions.
Base URL
https://api.hookdeploy.dev/v1
All public routes are prefixed with /v1.
Authentication
Every request, including GET /v1/health, requires an API key in the Authorization header:
Authorization: Bearer hd_live_<your-key>
Create API keys in the dashboard under Settings → API Keys. The full key is shown once; afterward, only its prefix is visible.
Invalid, expired, or revoked keys return:
HTTP/1.1 401 Unauthorized
{
"error": {
"code": "unauthorized",
"message": "Invalid or missing API key."
}
}
See API keys for creation and security guidance.
Response conventions
Successful resources use a data envelope:
{
"data": { }
}
Created resources return HTTP 201. Successful deletes return HTTP 204 with no body.
Some collection endpoints currently place their list and metadata inside a second data object. The resource reference shows the exact response shape for each route; do not assume all collection envelopes are identical.
Errors use an error envelope:
{
"error": {
"code": "not_found",
"message": "Endpoint not found."
}
}
Pagination
Request lists use cursor pagination. The current response nests the list and metadata inside the top-level success envelope:
{
"data": {
"data": [
{
"id": "770e8400-e29b-41d4-a716-446655440002",
"method": "POST",
"captured_at": "2026-05-24T12:00:00Z"
}
],
"meta": {
"count": 1,
"has_more": false,
"next_cursor": null
}
}
}
When data.meta.has_more is true, pass data.meta.next_cursor as the before query parameter. See Requests API for filters and complete examples.
Customer-visible errors
| HTTP | Code | Description |
|---|---|---|
| 400 | bad_request | Invalid input or malformed JSON |
| 401 | unauthorized | Missing or invalid API key |
| 403 | forbidden | The key lacks permission for the action |
| 404 | not_found | Route or resource not found |
| 409 | Resource-specific code | The requested change conflicts with current state |
| 429 | plan_limit | A plan-controlled resource limit prevents the action |
| 500 | internal_error | Unexpected service error |
Webhook ingestion can separately return 429 Too Many Requests when protective limits are active. Monthly request usage is metered and resets at the start of the next calendar month (UTC); the monthly counter is not itself a hard ingestion gate.
Health check
curl -s "https://api.hookdeploy.dev/v1/health" \
-H "Authorization: Bearer hd_live_YOUR_KEY"
{
"data": {
"status": "ok",
"version": "1"
}
}
Documented route directory
| Method | Route | Reference |
|---|---|---|
| GET | /v1/health | Health check above |
| GET, POST | /v1/endpoints | Endpoints API |
| GET, PATCH, DELETE | /v1/endpoints/:id | Endpoints API |
| GET | /v1/endpoints/:id/requests | Requests API |
| GET | /v1/endpoints/:id/requests/:requestId | Requests API |
| GET | /v1/endpoints/:id/requests/:requestId/forward-results/:forwardResultId/response | Requests API |
| GET | /v1/endpoints/:id/destinations | Destinations API |
| GET, POST | /v1/destinations | Destinations API |
| GET | /v1/destinations/:id | Destinations API |
| POST | /v1/endpoints/:id/requests/:requestId/replay | Replay API |
| GET | /v1/incidents | Incidents API |
| GET, PATCH | /v1/incidents/:id | Incidents API |
| POST | /v1/incidents/:id/replay | Incidents API |
| GET | /v1/incidents/sample | Incident subscriptions |
| GET | /v1/incidents/recent | Incident subscriptions |
| GET | /v1/usage | Usage API |
| POST | /v1/members/invite | Members API |
| POST | /v1/members/deactivate | Members API |
| POST | /v1/members/reactivate | Members API |
| GET, POST | /v1/subscriptions | Integration subscription routes |
| DELETE | /v1/subscriptions/:id | Integration subscription routes |
| GET | /v1/subscriptions/sample/:endpointId | Integration sample payload |
| GET, POST | /v1/incident-subscriptions | Incident subscriptions |
| DELETE | /v1/incident-subscriptions/:id | Incident subscriptions |
Cron jobs are managed in the dashboard and are not currently exposed through the public REST API.
Integration subscription deliveries use a 10-second delivery timeout. This is distinct from the 15-second timeout used for standard HTTPS forwarding destinations.