---
title: "E1 moat: who→whom→promise → orchestra handoff intent (whisper/transfer/hold). Idle $0. No live PSTN. Own PBX = advanced footnote."
method: POST
path: "/v1/pbx/promises/act"
tags: ["PBX Search"]
---

# E1 moat: who→whom→promise → orchestra handoff intent (whisper/transfer/hold). Idle $0. No live PSTN. Own PBX = advanced footnote.

`POST /v1/pbx/promises/act`

## Request

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

POST /v1/pbx/promises/act {promise_id, action?}. Loads the promise + call graph, suggests whisper/transfer/hold, records orchestra intent with source_type=promise for agent handoff. Managed SaaS runtime. ≤120/hour/key (shares orchestra bucket). Idle $0. carrier/pstn always false. No cross-tenant graph merge. Advanced: not Asterisk-first glue; own PBX optional footnote.

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

## Request body

- object
  - `promise_id` string, required: Open (or any) promise id — closed loop reads call graph then records orchestra intent.
  - `action` 'whisper' | 'hold' | 'transfer' | 'pci_stop' | 'snoop': Default whisper. transfer uses graph stuck_at / promise.ext.
  - `agent_ext` string
  - `skip_forward` boolean: Default true — record intent only.
  - `stasis_webhook_url` string
  - `pbx_id` string

## Response `200`

Success

- object
  - `ok` unknown, required
  - `data` object, required
    - `ok` boolean, required
    - `loop` 'promise_graph_orchestra', required
    - `phase` 'E1', required
    - `promise_id` string, required
    - `promise` object, nullable, required
      - `id` string, required
      - `call_id` string, required
      - `text` string, required
      - `who` string, required
      - `status` 'open' | 'kept' | 'broken' | 'unknown', required
      - `ext` string, nullable, required
      - `pbx_id` string, required
      - `transfer_count` integer, required
      - `path` string, required
      - `path_tr` string, required
      - `stuck_at_ext` string, nullable, required
    - `graph` object, nullable, required
      - `call_id` string, required
      - `transfer_count` integer, required
      - `edges` object[], required
        - `from_ext` string, nullable, required
        - `to_ext` string, nullable, required
        - `t_ms` number, nullable, required
        - `reason` string, nullable, required
      - `path` string, required
      - `path_tr` string, required
      - `stuck_at_ext` string, nullable, required
      - `stuck_tr` string, nullable, required
    - `suggested_action` 'whisper' | 'hold' | 'transfer' | 'pci_stop' | 'snoop', nullable, required
    - `suggestions` object[], required
      - `action` 'whisper' | 'hold' | 'transfer' | 'pci_stop' | 'snoop', required
      - `reason` string, required
      - `reason_tr` string, required
      - `params` object, required
        - `to_ext` string, nullable
        - `from_ext` string, nullable
        - `agent_ext` string, nullable
        - `channel` string, nullable
        - `text` string, nullable
        - `reason` string, nullable
        - `hold` boolean, nullable
        - `source_id` string, nullable
        - `source_type` string, nullable
    - `act` object, nullable, required
      - `act_id` string, required
      - `call_id` string, required
      - `pbx_id` string, required
      - `action` 'whisper' | 'hold' | 'transfer' | 'pci_stop' | 'snoop', required
      - `params` object, required
        - `to_ext` string, nullable
        - `from_ext` string, nullable
        - `agent_ext` string, nullable
        - `channel` string, nullable
        - `text` string, nullable
        - `reason` string, nullable
        - `hold` boolean, nullable
        - `source_id` string, nullable
        - `source_type` string, nullable
      - `created_at` string, required
      - `mode` 'intent', required
      - `recorded` true, required
      - `note` string, required
      - `note_tr` string, required
    - `carrier` false, required
    - `pstn` false, required
    - `idle_usd` 0, required
    - `note` string, required
    - `note_tr` string, required
  - `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)
