Skip to main content
AMD, answering machine detection
  • PyAI AMD is live, answering-machine detection that tells your dialer who or what answered a call (human, voicemail, IVR, live receptionist, iPhone/Google screening, dead number, fax) in a fraction of Twilio’s dead-air dwell, with the word-level reason it decided.
  • One-line-TwiML Twilio drop-in: point a <Connect><Stream> at wss://api.pyai.com/v1/amd/stream. The answered_by_twilio field maps to Twilio’s exact AnsweredBy enum, so your routing logic doesn’t change.
  • One aggressiveness dial (0-1, per account via POST /v1/amd/config or per call via a TwiML <Parameter>): human-safe ↔ machine-aggressive.
  • SDKs: pyai.amd.config / pyai.amd.calls (+ amd.stream() in TS); MCP tools configure_amd, list_amd_calls, get_amd_call. New guide: Answering machine detection.
  • Billing: per answered call, first 5,000 answered calls/month free, then $0.004/call; free bundled with PyAI telephony or Omni.
Post-call data capture + Omni tools GA
  • Post-call data capture, declare an extraction_schema + extraction_webhook_url on an agent and PyAI extracts structured JSON from each call’s transcript and delivers it signed (omni.call.extracted). No client or engine code. New guide: Post-call data capture; configure it in the console Agents → Data capture tab.
  • npm create pyai-app@latest scaffolds any runnable example in one command, no clone, no setup. Browse them at the examples repo.
  • New examples, each linked from its guide and exercised in nightly CI: OpenAI drop-in, voice cloning, call analytics, and offline omni-mock.
  • Machine-readable Omni contract: AsyncAPI 3.0 at contracts/omni-asyncapi.yaml, see Omni wire protocol.
  • Omni function calling (tools) is GA, client-loop tool_call / tool_result on the WebSocket. New guide: Omni tools. REST: /v1/tools, /v1/agents/{id}/tools.
  • tools[] moved from roadmap → live in the protocol reference (~5 s default timeout).
One docs home + drift guards
  • docs.pyai.com is now the single home for everything: quickstart, guides, and the generated API reference. api.pyai.com/docs redirects here; api.pyai.com/openapi.json remains the machine-readable contract.
  • Quickstart verifies your key first. A new GET /v1/me step gives you a self-diagnosing first 200 in seconds before any audio call.
  • Docs can’t drift to dead ids. CI now fails if any sample uses a voice or model id that isn’t in the live catalog, every snippet stays copy-paste-runnable.
  • Example voice standardized to stock_dorit_en_us across the quickstart, guides, and SDK READMEs.
Docs accuracy & unified API reference
  • REST reference unified in-site. The full OpenAPI reference now lives inside these docs under the API reference tab (generated from https://api.pyai.com/openapi.json), no more bouncing to a separate page.
  • Hear streaming protocol corrected to match the live API: the engine emits bare frames (partial, partial_stable, speech_final, final, error); force-finalize with {"type":"commit"} (a bare {"type":"end"} is ignored); enable Cue grounding with {"type":"config","grounding":true}. See Stream speech-to-text.
  • Telephony output on Speak: request g711_ulaw / g711_alaw for native 8 kHz μ-law/A-law, no client-side resampling. New reference: Telephony audio with the exact integer resample ratios for the cases where you still convert yourself.
Developer experience
  • New guides: browser voice agent, Twilio phone agent, and FreeSWITCH.
  • Official SDKs: @pyai/sdk (TypeScript/JavaScript) and pyai (Python), plus the pyai CLI smoke tester.
  • Idempotency-Key support and cursor pagination on transcription jobs.
  • Machine-readable error codes documented end to end (see Errors & limits).
  • Sandbox tier: pyai_test_ keys work instantly with no billing gate.