---
title: "Register or list outbound webhooks — customer URL receives promise/fact/orchestra/redact events (HMAC if secret). POST write ≤30/hour/key → 429."
method: POST
path: "/v1/pbx/webhooks"
tags: ["PBX Search"]
---

# Register or list outbound webhooks — customer URL receives promise/fact/orchestra/redact events (HMAC if secret). POST write ≤30/hour/key → 429.

`POST /v1/pbx/webhooks`

## Request

- Base URL: `https://api.temsor.com`
- URL: `https://api.temsor.com/v1/pbx/webhooks`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`

POST /v1/pbx/webhooks {url, secret?, events?, ping?} registers. GET lists. ping:true sends a test delivery. Events: promise.opened, promise.closed, fact.extracted, orchestra.act, redact. Signed with x-temsor-signature when secret set. Idle $0. No DID sales. Erasure-aware. Advanced: own PBX/Asterisk stays on customer.

**Credits per call:** 1 · **Operation id:** `pbx_webhooks`

## Request body

- object
  - `url` string: Outbound webhook URL (http/https). Present → register; omit on GET → list.
  - `secret` string: Optional HMAC-SHA256 secret → x-temsor-signature: sha256=<hex>.
  - `events` union: Events: promise.opened|closed, fact.extracted, orchestra.act, redact, or *.
    - string[]
    - string
  - `ping` boolean: If true with url → register then ping; if true without url → ping existing.
  - `webhook_id` string: For ping: target webhook id.
  - `limit` integer: List limit (default 50).

## Response `200`

Success

- object
  - `ok` unknown, required
  - `data` object, required
    - `action` 'list' | 'register' | 'ping', required
    - `pbx_id` string, nullable
    - `count` integer
    - `webhooks` object[]
      - `id` string, required
      - `pbx_id` string, required
      - `url` string, required
      - `secret_hint` string, required
      - `events` string[], required
      - `created_at` string, required
      - `enabled` boolean, required
    - `webhook` object
      - `id` string, required
      - `pbx_id` string, required
      - `url` string, required
      - `secret_hint` string, required
      - `events` string[], required
      - `created_at` string, required
      - `enabled` boolean, required
    - `created` boolean
    - `ping_delivery` object, nullable
      - `id` string, required
      - `webhook_id` string, required
      - `pbx_id` string, required
      - `event` string, required
      - `url` string, required
      - `at` string, required
      - `ok` boolean, nullable, required
      - `status` number, nullable, required
      - `error` string, nullable, required
      - `signed` boolean, required
      - `stub` boolean, required
      - `payload_preview` string, required
    - `deliveries` object[]
      - `id` string, required
      - `webhook_id` string, required
      - `pbx_id` string, required
      - `event` string, required
      - `url` string, required
      - `at` string, required
      - `ok` boolean, nullable, required
      - `status` number, nullable, required
      - `error` string, nullable, required
      - `signed` boolean, required
      - `stub` boolean, required
      - `payload_preview` string, required
    - `events_available` string[]
    - `note` string, required
    - `note_tr` string
  - `meta` object
    - `credits` integer
    - `cached` boolean
    - `requestId` string
    - `durationMs` integer

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `429`: Rate limit exceeded — wait `Retry-After` seconds. The RateLimit headers are sent here too.

---

[API](https://skmtc.dev/temsor/apis/temsor-api.md) · [All operations](https://skmtc.dev/temsor/apis/temsor-api/llms.txt) · [OpenAPI document](https://skmtc.dev/temsor/apis/temsor-api/revisions/19702107e15a?raw)
