A sender is an optional identity scoped to a destination URL. Senders get their own ingest token and can apply a payload mapping before the event reaches the queue — useful when several upstream services share one destination and you want to normalize their payloads before delivery.
Create Sender
POST /api/v1/destinations/{destinationId}/senders
Creates a sender linked to a destination URL.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
destinationId | UUID | Destination URL UUID |
Body
| Field | Type | Required | Description |
|---|---|---|---|
label | string | No | Descriptive name for identification in the dashboard — max 255 characters |
Ingest token shown only once:
The ingestToken returned in the 201 response is shown only once — save it to configure the
webhook in the external service. Use Regenerate Sender Ingest Token
if you lose it.
var request = new HttpRequestMessage(HttpMethod.Post,
$"https://api.hooksentry.com/api/v1/destinations/{destinationId}/senders")
{
Content = JsonContent.Create(new { label = "GitHub Webhooks" })
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
201 Created— sender created with ingest token400 Bad Request— invalid label or control characters401 Unauthorized— missing or invalid token403 Forbidden— destination URL belongs to another tenant404 Not Found— destination URL not found
{
"id": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
"destinationId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"label": "GitHub Webhooks",
"hasMapping": false,
"ingestToken": "sndr_5f8a3b2c1d9e4f6a7b8c9d0e1f2a3b4c",
"createdAt": "2026-07-03T14:32:00.000Z",
"updatedAt": "2026-07-03T14:32:00.000Z"
}
Get Senders
GET /api/v1/destinations/{destinationId}/senders
Returns a page of senders linked to the specified destination URL. See Pagination & Filtering for the shared query parameters.
Auth: Bearer token
var request = new HttpRequestMessage(HttpMethod.Get,
$"https://api.hooksentry.com/api/v1/destinations/{destinationId}/senders?Qt=10&Pg=1&CpOrd=id&TpOrd=Desc");
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 senders400 Bad Request— invalid sort field401 Unauthorized— missing or invalid token403 Forbidden— destination URL belongs to another tenant404 Not Found— destination URL not found
{
"total": 1,
"items": [
{
"id": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
"destinationId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"label": "GitHub Webhooks",
"hasMapping": false,
"createdAt": "2026-07-03T14:32:00.000Z",
"updatedAt": "2026-07-03T14:32:00.000Z"
}
]
}
Get Sender by ID
GET /api/v1/senders/{id}
Returns data for a sender belonging to the authenticated tenant.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.hooksentry.com/api/v1/senders/{senderId}");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— sender data401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found
{
"id": "9e0f1a2b-3c4d-4e5f-8a6b-7c8d9e0f1a2b",
"destinationId": "7d8e9f0a-1b2c-4d3e-8f5a-6b7c8d9e0f1a",
"tenantId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"label": "GitHub Webhooks",
"hasMapping": false,
"createdAt": "2026-07-03T14:32:00.000Z",
"updatedAt": "2026-07-03T14:32:00.000Z"
}
Delete Sender
DELETE /api/v1/senders/{id}
Removes a sender from the authenticated tenant. The associated ingest token is invalidated immediately.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
var request = new HttpRequestMessage(HttpMethod.Delete, $"https://api.hooksentry.com/api/v1/senders/{senderId}");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
204 No Content— sender removed401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found
Regenerate Sender Ingest Token
POST /api/v1/senders/{id}/ingest-token
Generates a new ingest token for the sender, immediately invalidating the previous one.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
var request = new HttpRequestMessage(HttpMethod.Post,
$"https://api.hooksentry.com/api/v1/senders/{senderId}/ingest-token");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— new ingest token generated401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found
{
"ingestToken": "sndr_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
}
Set Sender Mapping
POST /api/v1/senders/{id}/mapping
Defines payload transformation rules for the sender, applied during ingestion when the sndr_
token is used. The body is a JSON object where each key is a field in the output payload and the
value is a DSL expression describing the source.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
Mapping DSL
| Expression | Meaning |
|---|---|
"field" | Copies field from the root |
"obj:field" | Accesses obj.field — : is the nesting separator |
"array[n]" | Accesses index n of an array field |
"a+b" | Arithmetic sum (numeric) or concatenation (string) |
["expr1", "expr2"] | Builds a new array from the resolved values |
var request = new HttpRequestMessage(HttpMethod.Post, $"https://api.hooksentry.com/api/v1/senders/{senderId}/mapping")
{
Content = JsonContent.Create(new
{
eventId = "id",
userName = "user:name",
repoName = "repository:full_name",
action = "action",
tags = new[] { "ref", "head_commit:id" }
})
};
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— mapping saved400 Bad Request— body is not a valid JSON object, or a mapping already exists for this sender401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found
{
"mapping": {
"eventId": "id",
"userName": "user:name",
"repoName": "repository:full_name",
"action": "action",
"tags": ["ref", "head_commit:id"]
}
}
Get Sender Mapping
GET /api/v1/senders/{id}/mapping
Returns the configured payload mapping for the sender.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.hooksentry.com/api/v1/senders/{senderId}/mapping");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
200 OK— configured mapping401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found, or no mapping configured
{
"mapping": {
"eventId": "id",
"userName": "user:name",
"repoName": "repository:full_name",
"action": "action",
"tags": ["ref", "head_commit:id"]
}
}
Delete Sender Mapping
DELETE /api/v1/senders/{id}/mapping
Removes the configured mapping. After removal, events ingested via this sender's token are queued with the raw payload, without transformation.
Auth: Bearer token
Path parameters
| Parameter | Type | Description |
|---|---|---|
id | UUID | Sender UUID |
var request = new HttpRequestMessage(HttpMethod.Delete, $"https://api.hooksentry.com/api/v1/senders/{senderId}/mapping");
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
using var client = new HttpClient();
var response = await client.SendAsync(request);
Return codes
204 No Content— mapping removed401 Unauthorized— missing or invalid token403 Forbidden— sender belongs to another tenant404 Not Found— sender not found