# Feature Matrix

> Telephony capabilities supported by ClutchCall, mapped to the primitive that implements each one.

A capability index. Each row is a feature; the right-hand column points
at the RPC, admin DTO, or codec path that implements it. Use this as a
lookup when you need to know whether something is supported and where
to wire it.

## Origination & termination

| Feature | Yes / How |
| ------- | --------- |
| **Outbound PSTN dialing** | Yes. `Originate` RPC. E.164 destinations or full SIP URIs. |
| **Inbound PSTN handling** | Yes. Configure per-trunk via `SetInboundRouting` (REJECT / PLAY-AND-HANGUP / NOTIFY-AND-HANGUP / HANDLE-AI). |
| **Bulk / predictive dialing** | Yes. `OriginateBulk` reads CSV, paces at user-set CPS, caps concurrent channels. `AbortBulk` cancels mid-flight. |
| **Click-to-call** | Yes. `Originate` with `default_app=ANSWER` and the agent's softphone as the call_from. |
| **Multi-trunk LCR** | Yes via [`AddTrunk`](/admin/trunks) per carrier; the gateway picks the cheapest healthy trunk per destination prefix. |
| **Failover / circuit breaker** | Yes. Per-trunk circuit breaker trips on consecutive 5xx; surfaces in `ApiTrunkConfig.is_cb_tripped`. |
| **Number portability lookups** | On request — depends on carrier integration. |

## Call control

| Feature | Yes / How |
| ------- | --------- |
| **Hangup (any leg)** | `Terminate` RPC. |
| **Park** | `ExecuteDialplan(action=PARK)`. |
| **Music on hold** | `ExecuteDialplan(action=MUSIC_ON_HOLD, app_args=<url>)`. |
| **Playback prompt** | `ExecuteDialplan(action=PLAYBACK, app_args=<url>)`. |
| **Unpark** | `ExecuteDialplan(action=UNPARK_AND_BRIDGE)` reattaches a parked call to its bridge partner. |
| **Hold / resume** | `CHANNEL_HOLD` / `CHANNEL_RESUME` events. From the SDK, use `ExecuteDialplan(MUSIC_ON_HOLD)` then `ExecuteDialplan(UNPARK_AND_BRIDGE)`. |
| **Call screening** | Inbound rule = `NOTIFY_AND_HANGUP` fires a webhook before answering, letting your app decide. |
| **Barge (AI barge-in)** | `Barge` RPC. **The platform's headline AI-network unblocker** — when the AI is talking, the gateway watches the inbound leg for the human's voice (energy / VAD / semantic, configurable per trunk via `auto_bargein_mode`). When the human starts talking the AI's outbound audio is gated within `barge_in_patience_ms` (default 250 ms) so the human is heard immediately. Without it AI voicebots feel deaf. Trunk knobs: `auto_bargein_mode`, `auto_bargein_aggressiveness`. Per-call knobs on `OriginateRequest`: `auto_barge_in`, `barge_in_patience_ms`. |
| **Stuck-call cleanup (bucket actions)** | `GetActiveBuckets` / `GetBucketCalls` / `ExecuteBucketAction` enumerate calls stuck in a bucket (parked, abandoned, orphaned) and bulk-act on them — typically `0=hangup` to clear stuck calls during ops incidents. **Not** a transfer or conferencing primitive. |
| **Transfer (blind / attended)** | *Not supported.* Out of scope on this platform. |
| **Conference (3+ parties)** | *Not supported.* Out of scope on this platform. |
| **Whisper / coach** | *Not supported.* Out of scope on this platform. |

## Audio handling

| Feature | Yes / How |
| ------- | --------- |
| **Codec support** | PCMU, PCMA (G.711); PCM16; Opus; G.722. Per-trunk preference list. |
| **Transcoding** | Automatic on egress (e.g. linear16 from AI → PCMU to PSTN). SIMD path inside the C++ core. |
| **AEC / AGC / NS** | WebRTC-grade pipeline runs on every WebRTC leg. Configurable per call. |
| **VAD-based barge-in** | Yes. `OriginateRequest.auto_barge_in` + `barge_in_patience_ms`. |
| **DTMF (RFC 2833)** | Yes. Default. |
| **DTMF (SIP INFO)** | Yes. Falls back when 2833 isn't negotiated. |
| **DTMF (in-band)** | Detected; not preferred. |
| **DTMF masking** | For PCI-DSS: redact DTMF tones from the recording stream while passing them to the dialplan. |
| **Pre-answer / early media** | Pass-through. |
| **Comfort noise** | Generated when the far end transmits silence. |
| **Echo reference** | Per-leg AEC reference; ERL > 20 dB target. |

## AI / agent integration

| Feature | Yes / How |
| ------- | --------- |
| **AI websocket bridge** | `OriginateRequest.ai_websocket_url`. Audio bidirectional; framing per the AI vendor (OpenAI Realtime, Deepgram, ElevenLabs, etc). |
| **AI QUIC bridge** | `OriginateRequest.ai_quic_url`. Lower-latency option for first-party AI services. |
| **Inbound AI handoff** | `SetInboundRouting(rule=HANDLE_AI)` + `inbound_ai_websocket_url`. |
| **Agent DAGs** | Yes — multi-step orchestration (TTS → STT → LLM → tool call → branch). Published via [admin API](/admin/agent-dags). Versioned. |
| **Live transcription** | Pipe `on_audio_frame` to your STT. ClutchCall doesn't bundle an STT — you pick. |
| **Streaming TTS** | Pipe TTS PCM into `push_audio`. ClutchCall resamples to the trunk codec. |
| **Tool / function calling** | Driven by your AI; the gateway just shuttles audio and DTMF. |
| **Human-in-the-loop transfer** | Mid-call: pause the AI, originate a human leg, bridge. |

## Reliability & scale

| Feature | Yes / How |
| ------- | --------- |
| **Active-active multi-region** | Multi-region deployment supported. Calls pinned to ingress region; CDR replicated globally. |
| **Per-tenant CPS quotas** | Enforced. Excess returns `ERR_RATE_LIMITED`. |
| **Per-trunk channel caps** | `AddTrunk.channel_limit`. New attempts past the cap fail closed. |
| **Circuit-breaker** | Per-trunk; trips on consecutive carrier 5xx. |
| **Hot certificate reload** | `ReloadCertificates` admin RPC. No connection drops. |
| **Zero-downtime upgrades** | Single-binary rolling deploy; QUIC connection migration keeps in-flight calls. |
| **Rate-limited admin** | Admin RPCs throttled separately from call-control. |

## Compliance & regulation

| Feature | Yes / How |
| ------- | --------- |
| **STIR/SHAKEN signing** | Outbound INVITEs signed with the configured PASSporT cert. Attestation A/B/C selectable per trunk. |
| **STIR/SHAKEN validation** | Inbound `Identity` headers verified; result surfaces in `CallEvent.status`. |
| **P-Asserted-Identity** | Set per trunk. |
| **PIDF-LO / E911 location** | Trunk-default civic address; per-call override via `ExecuteDialplan(ANSWER, app_args=<json>)`. |
| **DNC suppression** | Upload list per campaign; checked before each `Originate`. |
| **Recording consent prompts** | Playback prompt on connect (jurisdiction-dependent). |
| **Recording encryption** | Recordings written to your storage encrypted at rest (AES-256). |
| **Retention controls** | Per-tenant retention window applied to CDRs and recordings. |
| **HIPAA** | BAA available; recording storage encryption mandatory. |
| **PCI-DSS** | DTMF masking + per-stream redaction tags. |
| **GDPR / CCPA** | Right-to-be-forgotten ⇒ purge tenant CDRs + recordings older than the retention window. |
| **CALEA** | Honoured at the carrier upstream of ClutchCall; not a ClutchCall-side feature. |

## Observability

| Feature | Yes / How |
| ------- | --------- |
| **CDRs** | Pushed to ClickHouse; full schema in [Telemetry](/platform/telemetry). |
| **Live event stream** | `StreamEvents` RPC; `CallEvent` per state transition. |
| **Prometheus metrics** | `/metrics` on every gateway shard. |
| **OpenTelemetry traces** | OTLP HTTP/gRPC exporter; `tenant.id` and `call.sid` on every span. |
| **SIP packet capture** | HEPv3 to Homer / heplify. |
| **Recording** | Per-call. Stored at the trunk-configured URL or in your S3. |
| **Audit log** | All admin RPCs logged with the issuing service-account `kid`. |

## WebRTC

Browser-side and vendor-bridge surface area:

| Feature | Yes / How |
| ------- | --------- |
| **DTLS-SRTP media** | Mandatory; full key-exchange via the standard `a=fingerprint` SDP attribute. |
| **ICE / STUN / TURN** | ICE-lite gateway-side. The platform publishes `host` and `srflx` candidates; clients TURN-relay through their own server when needed. |
| **Codec negotiation** | Opus + PCMU offered by default; PCMA, G.722 negotiable. Transcoded to the trunk codec on bridge. |
| **Audio processing pipeline** | AEC + AGC + NS run on every WebRTC leg, per direction. |
| **Browser SDK** | TypeScript/WASM. Audio surfaced as a standard `MediaStreamTrack`. |
| **LiveKit adapter** | Joins as a participant, subscribes to one track, bridges to the matching `call_sid`. JWT-authenticated. |
| **Daily adapter** | JSON text-frame signaling, hidden participant join. |
| **Chime adapter** | AWS SigV4 + Chime `JoinToken`; meeting must be created out-of-band. |
| **Twilio Media Streams** | PCMU 8 kHz pass-through; `X-Twilio-Signature` HMAC-validated. |
| **Vapi adapter** | Linear16 16 kHz ingress, resampled to PCMU on egress. |
| **getStats() exposure** | Every WebRTC leg's `RTCStats` (jitter, loss, ICE candidate type, REMB, NACK rate) surfaces in the per-leg event stream. |
| **simulcast / SVC** | Audio-only platform — N/A. |
| **Datachannels** | Not exposed; SDK uses WebTransport for control instead. |

See [WebRTC Vendor Adapters](/platform/webrtc-vendors) for tenant-scoped
URL paths and per-vendor auth details.

## Other transports

| Feature | Yes / How |
| ------- | --------- |
| **WebTransport** | Browser control plane (RPC envelopes); same QUIC port as native SDKs. |
| **QUIC (native SDKs)** | Direct binary RPC for Python / Go / Rust / Java / .NET. |
| **Generic SIP** | Yes. Carrier-agnostic. |
| **HTTP/3 fallback** | Optional; verification endpoint only. Not a media transport. |

## Out of scope

Capabilities the platform deliberately does not implement:

- **Video.** Audio-only.
- **Fax / T.38.** Pass-through only via raw SIP; no T.38 stack.
- **On-prem PBX replacement.** ClutchCall is a gateway/orchestrator. It runs alongside Asterisk / Cisco UCM, not in place of them.
- **First-party STT / TTS / LLM.** Bring-your-own; the platform provides the audio pipe and the agent-DAG runner.
- **First-party DID procurement.** DIDs are obtained from a carrier and then attached to a trunk via [`AddTrunk`](/admin/trunks).
- **CRM-side dashboards.** CDRs and events are emitted; consumers wire them into Salesforce / HubSpot / etc.
