Versioning lifecycle developer guide + outbound caller-ID note
A new developer-guide page documents the full create → draft → publish → activate flow against the public API in curl + Python, with the seven endpoints involved and six common pitfalls (publish does not auto-activate; activate fails inside the security-check window; etc.).
The API reference for POST /agent now points to the drafts flow instead of the deprecated PATCH /workflow/{workflowId} path.
The API reference for POST /conversation/outbound now documents the caller-ID fallback: if you omit fromProductId and the agent has no telephony product attached, the call dispatches from a Smallest-managed Plivo trunk with a default outbound number. The response is still 200 + conversationId, but the recipient sees the default number, not yours. For production traffic, pass fromProductId explicitly or attach a phone-number product to the agent.
New endpoint — prompt scoring
POST /atoms/v1/prompt-scoring/score scores a single-prompt agent’s system prompt across 11 quality dimensions using Gemini-based analysis and returns an overall score (0–100), grade, token-density band, estimated first-token latency overhead, and per-dimension breakdowns.
Pass exactly one of versionId (published version) or draftId (agent draft) in the request body. The endpoint requires a minimum Member role and deducts 1 credit per call. Re-submitting an unchanged prompt returns a 400 — retrieve the cached result via GET /agent/{id} instead. Only single_prompt agents are supported; workflow-graph agents return 400.
Atoms API reference — iteration 1 updates
Agent GET — draft and version config resolution. GET /agent/{id} now accepts ?draftId=<id> and ?versionId=<id> to resolve _resolvedConfig from a specific draft or published version instead of the active config. The response includes _configSource: "draft" | "version" | "active" when either param is used.
Richer call log fields. The List Calls and Get Call responses now include per-call latency statistics (average, median, min, max, per-turn array), auto-generated call summary, evaluated disposition metrics with confidence scores, discounted cost, agent version info (versionId, versionNumber), call type enum (telephony_inbound, telephony_outbound, webcall), and retry tracking fields (retryCallId, retryAttemptNumber).
Agent list filters expanded. GET /agent accepts type, sortField, sortOrder, and archived query parameters.
Agent templates enriched. Template objects now include industry, useCase, callType, workflowType, region, trending, and defaultLanguage fields. The list endpoint accepts a region filter.
New endpoint: archive / unarchive agent. PATCH /agent/{id}/archive toggles an agent’s archived state. Pass ?on=false to unarchive.
Campaigns — filter and enriched response. GET /campaigns now accepts status and name (search) query filters. Campaign objects include new fields: pausedAt, cancelledCalls, errorMessage, and failedAt. The start-campaign endpoint is now idempotent (“Start or resume a campaign”).
Webhooks — replace semantics and single-fetch. The webhook subscription endpoint now replaces all subscriptions for an agent (previously create-only). GET /webhooks accepts an optional ?id= param to retrieve a single webhook by ID.
Audiences — enriched response. Audience objects now include currentMemberCount, hasActiveCampaigns, and activeCampaigns. Error responses distinguish 403 (audience belongs to a different org) from 404 (not found).
Live transcripts SSE — lifecycle events documented. sse_init and sse_close events are now documented alongside the existing transcript event types. Both include event_type and event_time; all other events include event_type, event_id, timestamp, and call_id.
WebSocket query parameters clarified. sample_rate now documents its valid values (8000, 16000, 24000, 48000) and default (24000). The mode parameter (webcall | chat, default webcall) is now included in the connection reference with valid-value enforcement. Connection error codes (401, 503) are documented.
Compliance — 502 errors documented. All compliance endpoints now document a 502 Bad Gateway response for cases where Plivo’s compliance API is unavailable.
Billing feature IDs for Pulse and Pulse Pro have been restructured to namespace by model and transport. The old single-bucket IDs (feature-waves-stt, feature-waves-stt-pro, feature-waves-stt-pro-rpm) are retired; replacements are model + transport specific (for example feature-waves-stt-pulse-non-streaming, feature-waves-stt-pulse-streaming).
Per-minute customer rates on the Standard plan:
Standard plan defaults: 25 RPM per model on non-streaming, 100 concurrent WebSocket sessions. Enterprise: unlimited, configurable per-customer.
The Pulse Pro entitlement is gated by plan; Standard customers who need access can upgrade in the console or contact support.
Default voice activity detection — releaseTimeInSeconds tuned for cleaner turn handoff
The default for releaseTimeInSeconds in DEFAULT_VOICE_DETECTION_CONFIG has been retuned based on transcript-level analysis of how often the model and the user step on each other.
What this affects:
Migration: no action. To opt existing agents into the new default, re-save their config in the Atoms console.
Agent config screen — redesigned layout
The agent configuration screen in the Atoms console has been redesigned. Same fields, same data model — clearer layout, faster editing, inline validation.
What’s new in the UI:
Migration: no action — existing agents are unchanged. Open any agent in the console to see the new layout.
Agent SDK — agent_log and agent_error events are now persisted and visible on call detail
Two new event types are now first-class on Atoms calls:
Where they show up:
Migration: no action — additive. Emit agent_log / agent_error from your agent code to start using them.
Python SDK — SmallestAI(api_key=...) (was token=...) and SMALLEST_API_KEY env var
The SmallestAI and AsyncSmallestAI constructors in the Python SDK now take api_key= (was token=) and default to reading SMALLEST_API_KEY from the environment (was SMALLEST_AI_TOKEN). This aligns the auto-generated client with everything else in the ecosystem:
smallestai.atoms.helpers.{call,campaign,audience,kb}) already take api_key= and read SMALLEST_API_KEY..env.sample exports SMALLEST_API_KEY.Before:
After:
Breaking change. SmallestAI(token=…) and SMALLEST_AI_TOKEN are no longer accepted. Both names shipped only in 4.4.x and were undocumented in any user-facing page, so they’re dropped without a deprecation window. Any in-flight 4.4.x code calling SmallestAI(token=…) needs a one-line rename to api_key=….
Spec update: fern/apis/unified/generators.yml — the bearer-auth token.env value is now SMALLEST_API_KEY, so the next Python SDK regen produces a client with the new kwarg/env var natively (the SDK PR is a hand-patch on top of the Fern-generated client.py that lands the change immediately as 4.4.5).
Realtime Agent — per-call prompt variables
The Realtime Agent WebSocket now accepts a variables query parameter — a URL-encoded JSON object that overrides the agent’s defaultVariables for that session, matching the variables field already exposed on the Start Outbound Call REST endpoint. Each connection scopes its own variables.
Reserved keys (call_id, conversation_type, user_number, agent_number) are stripped server-side.
Pro voices in the agent voice picker — 39 voices across American, British, and Indian accents
The agent voice picker now has a Pro filter chip alongside V3.1 / Others. Selecting it shows the new Lightning v3.1 Pro catalog — 39 voices across American, British, and Indian accents (both Male and Female) running on a dedicated inference pool.
How it works: pick any Pro voice in your agent’s voice configuration and save. Atoms transparently routes that agent’s TTS to the Lightning v3.1 Pro pool. No changes to your code, your webhook handlers, or how you place a call.
Languages: Indian Pro voices speak English and Hindi (with mid-utterance code-switching). British and American Pro voices speak English. The voice picker shows the supported languages per voice.
Switching between Pro and standard voices: changing voice on an existing agent (e.g., Meher → Aarush) updates the routing automatically — the agent reverts to the default Lightning v3.1 pool.
See the Lightning v3.1 Pro launch entry on the models changelog for the full catalog and underlying TTS API details.