An event is a single webhook occurrence accepted by the ingest endpoint. It moves
through Pending → Processing → Succeeded, or Failed → WaitingRetry → CriticalFailure after
repeated delivery failures.
Get Events
GET /api/v1/events
Returns a page of events belonging to the authenticated tenant. See
Pagination & Filtering for the shared query parameters — note the
default sort field here is acceptedAt, not id.
Auth: Bearer token
Filters (optional)
| Parameter | Type | Description |
|---|---|---|
Status | string | Pending, Processing, Succeeded, Failed, WaitingRetry, CriticalFailure, Cancelled |
DestinationUrlId | UUID | Filter by destination URL |
From | datetime (ISO 8601) | Events accepted from this date/time |
To | datetime (ISO 8601) | Events accepted up to this date/time |
var request = new HttpRequestMessage(HttpMethod.Get,
"https://api.hooksentry.com/api/v1/events?Qt=10&Pg=1&CpOrd=acceptedAt&TpOrd=Desc&Status=CriticalFailure");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— paginated list of events401 Unauthorized— missing or invalid token
{
"total": 12,
"items": [
{
"id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"destinationUrlId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"payload": "{\"event\":\"push\",\"repository\":\"acme/repo\"}",
"status": "Succeeded",
"idempotencyKey": null,
"currentRetryCount": 0,
"nextAttemptAt": null,
"acceptedAt": "2026-07-03T14:32:00.000Z",
"deliveredAt": "2026-07-03T14:32:01.500Z"
}
]
}
Get Event by ID
GET /api/v1/events/{id}
Looks up an event by its unique tracking ID.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Event UUID |
var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.hooksentry.com/api/v1/events/{eventId}");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— event data401 Unauthorized— missing or invalid token403 Forbidden— event belongs to another tenant404 Not Found— event not found
{
"id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"destinationUrlId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"payload": "{\"event\":\"push\",\"repository\":\"acme/repo\"}",
"status": "CriticalFailure",
"idempotencyKey": null,
"currentRetryCount": 10,
"nextAttemptAt": null,
"acceptedAt": "2026-07-03T12:00:00.000Z",
"deliveredAt": null
}
Replay Event
POST /api/v1/events/{id}/replay
Manually reprocesses an event that exhausted all automatic retry attempts. Resets
currentRetryCount to zero, sets nextAttemptAt to now(), and changes status to Pending.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | UUID of the event to replay |
Precondition:
The event must currently have CriticalFailure status — any other status returns
400 Bad Request.
var request = new HttpRequestMessage(HttpMethod.Post, $"https://api.hooksentry.com/api/v1/events/{eventId}/replay");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— event scheduled for replay400 Bad Request— event does not haveCriticalFailurestatus401 Unauthorized— missing or invalid token403 Forbidden— event belongs to another tenant404 Not Found— event not found
{
"id": "2b3c4d5e-6f7a-4b8c-9d0e-1f2a3b4c5d6e",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"destinationUrlId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"payload": "{\"event\":\"push\",\"repository\":\"acme/repo\"}",
"status": "Pending",
"idempotencyKey": null,
"currentRetryCount": 0,
"nextAttemptAt": "2026-07-03T16:05:00.000Z",
"acceptedAt": "2026-07-03T12:00:00.000Z",
"deliveredAt": null
}