Skip to content
Patch AMD

API reference

Base URL: https://api.patchamd.com. Authenticate with Authorization: Bearer pamd_live_… (or X-API-Key). Machine-readable specs: OpenAPI 3.1 for REST, AsyncAPI 3.0 for the WebSocket.

POST /v1/streams

Mint a single-use signed stream URL (valid 10 minutes) for dialers that can't send headers.

Field Type
webhook_url string HTTPS URL for amd.decided
metadata object Up to 10 string values (≤256 chars), echoed in the webhook. Identifiers only, not call content.
encoding mulaw | alaw | linear16 Raw streams only
sample_rate integer Raw streams only; default 8000
events boolean Also send events on a Telnyx/Twilio socket

Returns 201 with id, url (with token), base_url (without query, for Twilio), token, expires_at.

GET /v1/detections/{id}

{ "id": "det_…", "status": "decided", "carrier": "twilio", "result": "human", "reason": "person_waiting",
  "at_ms": 1620, "billable": true, "metadata": {}, "webhook_status": "delivered",
  "created_at": "…", "decided_at": "…" }

status: pending (minted), streaming, decided, or ended (closed before a decision — not billed). The words heard are not stored, so heard is not here.

GET /v1/usage

Billable detections per UTC day and key. Query: from (inclusive, default first of the month), to (exclusive, default tomorrow), key=this to limit to the calling key.

{ "from": "2026-11-01", "to": "2026-11-11", "total": 2,
  "days": [{ "date": "2026-11-10", "key_id": "key_…", "detections": 2 }] }

WebSocket /v1/stream

wss://api.patchamd.com/v1/stream. Accepts Telnyx media streaming, Twilio Media Streams (told apart by the start message), or raw binary audio when encoding is in the query. See the raw guide for events and close codes.

Authentication, in order: ?token= (signed), Authorization / X-API-Key header, ?api_key= (discouraged), or for Twilio a token / api_key <Parameter>.

Results

result Meaning
human A live person who has stopped talking and is waiting
voicemail A voicemail or answering-machine greeting
ivr Phone menu, auto-attendant, hold queue, recording notice, call screening
unavailable Not in service, cannot be completed, mailbox full or not set up
silence Nobody spoke after the answer
not_sure Could not tell, or the detector failed — treat as a person

Reasons

reason Meaning
person_waiting A person spoke and is waiting for a reply ("Hello?")
recording_detected What was said could only come from a recording or automated system
inconclusive Speech that could not be placed either way (not_sure)
no_speech Nobody spoke
time_limit The listening window ended while the speaker was still talking (→ voicemail)
detector_failed Something failed on our side. Not billed.

Limits

Per key: 600 requests and stream connects per minute, 100 concurrent streams (ask us to raise them). Over a limit: HTTP 429, or close code 4429 for a Twilio start. Revoked keys stop working within 30 seconds.

Errors

REST errors are JSON: {"error": "invalid_request", "message": "…"} with status 400, 401, 403, 404 or 429.