Skip to content

List webhook endpoints

GET
/v1/webhooks
curl --request GET \
--url https://api.roundrobinbot.eu/v1/webhooks \
--header 'Authorization: Bearer <token>'

Every endpoint this workspace holds, enabled and disabled alike: a disabled row and its reason are the answer to “our system stopped getting events”, so hiding them would make that unanswerable. No paging parameters. A workspace holds at most ten endpoints, so the answer is always one page; the envelope is the same one every /v1 collection uses, so nothing about a client’s loop has to change if that cap ever moves. Collections carry no ETag.

OK

Media typeapplication/json

The envelope every /v1 collection comes back in.

object
data
Array<object>

A registered destination: where Round Robin posts this workspace’s events, what it is subscribed to, and whether we are still calling it. Never the signing secret.

object
createdAt

When the endpoint was registered.

string format: date-time
currentSecretCreatedAt
null | string format: date-time
currentSecretId

Which secret is signing now, so your logs and ours name the same one.

null | string
disabledReason

Why we stopped calling: manual, delivery_failures or plan_downgrade. Absent while the endpoint is enabled.

null | string
eventTypes

What this endpoint receives: duty.changed, nobody.on_call, rotation.created, rotation.updated, rotation.deleted.

Array<string>
id
string
name

What the receiving system is called. Shown in the dashboard, never used for lookup.

string
previousSecretExpiresAt

When the outgoing secret stops signing. Until then both signatures travel in one header, so a receiver can cut over without an outage.

null | string format: date-time
previousSecretId

The outgoing secret during a rotation’s grace window, absent at every other time.

null | string
state

enabled or disabled. There is no revoked state: delete the endpoint instead.

string
updatedAt
null | string format: date-time
url

Where we post. Always https.

string
page
integer format: int32
pageSize
integer format: int32
totalItems
integer format: int64
totalPages
integer format: int32
Examplegenerated
{
"data": [
{
"createdAt": "2026-04-15T12:00:00Z",
"currentSecretCreatedAt": "2026-04-15T12:00:00Z",
"currentSecretId": "example",
"disabledReason": "example",
"eventTypes": [
"example"
],
"id": "example",
"name": "example",
"previousSecretExpiresAt": "2026-04-15T12:00:00Z",
"previousSecretId": "example",
"state": "example",
"updatedAt": "2026-04-15T12:00:00Z",
"url": "example"
}
],
"page": 1,
"pageSize": 1,
"totalItems": 1,
"totalPages": 1
}

Bad Request

Media typeapplication/json
object
detail
null | string
instance
null | string
status
null | integer format: int32
title
null | string
type
null | string
Examplegenerated
{
"detail": "example",
"instance": "example",
"status": 1,
"title": "example",
"type": "example"
}

Unauthorized

Media typeapplication/json
object
detail
null | string
instance
null | string
status
null | integer format: int32
title
null | string
type
null | string
Examplegenerated
{
"detail": "example",
"instance": "example",
"status": 1,
"title": "example",
"type": "example"
}

Forbidden

Media typeapplication/json
object
detail
null | string
instance
null | string
status
null | integer format: int32
title
null | string
type
null | string
Examplegenerated
{
"detail": "example",
"instance": "example",
"status": 1,
"title": "example",
"type": "example"
}

Not Found

Media typeapplication/json
object
detail
null | string
instance
null | string
status
null | integer format: int32
title
null | string
type
null | string
Examplegenerated
{
"detail": "example",
"instance": "example",
"status": 1,
"title": "example",
"type": "example"
}