Skip to main content

A reply generated for one of your conversations.

Display message to the user as-is; everything else is metadata you can use for ordering, billing, moderation and tracking.

A single generation request can return several answers when the persona sends several messages in a row ("double texting"). They share the same conversation and are linked together by parentAnswerId, so deliver them in order and honour each message's typingTime to keep the conversation natural.

id
string
required

Unique id of this answer, assigned by us. Use it to deduplicate answers on your side: the same answer delivered twice (retry, webhook redelivery) always carries the same id.

Example:

"answer_XXXXXXXXXXXXXXXXXX"

userProfileId
string
required

Id of the user profile this answer is addressed to. Same value as the userProfile.id you sent in the request.

personaProfileId
string
required

Id of the persona profile that wrote this answer. Same value as the personaProfile.id you sent in the request.

message
object
required

What the persona sends to the user: text, media, or both. This is the part you display in your chat.

tags
object
required

The tags you attached to the generation request, returned unchanged. Use them to link the answer back to your own records (campaign, A/B test, operator, …) for tracking and statistics.

cost
string
required

What this answer costs you, in your account currency, as a decimal string with 4 decimals (format 0.0000).

It is returned as a string so no precision is lost when you parse it. When a reply contains several messages, the whole reply is billed once on the first answer and the following ones report 0.0000.

Example:

"0.025"

responseTime
integer<int64>
required

How long we took to produce this answer, in seconds, measured from the moment we accepted your request. It includes the time spent waiting in our queue, so it is not the pure generation time.

Example:

"6"

createdAt
string<date-time>
required

When this answer was generated, in UTC. Format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX (ISO-8601).

Example:

"2026-01-01T12:34:56.789Z"

conversationStopReason
enum<string> | null

Why we stopped this conversation, or null when the conversation can continue normally.

When set, the user has been banned from the conversation until conversationStoppedUntil: stop sending us new messages for this user and persona pair until that date, and handle the user on your side (block, warn, close the chat) according to the reason. You may still receive a final message to deliver, depending on the guardrail settings of your project.

Most bans are progressive and grow with each repeated offence: 2 hours → 12 hours → 24 hours → 48 hours → permanent.

You can override those durations per project for the guardrails that expose an option set. The jailbreak (USER_SUSPICIOUS) and hostility (USER_HOSTILE) bans always use the platform values, and hostility never escalates — it is always 24 hours.

Available options:
USER_UNDERAGE,
MALICIOUS_CONTENT,
USER_SUSPICIOUS,
USER_MESSAGE_REPETITION,
UNKNOWN_LANGUAGE,
USER_HOSTILE,
AI_SUSPICIOUS,
PAUSE_CONVERSATION
conversationStoppedUntil
string | null

Date at which the conversation can resume, in UTC. null when no ban is in effect.

Set together with conversationStopReason. A permanent ban is expressed as a date roughly a century in the future, so you can always compare this date with the current time instead of special-casing permanent bans.

Example:

"2026-01-01T14:30:00.000Z"

parentAnswerId
string | null

Id of the answer this one follows within the same reply, when the persona sends several messages in a row. null for the first (or only) answer of a reply. Chain the answers through this property to display them in the right order.

Example:

"answer_XXXXXXXXXXXXXXXXXX"