RinghouseAPI reference
Get started

Webhooks

Create a webhook

Subscribe. The signing secret is in this response, and in a rotate's, and nowhere else.

POST/v1/webhooks

Needs the webhooks:write scope.

Body parameters

eventsstring[]required
What to send there. At least one; unknown names are refused rather than ignored.
namestring
What you call it, up to 80 characters. Optional.
numberIdsstring[]
Only calls and messages on these numbers. Omit to hear every number, including ones added later.
urlstringrequired
Where to POST. Must be https, and must be somewhere on the public internet.

Returns

The subscription, with its signing secret. A failed call answers with an error instead.

idstring
createdAtstring
disabledAtstringnullable
Null while the endpoint is live; set when we stopped trying, with `disabledReason` saying why.
disabledReasonstringnullable
eventsstring[]
namestringnullable
What the workspace calls it; null when nobody named it.
numberIdsstring[]nullable
The numbers whose calls and messages it hears; null means every number.
urlstring
secretstring
Verify every delivery against this. Keep it: no read hands it back, only a rotate replaces it.
curl -X POST https://api.ringhouse.ai/v1/webhooks \
  -H "Authorization: Bearer rh_live_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "events": "<string[]>",
    "name": "<string>",
    "numberIds": "<string[]>",
    "url": "<string>"
  }'
{
  "id": "8c1d4e7a-5b2f-4a90-9e1c-3f7d2b6a1c08",
  "createdAt": "2026-09-25T14:02:11Z",
  "disabledAt": null,
  "disabledReason": null,
  "events": [
    "call.missed"
  ],
  "name": "Missed calls → Slack",
  "numberIds": null,
  "url": "https://hooks.example.com/ringhouse",
  "secret": "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw"
}