Atoms webhooks — full 3-event field reference now in docs

The Atoms webhooks documentation now contains the full field-level schema for all three lifecycle events: pre-conversation, post-conversation, and analytics-completed. Previously the feature page listed only two of the three events and gave bullet-point payload summaries instead of complete examples.

What’s now documented per event:

  • Common envelope (url, description, event, metadata, id) and the common metadata fields.
  • Per-event metadata field tables with types and descriptions.
  • Full, copy-pasteable JSON example bodies.
  • The metadata.callData shape (E.164 numbers, callDuration as float seconds, ISO 8601 timestamps).
  • The metadata.transcript[] turn schema.
  • The dynamic metadata.variables object with guidance to store it as JSON.
  • The metadata.analytics.dispositionMetrics / successMetrics array schema (identifier, value, confidence, reasoning, dispositionMetricPrompt, dispositionMetricType).
  • Event lifecycle and ordering diagram.
  • Integration notes covering the toPhone/fromPhone vs toNumber/fromNumber normalization gotcha, dynamic variables warning, and unit conventions.

API spec update: eventType enum on the subscription endpoints (POST /webhooks/{id}/subscribe, WebhookAgentSubscription schema, etc.) now includes analytics-completed alongside pre-conversation and post-conversation — was 2 values, now 3.

Surfaces updated:

  • fern/products/atoms/pages/platform/features/webhooks.mdx — full rewrite of the canonical reference page.
  • fern/products/atoms/pages/deep-dive/webhooks/webhooks.mdx — corrected JSON examples (fixed callDuration unit error, successMetricsdispositionMetrics/successMetrics split, dynamic-variables note), cross-link added to the feature page for full schema.
  • fern/apis/atoms/openapi/openapi.yaml — 4 eventType enum sites updated.

Agent draft-config — 14 missing fields documented + synthesizer sampleRate

The PATCH /atoms/v1/agent/{id}/drafts/{draftId}/config request body now documents the conversation-control, voice-detection, timeout, and pronunciation fields that were already accepted by the platform but missing from the spec:

  • firstMessage — first message the agent sends; max 500 characters
  • muteUserUntilFirstBotResponse, allowInterruptions, waitForUserToSpeakFirst
  • interruptionBackoffTimer (0–10 seconds)
  • smartTurnConfig — smart turn detection with isEnabled + waitTimeInSecs (0–10)
  • voiceDetectionConfig — VAD tuning (confidence, minVolume, triggerTimeInSecs, releaseTimeInSecs)
  • voiceMailDetectionConfig — voicemail detection with custom endText (max 200 chars)
  • denoisingConfig, redactionConfig (PII redaction in transcripts)
  • pronunciationDicts — array of {word, pronunciation} overrides
  • llmIdleTimeoutConfig — separate timeouts for chat/webcall/telephony (1–300s) plus maxRetries
  • sessionTimeoutConfigtimeoutTimeInSecs (max 3600, default 1800)
  • timezone — IANA label plus offset in minutes from UTC

The synthesizer schema also gains sampleRate (8000, 16000, 24000, 44100).

All fields are optional — a draft save may include any subset. Existing drafts and the POST /campaign request body shape are unchanged.

The deleteAgent operation now points to its real path: DELETE /agent/{id}/archive. The previously documented DELETE /agent/{id} returned 404 because the route does not exist. SDK method name (deleteAgent) is unchanged.

A new CI workflow (api-spec-live-test) now runs on every PR that touches fern/apis/atoms/**, fern/apis/waves/openapi/lightning-v3.1*, or fern/apis/waves/openapi/pulse-stt*. It creates a dummy agent, PATCHes every documented CreateAgentRequest field, asserts the platform’s diff endpoint reports the change, then exercises deleteAgent — catching the same class of silent drift this PR fixed.

Agent versioning guide


Compliance endpoints — phone-number rentals with Plivo identity verification

Five new endpoints under /atoms/v1/compliance/* document the regulatory-compliance flow for renting phone numbers in countries that require identity verification (India, UAE, etc.). Submit an end-user’s documents, track approval status, and resubmit on rejection.

MethodPathPurpose
GET/atoms/v1/compliance/statusGet the current step (form, submitted, accepted, rejected, expired, suspended) for a country / number-type / user-type combination.
GET/atoms/v1/compliance/requirementsDiscover which document types are required. Empty array means no compliance is needed.
POST/atoms/v1/compliance/applicationsSubmit an application with end-user details + supporting documents (multipart form-data).
PATCH/atoms/v1/compliance/applications/{id}Resubmit a rejected application with corrected documents.
POST/atoms/v1/compliance/applications/{id}/refreshManually poll Plivo for status updates (60-second cooldown).

Three new schemas back the responses: ComplianceApplication, ComplianceRequirement, RequiredDocumentType. All endpoints require a Bearer token and are scoped to the calling organization. Rentals in countries that don’t require compliance are unaffected.


Drop-in mobile voice widgets for iOS, Android, React Native, and Flutter

Every mobile stack now has a drop-in voice widget. One component call renders a floating “Ask AI” pill on your host screen and opens a bottom-sheet voice session on tap. Same agent ID across platforms, same pipecat pipeline behind the scenes.

The widgets are thin clients over the public Realtime Agent WebSocket. No WebRTC dependency, no LiveKit SDK, no framework lock-in.


Campaign scheduling, retries, and flat disposition metrics

POST /campaign now accepts scheduledAt (ISO-8601, must be in the future), maxRetries (0–10, default 3), retryDelay (1–1440 minutes, default 15), and phoneNumberIds for outbound caller-ID rotation. Campaigns created with scheduledAt start in scheduled status and auto-dial at the specified time.

Disposition metrics on postCallAnalyticsConfig now use a flat dispositionMetricType field instead of the nested dispositionValues.type shape. Both the spec and docs reflect this; existing payloads with the nested shape continue to work but the flat form is the documented one going forward.


Realtime Agent WebSocket API and WebSocket SDK

The public WebSocket protocol for talking to an Atoms agent is now documented as an AsyncAPI spec and rendered in the API reference. Connect at wss://api.smallest.ai/atoms/v1/agent/connect. Exchange input_audio_buffer.append, output_audio.delta, agent_start_talking, agent_stop_talking, and interruption events.

A JavaScript SDK for embedding the same flow in a web page is published on npm as @smallest-ai/agent-sdk. It wraps the WebSocket, microphone capture, and audio playback.


Agent versioning and post-call metrics

Every agent now has immutable published versions. Configuration changes flow through drafts; publishing a draft creates a new version that can be activated or rolled back. The prior in-place config mutation via PATCH /agent/{id} returns 400 on config-level fields.

Post-call disposition metrics are now a first-class field on the agent draft config. The backend extracts structured metric values from each call transcript and surfaces them on the call log.