---
title: "Light CRM from call graph / facts — caller phones+names and extension identities seen on transfers."
method: POST
path: "/v1/pbx/persons"
tags: ["PBX Search"]
---

# Light CRM from call graph / facts — caller phones+names and extension identities seen on transfers.

`POST /v1/pbx/persons`

## Request

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

GET /v1/pbx/persons?call_id=&kind=caller|extension|all&q=&limit=50. Durable Person rows from pbx-index plus derived extension identities (ext_NNN) from Transfer edges / promise.ext. Scoped by x-temsor-pbx-key. Idle $0. No DID sales. Right-to-erasure ready. Advanced: own PBX/Asterisk stays on customer.

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

## Request body

- object
  - `call_id` string: Filter persons seen on this call id.
  - `kind` 'caller' | 'extension' | 'all': caller = durable Person; extension = derived from call-graph hops; all = both.
  - `q` string: Free-text over names, phones, org, extensions, facts.
  - `include_extensions` boolean: Include derived extension identities (default true).
  - `limit` integer: Max persons to return (1–200).

## Response `200`

Success

- object
  - `ok` unknown, required
  - `data` object, required
    - `pbx_id` string, nullable, required
    - `count` integer, required
    - `limit` integer, required
    - `filters` object, required
      - `call_id` string, nullable, required
      - `kind` string, required
      - `q` string, required
      - `include_extensions` boolean, required
    - `persons` object[], required
      - `id` string, required
      - `kind` 'caller' | 'extension', required
      - `phones` string[], required
      - `names` string[], required
      - `org` string, nullable, required
      - `pbx_id` string, required
      - `call_ids` string[], required
      - `call_count` integer, required
      - `extensions_seen` string[], required
      - `open_promise_count` integer, required
      - `fact_kinds` string[], required
      - `fact_samples` string[], required
      - `last_seen_at` string, nullable, required
      - `path_sample_tr` string, nullable, required
      - `kind_label_tr` string, required
    - `note` 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)
