List webhook endpoints
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://api.roundrobinbot.eu/v1/webhooks"), Headers = { { "Authorization", "Bearer <token>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://api.roundrobinbot.eu/v1/webhooks"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://api.roundrobinbot.eu/v1/webhooks") .get() .addHeader("Authorization", "Bearer <token>") .build();
Response response = client.newCall(request).execute();import axios from 'axios';
const options = { method: 'GET', url: 'https://api.roundrobinbot.eu/v1/webhooks', headers: {Authorization: 'Bearer <token>'}};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}const url = 'https://api.roundrobinbot.eu/v1/webhooks';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}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.
Authorizations
Section titled “Authorizations”Responses
Section titled “Responses”OK
The envelope every /v1 collection comes back in.
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
What the receiving system is called. Shown in the dashboard, never used for lookup.
Where we post. Always https.
What this endpoint receives: duty.changed, nobody.on_call, rotation.created, rotation.updated, rotation.deleted.
enabled or disabled. There is no revoked state: delete the endpoint instead.
Why we stopped calling: manual, delivery_failures or plan_downgrade. Absent while the endpoint is enabled.
Which secret is signing now, so your logs and ours name the same one.
The outgoing secret during a rotation’s grace window, absent at every other time.
When the outgoing secret stops signing. Until then both signatures travel in one header, so a receiver can cut over without an outage.
When the endpoint was registered.
Examplegenerated
{ "data": [ { "id": "example", "name": "example", "url": "example", "eventTypes": [ "example" ], "state": "example", "disabledReason": "example", "currentSecretId": "example", "currentSecretCreatedAt": "2026-04-15T12:00:00Z", "previousSecretId": "example", "previousSecretExpiresAt": "2026-04-15T12:00:00Z", "createdAt": "2026-04-15T12:00:00Z", "updatedAt": "2026-04-15T12:00:00Z" } ], "page": 1, "pageSize": 1, "totalItems": 1, "totalPages": 1}Bad Request
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Unauthorized
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Forbidden
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}Not Found
object
Examplegenerated
{ "type": "example", "title": "example", "status": 1, "detail": "example", "instance": "example"}