Skip to main content
The Conversations API provides programmatic access to conversation records generated by your PolyAI agents. Query transcripts, turn-by-turn metadata, handoff information, and performance metrics in a structured format–ideal for analytics pipelines, compliance reporting, and downstream integrations.
Most customers should use v3, the latest most performant version.

API versions

Only the Conversations API is versioned. Other APIs are currently unversioned. v3 is the fully supported release of the Conversations API. It runs on PolyAI’s event-sourced data platform and improves on v1 by offering:
  • reliable, scalable ingestion and querying
  • consistent ISO8601 timestamps
  • empty strings ("") instead of null for empty text fields
  • additional turn-level metadata such as latency, translated_user_input, and english_agent_response
Authentication for v3 is managed by PolyAI. Customers must request v3 access through their PolyAI representative. Example base path: https://api.{region}.platform.polyai.app/v3/{account_id}/{project_id}/conversations

v2

v2 uses the same schema and event-sourced backend as v3, but retains the legacy authentication model. Existing customers can continue using v2, but new customers should use v3

v1 – legacy

v1 uses an earlier data pipeline and the legacy authentication system. Deprecation timeline
  • From 2 March 2026, v1 moves to best-effort support (no SLA).
  • From 31 August 2026, v1 remains available but is no longer supported.
Customers on v1 should migrate to v3 before support ends. See the v1 to v3 migration guide for a step-by-step walkthrough.

Regional base URLs

RegionBase URL
UShttps://api.us-1.platform.polyai.app
UKhttps://api.uk-1.platform.polyai.app
EUWhttps://api.euw-1.platform.polyai.app
Endpoint pattern: https://api.{region}.platform.polyai.app/{version}/{account_id}/{project_id}/conversations

Authentication

The Conversations API uses API key authentication.

v3 keys

v3 keys are project- and region-scoped and are issued by PolyAI. Your PolyAI representative will confirm the appropriate scope and provision access.

Retrieval modes (optional)

The v3 endpoint supports three optional retrieval modes powered by Smart Analyst tooling: transcript search, semantic search, and random sampling. When no retrieval mode is specified, the endpoint returns all conversations matching the given filters (default behavior). Only one mode may be used per request.
ModeParameterRequires queryDescription
Transcript searchquery_type=transcriptYesFull-text search over conversation transcripts. Optionally scoped to user or agent turns with turn_type.
Semantic searchquery_type=semanticYesVector similarity search. Returns conversations semantically similar to the query text.
Random samplingsample=randomNoReturns a random sample of conversations in the time range.
query_type and sample are mutually exclusive – you must specify at most one per request.

Query parameters

The Conversations API supports several query parameters for filtering and controlling the response:

Time range parameters

ParameterDescriptionRequired
start_timeStart of time range (ISO8601)Required when using retrieval modes (query_type or sample). Optional otherwise – if omitted, no lower time bound is applied.
end_timeEnd of time range (ISO8601)Required when using retrieval modes (query_type or sample). Optional otherwise – if omitted, no upper time bound is applied.
While start_time and end_time are technically optional for default queries, it is strongly recommended to always provide them to limit the result set and improve response times.

Retrieval mode parameters (optional)

ParameterTypeDescription
query_typestringSearch mode: transcript or semantic. Requires query. Mutually exclusive with sample.
samplestringSampling mode: random. Mutually exclusive with query_type.
querystringThe search text used for transcript or semantic search. Required when query_type is set.
turn_typestringTranscript search only. Filter by user or agent turns. Defaults to both.

Optional filters

ParameterDescriptionDefault
client_envEnvironment: sandbox, pre-release, or livelive
channelOne or more channels to filter by (e.g. voice, chat)
variant_idFilter by variant ID
variant_nameFilter by variant name (URL-encode spaces with %20)
in_progressFilter by conversation status: true for in-progress, false for finishedall
limitMax conversations per request (1–5000)5
offsetPagination offset0

Optional response fields

ParameterDescriptionDefault
include_latencyInclude latency metrics per conversationfalse
include_turn_metadataInclude additional generative AI metadata for each turn. This does not control whether the turns array is returned – turns are always included.false

Response structure

Conversation object

FieldDescription
idUnique conversation ID
account_idCustomer account ID
project_idProject ID
variant_idVariant ID
variant_nameVariant name
environmentDeployment environment (live, sandbox, pre-release)
started_atConversation start time (ISO8601)
channelConversation medium. Common values: VOICE-SIP (voice/telephony), WEBCHAT (webchat widget), CHAT (agent chat). These are analytics-level labels – for runtime channel detection in custom functions, see conv.channel_type.
from_numberCaller phone number
to_numberAgent phone number
in_progressWhether call is still active
num_turnsTotal number of turns in the conversation (integer count)
total_durationTotal call duration (seconds)
polyai_durationPolyAI-handled duration (seconds)
handoffWhether handoff occurred
handoff_reasonBrief handoff reason
handoff_destinationHandoff destination
num_silencesCount of silence turns
num_oodCount of out-of-domain turns
metricsCustom metrics logged by agent
stateAll conversation variables (conv.state values) set during the call, returned as key-value pairs. Includes both built-in keys (e.g. from_, to, call_sid) and any custom variables your agent writes.
turnsOrdered list of conversation turn objects. May be empty if transcript access is disabled in your project’s API configuration (see transcript visibility).

Turn object

FieldDescription
user_inputUser’s transcribed text
user_input_datetimeWhen agent received input (ISO8601)
barge_inWhether user interrupted the agent
agent_responseAgent’s response text
agent_response_datetimeWhen agent responded (ISO8601)
intentsDetected intents
entitiesDetected entities (name → value mapping)
is_oodWhether turn was out-of-domain
is_silenceWhether turn was a silence
translated_user_inputTranslated user input (when enabled)
english_agent_responseEnglish version of response (when enabled)

Pagination

When results exceed the limit, the response includes next_offset. Use this value as the offset parameter in your next request to fetch the next page.

Examples

All examples use the v3 endpoint: GET https://api.{region}.platform.polyai.app/v3/{account_id}/{project_id}/conversations

Retrieve all conversations in a time range

curl -X GET \
  "https://api.us-1.platform.polyai.app/v3/ACCOUNT-xxx/PROJECT-xxx/conversations?start_time=2026-04-01T00:00:00Z&end_time=2026-04-02T00:00:00Z&limit=100" \
  -H "x-api-key: YOUR_API_KEY"

Search transcripts for a keyword

Use query_type=transcript to find conversations containing specific text. Optionally filter by turn_type to search only user or agent turns.
curl -X GET \
  "https://api.us-1.platform.polyai.app/v3/ACCOUNT-xxx/PROJECT-xxx/conversations?start_time=2026-04-01T00:00:00Z&end_time=2026-04-02T00:00:00Z&query_type=transcript&query=cancel%20reservation&turn_type=user&limit=50" \
  -H "x-api-key: YOUR_API_KEY"
Use query_type=semantic to find conversations that are semantically similar to your query, even if the exact words don’t appear in the transcript.
curl -X GET \
  "https://api.us-1.platform.polyai.app/v3/ACCOUNT-xxx/PROJECT-xxx/conversations?start_time=2026-04-01T00:00:00Z&end_time=2026-04-02T00:00:00Z&query_type=semantic&query=customer%20frustrated%20about%20billing&limit=20" \
  -H "x-api-key: YOUR_API_KEY"

Random sampling

Use sample=random to retrieve a random subset of conversations in a time range – useful for quality audits.
curl -X GET \
  "https://api.us-1.platform.polyai.app/v3/ACCOUNT-xxx/PROJECT-xxx/conversations?start_time=2026-04-01T00:00:00Z&end_time=2026-04-08T00:00:00Z&sample=random&limit=10" \
  -H "x-api-key: YOUR_API_KEY"

Filter by channel

Use the channel parameter to restrict results to a specific medium. You can specify it multiple times to include several channels.
curl -X GET \
  "https://api.us-1.platform.polyai.app/v3/ACCOUNT-xxx/PROJECT-xxx/conversations?start_time=2026-04-01T00:00:00Z&end_time=2026-04-02T00:00:00Z&channel=WEBCHAT&limit=50" \
  -H "x-api-key: YOUR_API_KEY"
A successful response includes:
  • complete turn-by-turn transcript
  • consistent timestamps
  • latency metrics (when include_latency=true)
  • translation outputs (when enabled)
  • handoff metadata (if applicable)

Understanding turns, num_turns, and include_turn_metadata

These three fields are often confused. Here’s how they relate:
FieldTypePurpose
turnsArray of turn objectsThe full ordered list of conversation turns. Included by default, but may be empty if transcript access is disabled in the project’s API configuration.
num_turnsIntegerA count of turns in the conversation. This value reflects the number of turns that occurred, even if the turns array is empty due to configuration.
include_turn_metadataQuery parameter (boolean)When true, adds an extra metadata field to each turn with generative AI details. Does not control whether the turns array itself is populated.
include_turn_metadata and include_latency enrich existing turn data – they do not populate an empty turns array. If your turns array is empty, these parameters will have no effect. The turns array is controlled by your project’s transcript visibility setting, not by these query parameters.

Transcript visibility

The turns array in the API response is controlled by the Conversation transcript toggle (underlying field: show_transcripts) in your project’s API key configuration. When transcript access is disabled, the API returns an empty turns array even though num_turns still reports the actual count. This is the most common reason for missing turn data. To check or update this setting:
1

Open the API Keys page

Go to the API Keys tab on the workspace homepage in Agent Studio (next to Agents, Secrets, and Users).API Keys page with Configuration button
2

Open Configuration

Click the Configuration button at the top right of the API Keys page.
3

Enable the Conversation transcript toggle

Inside the configuration panel, find your project and enable the Conversation transcript toggle. You can also select which Response metrics to include in API responses (e.g. CALL_IN_PROGRESS, CALL_COMPLETED, HANDOFF_TO, HANDOFF_REASON).Configuration panel showing transcript toggle and response metrics
These settings apply at the project level, not per key. For data to appear in API responses, both conditions must be met: the API key must have Conversations data permission enabled, and the project must have the relevant metrics and transcript access enabled in the Configuration panel. See API keys for key setup details.

Troubleshooting

turns is empty but num_turns is greater than zero

This is the most common issue reported by API users. Use this decision tree to diagnose the cause:
Empty turns array?
├── Is num_turns > 0?
│   ├── YES → Transcript visibility is disabled (most common cause).
│   │         Go to API Keys > Configuration on the workspace
│   │         homepage and enable "Conversation transcript".
│   └── NO  → No turns were recorded. Check your filters
│             (start_time, end_time, client_env).
└── Are you using the v1 endpoint?
    └── YES → v1 is deprecated. Migrate to v3 for full field support.
              See the migration guide below.
1

Check transcript visibility (most likely fix)

Go to the API Keys tab on the workspace homepage, then click Configuration and verify that the Conversation transcript toggle is enabled for your project. This is a project-level setting. See transcript visibility for details.
2

Confirm you are using v3

Verify your endpoint URL contains /v3/. The v1 API is deprecated and may not return full conversation data. v1 moved to best-effort support on 2 March 2026 and will be unsupported from 31 August 2026.
3

Check if the conversation is in progress

If in_progress is true, turn data may still be arriving and may not be fully available yet.
4

Contact your PolyAI representative

If none of the above applies, this may indicate a data pipeline delay or ingestion issue.

Only seeing basic fields (id, account_id, project_id, started_at)

If the response only contains a subset of expected fields:
  1. Confirm you are on v3. The full response schema (including latency, translated_user_input, english_agent_response, etc.) is only available on v3. Check that your base URL uses /v3/, not /v1/. See the migration guide.
  2. Check your API key permissions. On the API Keys tab of the workspace homepage, verify the API key has Conversations data permission enabled. The key must have the correct permission and the project must have the relevant metrics enabled.
  3. Check metric configuration. On the API Keys tab, click Configuration and verify the response metrics you expect are enabled (e.g. CALL_IN_PROGRESS, CALL_COMPLETED, HANDOFF_TO). If no metrics are selected, the metrics object in the response will be empty.
  4. Check field whitelisting (v1 only). Projects on v1 may have field whitelisting enabled in their project configuration (enable_whitelist: true). When active, the API only returns fields explicitly listed in the project’s API config — typically just id, started_at, account_id, and project_id. If you are on v1 and see this behavior, migrate to v3 where field visibility is controlled through the API Keys Configuration panel instead.

include_latency or include_turn_metadata is not adding data

These parameters enrich existing turn data – they do not populate an empty turns array:
  • include_latency=true adds per-turn latency metrics to each turn object
  • include_turn_metadata=true adds additional generative AI metadata to each turn object
If turns is empty, these parameters have no effect. Fix the underlying cause first (see transcript visibility above).
Last modified on April 20, 2026