Custom extraction fields tell post-call analysis exactly what to pull out of each call. Every field becomes a key in call_analysis.custom_analysis_data, typed the way you defined it, so you can filter, chart and act on it without parsing transcripts.
Add a field in the dashboard#
Open Post-Call Extraction#
Open the agent and expand Post-Call Extraction in the settings column.
Pick a type#
Click Add and choose Text, Selector, Boolean or Number.
Fill in the field#
Enter the Name and Description, then the type-specific options and an optional Only extract when condition. Tick Required if the model must always return a value.
Save and publish#
Click Save. The field is saved to the agent. Calls handled by an agent version that includes the field get a value for it. To fill it on past calls, backfill them.
Field types#
| Dashboard label | type |
Value in custom_analysis_data |
Extra options |
|---|---|---|---|
| Text | string |
string | Format examples |
| Selector | enum |
one of your choices | Choices (at least one) |
| Boolean | boolean |
true or false |
none |
| Number | number |
number | none |
The model is constrained by a JSON schema built from your fields, so a selector can only return one of its choices, a boolean is always a boolean and a number is always a number.
Field settings#
| Dashboard label | API field | Type | Default | Notes |
|---|---|---|---|---|
| Name | name |
string | required | The key in custom_analysis_data. The editor accepts letters, numbers and underscores, up to 64 characters, and turns spaces into underscores. |
| Description | description |
string | "" |
Tells the model what to extract. This is the most important setting. |
| Choices | choices |
string array | none | Selector only. Type a choice and press Enter. |
| Format examples | examples |
string array | none | Shown for Text fields. Added to the description as "Examples: ...". |
| Only extract when | conditional_prompt |
string | none | A condition in plain language. When it does not hold, the field is left out. |
| Required | required |
boolean | false |
Required fields must get a value. |
The names call_summary, call_successful, user_sentiment and in_voicemail are reserved for the presets. A custom field with one of those names is ignored.
Required and optional fields#
An optional field is allowed to be null. When the model returns null, the key is removed from custom_analysis_data, so absent keys mean "could not be determined". A required field without a condition must be filled with a value of its type.
Conditions#
Only extract when limits a field to calls where something happened, for example a refund reason only when the caller asks for a refund. The condition is added to the field's instructions as "Only fill this when: ... Otherwise return null." A field with a condition is always nullable, even when Required is ticked. The field shows an If badge in the list.
In mock mode (no key for the analysis model's provider), a condition counts as met when at least half of its significant words (4 letters or more, minus common words) appear in the transcript.
Writing good descriptions#
The model only sees the field's name, type, description, examples and condition, plus the transcript and the disconnection reason. Write descriptions that:
- Say what to extract and from whose words: "The date and time the caller agreed to, as spoken."
- Say what to do in edge cases: "If the caller booked more than one appointment, use the first."
- Match the type: a Boolean description reads as a yes or no question; a Number description gives the unit ("Number of people in the booking").
Examples#
[
{
"type": "boolean",
"name": "appointment_booked",
"description": "True if the agent booked or moved an appointment during the call.",
"required": true
},
{
"type": "enum",
"name": "call_reason",
"description": "The main reason the caller called.",
"choices": ["New booking", "Reschedule", "Cancel", "Question", "Other"]
},
{
"type": "string",
"name": "appointment_time",
"description": "The appointment date and time agreed on the call.",
"examples": ["Tue 21 Oct, 4pm"]
},
{
"type": "number",
"name": "party_size",
"description": "How many people the booking is for."
},
{
"type": "string",
"name": "refund_reason",
"description": "Why the caller wants a refund, in one sentence.",
"conditional_prompt": "The caller asks for a refund"
}
]Set fields through the API with PATCH /update-agent/:agent_id:
curl -X PATCH https://api.tried.com.au/update-agent/agent_3f9c0a1b2c3d4e5f6a7b8c9d \
-H "Authorization: Bearer $TRIED_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"post_call_analysis_model": "gpt-5.6-terra",
"post_call_analysis_data": [
{ "type": "boolean", "name": "appointment_booked", "description": "True if an appointment was booked.", "required": true }
],
"analysis_successful_prompt": "Successful only when an appointment was booked or moved."
}'post_call_analysis_data replaces the whole list, so send every field you want to keep.
Agent fields reference#
| Field | Type | Default |
|---|---|---|
post_call_analysis_data |
array of fields | [] |
post_call_analysis_model |
model name | gpt-5.6-terra |
analysis_summary_prompt |
string, up to 2000 characters | none |
analysis_successful_prompt |
string, up to 2000 characters | none |
analysis_user_sentiment_prompt |
string, up to 2000 characters | none |
The same field shape (AnalysisField) is also used by extract variable tools and nodes, and by info collection steps, during the call. Post-call extraction runs after the call on the whole transcript.