+ );
+};
+
+export default ProductCard;
diff --git a/fern/products/atoms/pages/components/index.js b/fern/products/atoms/pages/components/index.js
new file mode 100644
index 0000000..6f51635
--- /dev/null
+++ b/fern/products/atoms/pages/components/index.js
@@ -0,0 +1,5 @@
+export { Hero } from './Hero';
+export { ProductCard, ProductCardGrid } from './ProductCard';
+export { CapabilityCard, CapabilityGrid } from './CapabilityCard';
+export { PathSelector } from './PathSelector';
+export { FeatureHighlight } from './FeatureHighlight';
diff --git a/fern/products/atoms/pages/custom.css b/fern/products/atoms/pages/custom.css
new file mode 100644
index 0000000..afd8040
--- /dev/null
+++ b/fern/products/atoms/pages/custom.css
@@ -0,0 +1,46 @@
+/* Custom Atoms Documentation Styles - ElevenLabs Inspired */
+
+/* Gradient utilities for product cards */
+.from-teal-500 {
+ --tw-gradient-from: #14b8a6;
+}
+
+.to-cyan-500 {
+ --tw-gradient-to: #06b6d4;
+}
+
+.to-cyan-600 {
+ --tw-gradient-to: #0891b2;
+}
+
+.from-blue-500 {
+ --tw-gradient-from: #3b82f6;
+}
+
+.to-indigo-600 {
+ --tw-gradient-to: #4f46e5;
+}
+
+.from-purple-500 {
+ --tw-gradient-from: #a855f7;
+}
+
+.to-pink-600 {
+ --tw-gradient-to: #db2777;
+}
+
+.from-teal-600 {
+ --tw-gradient-from: #0d9488;
+}
+
+.bg-gradient-to-br {
+ background: linear-gradient(to bottom right, var(--tw-gradient-from), var(--tw-gradient-to));
+}
+
+/* Typography improvements */
+h1,
+h2,
+h3,
+h4 {
+ letter-spacing: -0.025em;
+}
\ No newline at end of file
diff --git a/fern/products/atoms/pages/deep-dive/campaign/campaign.mdx b/fern/products/atoms/pages/deep-dive/campaign/campaign.mdx
index ebf0721..f443f58 100644
--- a/fern/products/atoms/pages/deep-dive/campaign/campaign.mdx
+++ b/fern/products/atoms/pages/deep-dive/campaign/campaign.mdx
@@ -40,7 +40,7 @@ After creating your campaign, you'll see it listed in the Campaigns dashboard. C
To begin making calls, click the "Start Campaign" button on the right side of the campaign details page. Your campaign will immediately begin dialing numbers from your audience list.
-The system makes multiple concurrent calls based on your subscription's rate limits. More information about limits can be found [here](https://console.smallest.ai/subscription).
+The system makes multiple concurrent calls based on your subscription's rate limits. More information about limits can be found [here](https://console.smallest.ai/subscription?utm_source=documentation&utm_medium=docs).
### Pausing and Resuming
diff --git a/fern/products/atoms/pages/deep-dive/phone-number/phone-number.mdx b/fern/products/atoms/pages/deep-dive/phone-number/phone-number.mdx
index f8b482b..a1077b7 100644
--- a/fern/products/atoms/pages/deep-dive/phone-number/phone-number.mdx
+++ b/fern/products/atoms/pages/deep-dive/phone-number/phone-number.mdx
@@ -19,7 +19,7 @@ The purchased number will appear in the [Your Numbers](https://atoms.smallest.ai
The maximum number of phone numbers you can acquire depends on your current subscription plan. Check your
- limits and available quota on the [Subscription page](https://console.smallest.ai/subscription).
+ limits and available quota on the [Subscription page](https://console.smallest.ai/subscription?utm_source=documentation&utm_medium=docs).
## Importing Numbers via SIP Trunking
@@ -45,7 +45,7 @@ To import a phone number using SIP Trunking:
The imported number will appear in the [Your Numbers](https://atoms.smallest.ai/dashboard/phone-numbers/your-numbers) tab and will be ready to assign to any agent.
-
+
For detailed setup instructions, technical specifications, and provider-specific guides, see our
comprehensive SIP Trunking documentation.
diff --git a/fern/products/atoms/pages/deep-dive/phone-number/sip-trunking.mdx b/fern/products/atoms/pages/deep-dive/phone-number/sip-trunking.mdx
index a6e9e75..e0aea12 100644
--- a/fern/products/atoms/pages/deep-dive/phone-number/sip-trunking.mdx
+++ b/fern/products/atoms/pages/deep-dive/phone-number/sip-trunking.mdx
@@ -200,7 +200,7 @@ We support all major telephony providers that offer SIP trunking. Below are deta
4. Import numbers on Smallest AI with your trunk credentials
5. Test inbound and outbound calls
-
+
View the detailed step-by-step guide with troubleshooting and advanced configuration
@@ -217,7 +217,7 @@ We support all major telephony providers that offer SIP trunking. Below are deta
4. Assign your phone numbers to the connection
5. Import numbers on Smallest AI with your connection details
-
+
View the comprehensive guide with authentication options and monitoring setup
@@ -234,7 +234,7 @@ We support all major telephony providers that offer SIP trunking. Below are deta
4. Link your phone numbers to the application
5. Import numbers on Smallest AI with your API credentials
-
+
View the detailed guide with NCCO configuration and webhook setup
@@ -278,4 +278,4 @@ If you need assistance setting up SIP trunking:
- Email: support@smallest.ai
- Join our [Discord community](https://smallest.ai/discord)
-- Check our [FAQ section](/faqs/frequently-asked-questions) for common questions
+- Check our [FAQ section](/atoms/atoms-platform/troubleshooting/faq) for common questions
diff --git a/fern/products/atoms/pages/deep-dive/phone-number/telnyx-sip-setup.mdx b/fern/products/atoms/pages/deep-dive/phone-number/telnyx-sip-setup.mdx
index 320c207..02fd6c1 100644
--- a/fern/products/atoms/pages/deep-dive/phone-number/telnyx-sip-setup.mdx
+++ b/fern/products/atoms/pages/deep-dive/phone-number/telnyx-sip-setup.mdx
@@ -413,6 +413,6 @@ If you encounter issues not covered in this guide:
## Related Documentation
-- [SIP Trunking Overview](/deep-dive/phone-number/sip-trunking) - General SIP trunking concepts
-- [Phone Numbers](/deep-dive/phone-number/phone-number) - Managing phone numbers on Smallest AI
+- [SIP Trunking Overview](/atoms/atoms-platform/deployment/phone-numbers) - General SIP trunking concepts
+- [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers) - Managing phone numbers on Smallest AI
- [Telnyx Documentation](https://developers.telnyx.com/docs) - Official Telnyx developer docs
diff --git a/fern/products/atoms/pages/deep-dive/phone-number/twilio-sip-setup.mdx b/fern/products/atoms/pages/deep-dive/phone-number/twilio-sip-setup.mdx
index bdf0465..24c8d25 100644
--- a/fern/products/atoms/pages/deep-dive/phone-number/twilio-sip-setup.mdx
+++ b/fern/products/atoms/pages/deep-dive/phone-number/twilio-sip-setup.mdx
@@ -314,6 +314,6 @@ If you encounter issues not covered in this guide:
## Related Documentation
-- [SIP Trunking Overview](/deep-dive/phone-number/sip-trunking) - General SIP trunking concepts
-- [Phone Numbers](/deep-dive/phone-number/phone-number) - Managing phone numbers on Smallest AI
+- [SIP Trunking Overview](/atoms/atoms-platform/deployment/phone-numbers) - General SIP trunking concepts
+- [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers) - Managing phone numbers on Smallest AI
- [Twilio Elastic SIP Trunking Docs](https://www.twilio.com/docs/sip-trunking) - Official Twilio documentation
diff --git a/fern/products/atoms/pages/deep-dive/phone-number/vonage-sip-setup.mdx b/fern/products/atoms/pages/deep-dive/phone-number/vonage-sip-setup.mdx
index be50e50..fb0c9fc 100644
--- a/fern/products/atoms/pages/deep-dive/phone-number/vonage-sip-setup.mdx
+++ b/fern/products/atoms/pages/deep-dive/phone-number/vonage-sip-setup.mdx
@@ -454,7 +454,7 @@ If you encounter issues not covered in this guide:
## Related Documentation
-- [SIP Trunking Overview](/deep-dive/phone-number/sip-trunking) - General SIP trunking concepts
-- [Phone Numbers](/deep-dive/phone-number/phone-number) - Managing phone numbers on Smallest AI
+- [SIP Trunking Overview](/atoms/atoms-platform/deployment/phone-numbers) - General SIP trunking concepts
+- [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers) - Managing phone numbers on Smallest AI
- [Vonage Voice API Docs](https://developer.vonage.com/voice/voice-api/overview) - Official Vonage documentation
- [Vonage NCCO Reference](https://developer.vonage.com/voice/voice-api/ncco-reference) - NCCO action reference
diff --git a/fern/products/atoms/pages/deep-dive/realtime-events/events.mdx b/fern/products/atoms/pages/deep-dive/realtime-events/events.mdx
index 6d4e090..14e527d 100644
--- a/fern/products/atoms/pages/deep-dive/realtime-events/events.mdx
+++ b/fern/products/atoms/pages/deep-dive/realtime-events/events.mdx
@@ -53,7 +53,7 @@ Authorization: Bearer your_api_token
### cURL
```bash
-curl 'https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-80752e' \
+curl 'https://api.smallest.ai/atoms/v1/events?callId=CALL-1758124225863-80752e' \
-H 'Authorization: Bearer your_token' \
-H 'Accept: text/event-stream'
```
@@ -64,7 +64,7 @@ curl 'https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-8075
const EventSource = require("eventsource");
const eventSource = new EventSource(
- "https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-80752e",
+ "https://api.smallest.ai/atoms/v1/events?callId=CALL-1758124225863-80752e",
{
headers: {
Authorization: "Bearer your_token",
@@ -436,7 +436,7 @@ Authorization: Bearer your_api_token
### cURL
```bash
-curl 'https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-80752e' \
+curl 'https://api.smallest.ai/atoms/v1/events?callId=CALL-1758124225863-80752e' \
-H 'Authorization: Bearer your_token' \
-H 'Accept: text/event-stream'
```
@@ -447,7 +447,7 @@ curl 'https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-8075
const EventSource = require("eventsource");
const eventSource = new EventSource(
- "https://atoms-api.smallest.ai/api/v1/events?callId=CALL-1758124225863-80752e",
+ "https://api.smallest.ai/atoms/v1/events?callId=CALL-1758124225863-80752e",
{
headers: {
Authorization: "Bearer your_token",
diff --git a/fern/products/atoms/pages/deep-dive/single-prompt/overview.mdx b/fern/products/atoms/pages/deep-dive/single-prompt/overview.mdx
index 357225c..1efca07 100644
--- a/fern/products/atoms/pages/deep-dive/single-prompt/overview.mdx
+++ b/fern/products/atoms/pages/deep-dive/single-prompt/overview.mdx
@@ -7,7 +7,7 @@ icon: circle-info
## 🎯 Single Prompt Flow
The single prompt flow is the **simplest** way to create an AI agent. You are supposed to describe
-the entire expected behavior in a single prompt - you can check out our [guide for best practices](/deep-dive/single-prompt/prompting-best-practices) 📚.
+the entire expected behavior in a single prompt - you can check out our [guide for best practices](/atoms/atoms-platform/single-prompt-agents/prompt-section/writing-prompts) 📚.
For example - the below images shows the prompt for a very simple hotel booking agent 🏨:
@@ -29,11 +29,11 @@ forward corporate booking requests to a human agent 👤.
The next sections describe all the tool types currently supported:
-- 📞 [End Call](/deep-dive/single-prompt/tool-calls#end-call-tool)
-- 🔄 [Transfer Call](/deep-dive/single-prompt/tool-calls#transfer-call-tool)
-- 🌐 [API Call](/deep-dive/single-prompt/tool-calls#api-call-tool)
-- 📊 [Dynamic Variable Extraction](/deep-dive/single-prompt/tool-calls#dynamic-variable-extraction-tool)
-- 🔍 [Knowledge Base Search](/deep-dive/single-prompt/tool-calls#knowledge-base-search-tool)
+- 📞 [End Call](/atoms/developer-guide/build/agents/tools/defining-tools#end-call-tool)
+- 🔄 [Transfer Call](/atoms/developer-guide/build/agents/tools/defining-tools#transfer-call-tool)
+- 🌐 [API Call](/atoms/developer-guide/build/agents/tools/defining-tools#api-call-tool)
+- 📊 [Dynamic Variable Extraction](/atoms/developer-guide/build/agents/tools/defining-tools#dynamic-variable-extraction-tool)
+- 🔍 [Knowledge Base Search](/atoms/developer-guide/build/agents/tools/defining-tools#knowledge-base-search-tool)
diff --git a/fern/products/atoms/pages/deep-dive/voice-config/background-sound.mdx b/fern/products/atoms/pages/deep-dive/voice-config/background-sound.mdx
index 4d67eb6..10bbe3f 100644
--- a/fern/products/atoms/pages/deep-dive/voice-config/background-sound.mdx
+++ b/fern/products/atoms/pages/deep-dive/voice-config/background-sound.mdx
@@ -42,11 +42,12 @@ Background sound can be particularly useful in scenarios where:
## Available Sound Options
-Currently, a default office ambience sound is available out of the box. This provides a natural background noise that simulates a professional office environment.
-
-
-Additional sound options (like cafe ambience, outdoor environment, etc.) can be made available upon request. Contact our support team to discuss custom sound requirements.
-
+You can choose from:
+- `""` (none)
+- `"office"`
+- `"cafe"`
+- `"call_center"`
+- `"static"`
## API Support
@@ -54,8 +55,8 @@ The background sound setting can be configured via our API:
```json
{
- "backgroundSound": true
+ "backgroundSound": "office"
}
```
-For more details, see our [API Reference](/api-reference/).
\ No newline at end of file
+For more details, see our [API Reference](/atoms/api-reference).
\ No newline at end of file
diff --git a/fern/products/atoms/pages/deep-dive/voice-config/types-of-voice-models.mdx b/fern/products/atoms/pages/deep-dive/voice-config/types-of-voice-models.mdx
index 1d9c1a5..8b30f63 100644
--- a/fern/products/atoms/pages/deep-dive/voice-config/types-of-voice-models.mdx
+++ b/fern/products/atoms/pages/deep-dive/voice-config/types-of-voice-models.mdx
@@ -10,7 +10,7 @@ icon: palette
Looking for the right AI voice model? Below is a **detailed comparison** of various models based on pricing, latency, and features.
-🔗 **Jump to [Available Voice Models](https://waves-docs.smallest.ai/content/getting-started/models)**
+🔗 **Jump to [Available Voice Models](/waves/documentation/getting-started/models)**
---
@@ -20,5 +20,5 @@ Want to create a custom AI voice? Instantly clone your voice with less than 15 s
Both options provide realistic, high-quality voice synthesis, allowing you to create personalized, scalable, and expressive AI voices tailored to your needs.
-🔗 **Jump to [Creating a Custom Voice](https://waves-docs.smallest.ai/content/voice-cloning/types-of-clone)**
+🔗 **Jump to [Creating a Custom Voice](/waves/documentation/voice-cloning/types-of-clone)**
diff --git a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/api-call.mdx b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/api-call.mdx
index 072aa9f..5ca1159 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/api-call.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/api-call.mdx
@@ -155,4 +155,4 @@ Remember that all variable mappings must start with `$.` to properly access the
The **API Call Node** is a powerful tool that allows your workflow to **communicate with external systems**. Whether sending data or fetching information, API Call Nodes enable **real-time, automated interactions**.
-**Next Steps:** Learn how to use the [Transfer Call Node](/deep-dive/workflow/types-of-nodes/transfer-call) to add a Human into the loop!
+**Next Steps:** Learn how to use the [Transfer Call Node](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types) to add a Human into the loop!
diff --git a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/default.mdx b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/default.mdx
index 54e563f..efd4aca 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/default.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/default.mdx
@@ -80,4 +80,4 @@ After configuring these parameters, clicking "Save" finalizes the node setup.
The **Default Node** is the foundation of any workflow in Atoms. It represents a **single conversational goal**, guiding the AI agent's responses. By structuring conversations with well-defined Default Nodes, you can create **flexible and natural AI interactions**.
-Next Steps: Explore [Webhook Nodes](/deep-dive/workflow/types-of-nodes/webhook) to extend your workflow with real-time data exchange.
\ No newline at end of file
+Next Steps: Explore [Webhook Nodes](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types) to extend your workflow with real-time data exchange.
\ No newline at end of file
diff --git a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/end-call.mdx b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/end-call.mdx
index e17cb4c..fe574b1 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/end-call.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/end-call.mdx
@@ -78,4 +78,4 @@ Once these parameters are set, clicking **Save** finalizes the End Call Node set
The **End Call Node** ensures that conversations in Atoms workflows conclude smoothly and naturally. It helps create a **structured, user-friendly experience** by closing interactions **at the right moments**.
-**Next Steps:** Learn about [Best Practices for Prompting](/deep-dive/workflow/best-practices-for-prompting) to refine how your AI generates responses!
+**Next Steps:** Learn about [Best Practices for Prompting](/atoms/atoms-platform/conversational-flow-agents/overview) to refine how your AI generates responses!
diff --git a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/pre-call-api.mdx b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/pre-call-api.mdx
index c106ecd..55137d3 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/pre-call-api.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/pre-call-api.mdx
@@ -145,4 +145,4 @@ Agent: "I see you're interested in {{productCategory}}.
The **Pre Call API Node** is a powerful tool for enriching conversations with external data before they begin. By fetching relevant information upfront, you can create more personalized and efficient conversational experiences.
-**Next Steps:** Learn about [API Call Node](/deep-dive/workflow/types-of-nodes/api-call) to understand how to make API calls during the conversation!
+**Next Steps:** Learn about [API Call Node](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types) to understand how to make API calls during the conversation!
diff --git a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/webhook.mdx b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/webhook.mdx
index 097c173..052b40b 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/webhook.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/types-of-nodes/webhook.mdx
@@ -95,4 +95,4 @@ Once these parameters are set, clicking **Save** finalizes the Webhook Node setu
The **Webhook Node** is a powerful tool that allows your workflow to **communicate with external systems**. Whether sending data or fetching information, Webhook Nodes enable **real-time, automated interactions**.
-**Next Steps:** Learn how to use the [Transfer Call Node](/deep-dive/workflow/types-of-nodes/transfer-call) to add a Human into the loop!
+**Next Steps:** Learn how to use the [Transfer Call Node](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types) to add a Human into the loop!
diff --git a/fern/products/atoms/pages/deep-dive/workflow/what-are-variables.mdx b/fern/products/atoms/pages/deep-dive/workflow/what-are-variables.mdx
index 1100281..18aa5b2 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/what-are-variables.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/what-are-variables.mdx
@@ -54,7 +54,7 @@ When a user says, "My name is Sarah," the agent can automatically store "Sarah"
### 3. Audience Variables
-Audience variables are created automatically from the columns in your uploaded [Audience CSV](/deep-dive/audience/audience) file. Each column header in your CSV becomes a variable name that's accessible throughout your workflow.
+Audience variables are created automatically from the columns in your uploaded [Audience CSV](/atoms/atoms-platform/deployment/audiences) file. Each column header in your CSV becomes a variable name that's accessible throughout your workflow.
**How Audience Variables Work:**
diff --git a/fern/products/atoms/pages/deep-dive/workflow/what-is-a-workflow.mdx b/fern/products/atoms/pages/deep-dive/workflow/what-is-a-workflow.mdx
index 1effa43..225e3f7 100644
--- a/fern/products/atoms/pages/deep-dive/workflow/what-is-a-workflow.mdx
+++ b/fern/products/atoms/pages/deep-dive/workflow/what-is-a-workflow.mdx
@@ -28,8 +28,8 @@ into sub-goals or **nodes**, and based on the intent or **branches** move to the
The above image describes a simple workflow of atoms.
-It contains 3 [default nodes](/deep-dive/workflow/types-of-nodes/default), 2 [end call nodes](/deep-dive/workflow/types-of-nodes/end-call)
-and 5 [branches](/deep-dive/workflow/what-is-a-branch.mdx).
+It contains 3 [default nodes](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types), 2 [end call nodes](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types)
+and 5 [branches](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/conditions).
In this example, we show a simple Insurance lead generation workflow.
diff --git a/fern/products/atoms/pages/dev/build/agents/agent-configuration/llm-settings.mdx b/fern/products/atoms/pages/dev/build/agents/agent-configuration/llm-settings.mdx
index 54a7e9f..4b2a152 100644
--- a/fern/products/atoms/pages/dev/build/agents/agent-configuration/llm-settings.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/agent-configuration/llm-settings.mdx
@@ -147,13 +147,13 @@ agent = CreateAgentRequest(
For the complete Waves voice library with audio samples:
- → [Waves Voice Models](https://waves-docs.smallest.ai/content/getting-started/models)
+ → [Waves Voice Models](/waves/documentation/getting-started/models)
### Voice Cloning
Create custom voices from audio samples:
-→ [Waves Voice Cloning Guide](https://waves-docs.smallest.ai/content/voice-cloning/types-of-clone)
+→ [Waves Voice Cloning Guide](/waves/documentation/voice-cloning/types-of-clone)
### Third-Party Providers
diff --git a/fern/products/atoms/pages/dev/build/agents/agent-configuration/overview.mdx b/fern/products/atoms/pages/dev/build/agents/agent-configuration/overview.mdx
index 461bcba..df62c46 100644
--- a/fern/products/atoms/pages/dev/build/agents/agent-configuration/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/agent-configuration/overview.mdx
@@ -27,13 +27,13 @@ The SDK provides sensible defaults, so you can start simple and tune later.
## What's Next
-
+
Craft effective system prompts that define behavior.
-
+
Model selection, temperature, and streaming.
-
+
Run local models with Ollama, vLLM, or custom servers.
diff --git a/fern/products/atoms/pages/dev/build/agents/agent-configuration/prompts.mdx b/fern/products/atoms/pages/dev/build/agents/agent-configuration/prompts.mdx
index da3ab1e..2c15d4a 100644
--- a/fern/products/atoms/pages/dev/build/agents/agent-configuration/prompts.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/agent-configuration/prompts.mdx
@@ -388,3 +388,8 @@ Summarize what was done, confirm next steps, thank them.
The best prompts feel like onboarding a new teammate. You're not giving them a script; you're explaining who they are, what they're trying to achieve, how they should behave, and what tools they have. Then you trust them to handle the conversation.
**Clear structure + specific guidance + room for adaptation = an agent users enjoy talking to.**
+
+
+ Want an exhaustive, line-by-line prompt breakdown? See the dedicated guide in our cookbook:
+ [Voice Agent Prompting Guide](https://github.com/smallest-inc/cookbook/blob/main/best-practices/voice_agent_prompting_guide.md).
+
diff --git a/fern/products/atoms/pages/dev/build/agents/agent-configuration/voice-settings.mdx b/fern/products/atoms/pages/dev/build/agents/agent-configuration/voice-settings.mdx
index 7e38731..5b1dbfc 100644
--- a/fern/products/atoms/pages/dev/build/agents/agent-configuration/voice-settings.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/agent-configuration/voice-settings.mdx
@@ -193,10 +193,10 @@ async def start(self, init_event, task_manager):
## Next Steps
-
+
Give your agent capabilities beyond conversation.
-
+
Learn advanced behavior patterns.
diff --git a/fern/products/atoms/pages/dev/build/agents/agent-patterns/interruption-handling.mdx b/fern/products/atoms/pages/dev/build/agents/agent-patterns/interruption-handling.mdx
index 78d416c..baaf04e 100644
--- a/fern/products/atoms/pages/dev/build/agents/agent-patterns/interruption-handling.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/agent-patterns/interruption-handling.mdx
@@ -210,7 +210,7 @@ class ToolAgent(OutputAgentNode):
],
},
*[
- {"role": "tool", "tool_call_id": tc.id, "content": str(result)}
+ {"role": "tool", "tool_call_id": tc.id, "content": result.content}
for tc, result in zip(tool_calls, results)
],
])
diff --git a/fern/products/atoms/pages/dev/build/agents/building-first-agent/complete-walkthrough.mdx b/fern/products/atoms/pages/dev/build/agents/building-first-agent/complete-walkthrough.mdx
index 094c1f7..86b9db6 100644
--- a/fern/products/atoms/pages/dev/build/agents/building-first-agent/complete-walkthrough.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/building-first-agent/complete-walkthrough.mdx
@@ -170,13 +170,29 @@ class OrderAssistant(OutputAgentNode):
if tool_calls:
results = await self.tool_registry.execute(tool_calls, parallel=True)
- # Add tool results to context
- for result in results:
- self.context.add_message({
- "role": "tool",
- "tool_call_id": result.tool_call_id,
- "content": result.content
- })
+ # Add assistant tool_calls and results to context
+ self.context.add_messages([
+ {
+ "role": "assistant",
+ "content": "",
+ "tool_calls": [
+ {
+ "id": tc.id,
+ "type": "function",
+ "function": {
+ "name": tc.name,
+ "arguments": str(tc.arguments),
+ },
+ }
+ for tc in tool_calls
+ ],
+ },
+ *[
+ {"role": "tool", "tool_call_id": tc.id, "content": result.content}
+ for tc, result in zip(tool_calls, results)
+ ],
+ ])
+
followup = await self.llm.chat(
messages=self.context.messages,
stream=True
@@ -318,15 +334,31 @@ class OrderAssistant(OutputAgentNode):
if chunk.tool_calls:
tool_calls.extend(chunk.tool_calls)
+ if tool_calls:
results = await self.tool_registry.execute(tool_calls, parallel=True)
- # Add tool results to context
- for result in results:
- self.context.add_message({
- "role": "tool",
- "tool_call_id": result.tool_call_id,
- "content": result.content
- })
+ # Add assistant tool_calls and results to context
+ self.context.add_messages([
+ {
+ "role": "assistant",
+ "content": "",
+ "tool_calls": [
+ {
+ "id": tc.id,
+ "type": "function",
+ "function": {
+ "name": tc.name,
+ "arguments": str(tc.arguments),
+ },
+ }
+ for tc in tool_calls
+ ],
+ },
+ *[
+ {"role": "tool", "tool_call_id": tc.id, "content": result.content}
+ for tc, result in zip(tool_calls, results)
+ ],
+ ])
followup = await self.llm.chat(
messages=self.context.messages,
@@ -364,10 +396,10 @@ In this guide, you:
## Next Steps
-
+
Craft better system prompts and agent personas.
-
+
Learn advanced tool patterns and best practices.
diff --git a/fern/products/atoms/pages/dev/build/agents/debugging-testing/common-issues.mdx b/fern/products/atoms/pages/dev/build/agents/debugging-testing/common-issues.mdx
index f017894..6dfb87c 100644
--- a/fern/products/atoms/pages/dev/build/agents/debugging-testing/common-issues.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/debugging-testing/common-issues.mdx
@@ -220,7 +220,7 @@ async def generate_response(self):
If you cannot resolve an issue:
1. Check the [Discord](https://discord.gg/smallest) for community help
-2. Search existing [GitHub issues](https://github.com/smallest-ai/smallest-python-sdk/issues)
+2. Search existing [GitHub issues](https://github.com/smallest-inc/smallest-python-sdk/issues)
3. Open a new issue with:
- Python version
- SDK version (`pip show smallestai`)
@@ -230,10 +230,10 @@ If you cannot resolve an issue:
## Next Steps
-
+
See complete working examples.
-
+
Get help from the community.
diff --git a/fern/products/atoms/pages/dev/build/agents/debugging-testing/logging-observability.mdx b/fern/products/atoms/pages/dev/build/agents/debugging-testing/logging-observability.mdx
index 2a7b93b..05e668b 100644
--- a/fern/products/atoms/pages/dev/build/agents/debugging-testing/logging-observability.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/debugging-testing/logging-observability.mdx
@@ -262,10 +262,10 @@ DEBUG=true python agent.py
## Next Steps
-
+
Troubleshoot common problems.
-
+
See complete working examples.
diff --git a/fern/products/atoms/pages/dev/build/agents/debugging-testing/overview.mdx b/fern/products/atoms/pages/dev/build/agents/debugging-testing/overview.mdx
index 4617ef3..996661a 100644
--- a/fern/products/atoms/pages/dev/build/agents/debugging-testing/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/debugging-testing/overview.mdx
@@ -24,10 +24,10 @@ The SDK gives you visibility into what's happening at every step.
## What's Next
-
+
Trace execution flow and debug issues.
-
+
Troubleshooting FAQ and fixes.
diff --git a/fern/products/atoms/pages/dev/build/agents/overview.mdx b/fern/products/atoms/pages/dev/build/agents/overview.mdx
index 53395c1..4e05842 100644
--- a/fern/products/atoms/pages/dev/build/agents/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/overview.mdx
@@ -27,19 +27,35 @@ This happens continuously, creating a natural back-and-forth conversation.
| **Multi-Provider LLM** | Use OpenAI, Anthropic, or bring your own model. |
| **Production Ready** | Deploy with one command. Handle thousands of concurrent calls. |
+## Node Types
+
+The SDK provides three node types for building agents:
+
+| Node | Purpose |
+|------|---------|
+| `Node` | Base primitive for routing, logging, and custom logic |
+| `OutputAgentNode` | Conversational agent that speaks to users |
+| `BackgroundAgentNode` | Silent observer for analytics and monitoring |
+
+
+ Deep dive into node architecture, when to use each type, and how to build custom nodes.
+
+
+---
+
## What's Next
-
+
Set up prompts and LLM settings.
-
+
Give your agent actions and data access.
-
+
Conversation flows, interruptions, multi-agent.
-
+
Test locally and debug issues.
diff --git a/fern/products/atoms/pages/dev/build/agents/tools-functions/built-in-tools.mdx b/fern/products/atoms/pages/dev/build/agents/tools-functions/built-in-tools.mdx
index 95d6a20..6018b9d 100644
--- a/fern/products/atoms/pages/dev/build/agents/tools-functions/built-in-tools.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/tools-functions/built-in-tools.mdx
@@ -133,7 +133,7 @@ class SupportAgent(OutputAgentNode):
for tc in tool_calls
]
},
- *[{"role": "tool", "tool_call_id": tc.id, "content": str(result)}
+ *[{"role": "tool", "tool_call_id": tc.id, "content": result.content}
for tc, result in zip(tool_calls, results)]
])
diff --git a/fern/products/atoms/pages/dev/build/agents/tools-functions/executing-tools.mdx b/fern/products/atoms/pages/dev/build/agents/tools-functions/executing-tools.mdx
index 1ad8c94..3997c22 100644
--- a/fern/products/atoms/pages/dev/build/agents/tools-functions/executing-tools.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/tools-functions/executing-tools.mdx
@@ -104,7 +104,7 @@ if tool_calls:
],
},
*[
- {"role": "tool", "tool_call_id": tc.id, "content": str(result)}
+ {"role": "tool", "tool_call_id": tc.id, "content": result.content}
for tc, result in zip(tool_calls, results)
],
])
diff --git a/fern/products/atoms/pages/dev/build/agents/tools-functions/overview.mdx b/fern/products/atoms/pages/dev/build/agents/tools-functions/overview.mdx
index 215085b..f7053c3 100644
--- a/fern/products/atoms/pages/dev/build/agents/tools-functions/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/agents/tools-functions/overview.mdx
@@ -33,13 +33,13 @@ The LLM never runs your code directly—it just tells you what to run and with w
## What's Next
-
+
The `@function_tool` decorator, docstrings, and type hints.
-
+
ToolRegistry, handling calls, and feeding results back.
-
+
SDK-provided actions: ending calls, transferring to humans.
diff --git a/fern/products/atoms/pages/dev/build/analytics/call-metrics.mdx b/fern/products/atoms/pages/dev/build/analytics/call-metrics.mdx
index 9ae337f..c320186 100644
--- a/fern/products/atoms/pages/dev/build/analytics/call-metrics.mdx
+++ b/fern/products/atoms/pages/dev/build/analytics/call-metrics.mdx
@@ -1,166 +1,227 @@
---
title: "Call Metrics"
sidebarTitle: "Call Metrics"
-description: "Track call duration, status, and transcripts."
+description: "Retrieve call details, transcripts, recordings, and performance data."
---
-Retrieve detailed metrics for individual calls.
+Access detailed information about every call through the SDK.
-## Getting Call Details
+## Getting Recent Calls
+
+Fetch a paginated list of calls:
```python
-import requests
-import os
+from smallestai.atoms.call import Call
-API_KEY = os.getenv("SMALLEST_API_KEY")
-call_id = "CALL-1768155029217-0bae45"
+call = Call()
-response = requests.get(
- f"https://atoms.smallest.ai/api/v1/conversation/{call_id}",
- headers={"Authorization": f"Bearer {API_KEY}"}
-)
-data = response.json()["data"]
+calls = call.get_calls(limit=5)
-print(f"Call ID: {data['callId']}")
-print(f"Duration: {data['duration']} seconds")
-print(f"Status: {data['status']}")
+for log in calls["data"]["logs"]:
+ print(f"{log['callId']}: {log['status']} ({log['duration']}s)")
```
-## Call Duration
-
-```python
-duration_seconds = data["duration"]
-duration_minutes = duration_seconds / 60
-
-print(f"Call lasted {duration_minutes:.1f} minutes")
+The response includes pagination info:
+
+```json
+{
+ "status": true,
+ "data": {
+ "logs": [...],
+ "pagination": {
+ "total": 94,
+ "page": 1,
+ "hasMore": true,
+ "limit": 5
+ }
+ }
+}
```
-## Call Status
+---
+
+## Filtering Calls
-Check call outcomes:
+Narrow results using filter parameters:
```python
-status = data["status"]
-
-if status == "completed":
- print("Call completed successfully")
-elif status == "in_progress":
- print("Call is ongoing")
-elif status == "failed":
- print(f"Call failed: {data.get('callFailureReason', 'Unknown')}")
-```
+from smallestai.atoms.call import Call
-## Call Types
+call = Call()
-```python
-call_type = data["type"]
+# By status
+completed = call.get_calls(status="completed", limit=10)
-# Possible values:
-# - 'telephony_inbound' - Incoming call
-# - 'telephony_outbound' - Outgoing call
-# - 'chat' - Text conversation
-```
+# By agent
+agent_calls = call.get_calls(agent_id="696ddd281ea16a73cb8aafbe", limit=10)
-## Phone Numbers
+# By campaign
+campaign_calls = call.get_calls(campaign_id="696ddd2a04ff172dbd8eddad", limit=10)
-```python
-caller = data["from"] # Who initiated
-callee = data["to"] # Who received
+# By call type
+outbound = call.get_calls(call_type="telephony_outbound", limit=10)
-print(f"From: {caller}")
-print(f"To: {callee}")
+# By phone number
+found = call.get_calls(search="+916366821717", limit=10)
```
-## Transcripts
+### Filter Parameters
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `agent_id` | string | Filter by agent ID |
+| `campaign_id` | string | Filter by campaign ID |
+| `page` | int | Page number (default: 1) |
+| `limit` | int | Results per page (default: 10) |
+| `status` | string | completed, failed, in_progress, no_answer, busy |
+| `call_type` | string | telephony_inbound, telephony_outbound, chat |
+| `search` | string | Match callId, fromNumber, or toNumber |
+
+---
+
+## Getting Single Call Details
-Get the full conversation:
+Retrieve complete details for one call:
```python
-transcript = data["transcript"]
+from smallestai.atoms.call import Call
+
+call = Call()
+
+call_id = "CALL-1768807723178-4561d0"
+details = call.get_call(call_id)
-for message in transcript:
- role = message.get("role", "unknown")
- content = message.get("content", "")
- print(f"{role}: {content}")
+data = details["data"]
+print(f"Status: {data['status']}")
+print(f"Duration: {data['duration']} seconds")
+print(f"From: {data['from']} → To: {data['to']}")
```
-## Recording URL
+### Response Fields
+
+| Field | Description |
+|-------|-------------|
+| `callId` | Unique call identifier |
+| `status` | completed, failed, in_progress, no_answer |
+| `duration` | Length in seconds |
+| `type` | telephony_outbound, telephony_inbound, chat |
+| `from` / `to` | Phone numbers |
+| `transcript` | Array of conversation messages |
+| `recordingUrl` | Mono audio file URL |
+| `recordingDualUrl` | Stereo audio file URL |
+| `callCost` | Cost in credits |
+| `disconnectionReason` | user_hangup, agent_hangup, timeout |
+| `postCallAnalytics` | AI summary and extracted metrics |
-Access the call recording:
+---
+
+## Accessing Transcripts
+
+The transcript is an array of messages with speaker roles:
```python
-recording_url = data["recordingUrl"]
-dual_url = data["recordingDualUrl"] # Stereo version
+details = call.get_call(call_id)
+transcript = details["data"].get("transcript", [])
-if recording_url:
- print(f"Recording: {recording_url}")
+for msg in transcript:
+ print(f"{msg['role']}: {msg['content']}")
```
-## Call Cost
+---
+
+## Accessing Recordings
+
+Recordings are available after the call completes:
```python
-cost = data["callCost"]
-print(f"Call cost: {cost} credits")
+details = call.get_call(call_id)
+data = details["data"]
+
+if data.get("recordingUrl"):
+ print(f"Mono: {data['recordingUrl']}")
+
+if data.get("recordingDualUrl"):
+ print(f"Stereo: {data['recordingDualUrl']}")
```
-## Call Events
+---
+
+## Batch Search
-View the call lifecycle:
+Fetch multiple calls at once with `search_calls()`:
```python
-events = data["events"]
+call_ids = ["CALL-1768807723178-4561d0", "CALL-1768807723177-4561cd"]
+result = call.search_calls(call_ids)
-for event in events:
- event_type = event["eventType"]
- event_time = event["eventTime"]
- print(f"{event_time}: {event_type}")
+print(f"Found {result['data']['total']} of {len(call_ids)} calls")
```
-Common event types:
-- `call_pending` - Call initiated
-- `call_queued` - Waiting for agent
-- `in_progress` - Call connected
-- `completed` - Call ended normally
-- `failed` - Call failed
+
+Maximum 100 call IDs per request.
+
-## Batch Analysis
+---
+
+## Performance Metrics
-Analyze multiple calls:
+Each call includes latency breakdowns:
```python
-def analyze_calls(call_ids):
- total_duration = 0
- completed = 0
-
- for call_id in call_ids:
- resp = requests.get(
- f"https://atoms.smallest.ai/api/v1/conversation/{call_id}",
- headers={"Authorization": f"Bearer {API_KEY}"}
- )
- data = resp.json()["data"]
-
- total_duration += data.get("duration", 0)
- if data.get("status") == "completed":
- completed += 1
-
- avg_duration = total_duration / len(call_ids) if call_ids else 0
- completion_rate = completed / len(call_ids) * 100 if call_ids else 0
-
- print(f"Average duration: {avg_duration:.1f}s")
- print(f"Completion rate: {completion_rate:.1f}%")
+details = call.get_call(call_id)
+data = details["data"]
+
+print(f"Transcriber: {data.get('average_transcriber_latency')}ms")
+print(f"Agent (LLM): {data.get('average_agent_latency')}ms")
+print(f"Synthesizer: {data.get('average_synthesizer_latency')}ms")
```
-## Export Data
+| Metric | Description |
+|--------|-------------|
+| `average_transcriber_latency` | Speech-to-text processing time |
+| `average_agent_latency` | LLM response generation time |
+| `average_synthesizer_latency` | Text-to-speech processing time |
-```python
-import json
+---
-# Export to JSON
-with open("call_log.json", "w") as f:
- json.dump(data, f, indent=2)
+## SDK Reference
-# Export transcript to text
-with open("transcript.txt", "w") as f:
- for msg in data.get("transcript", []):
- f.write(f"{msg.get('role', '')}: {msg.get('content', '')}\n")
-```
+| Method | Description |
+|--------|-------------|
+| `get_calls(...)` | List calls with optional filters |
+| `get_call(call_id)` | Get single call with all details |
+| `search_calls(call_ids)` | Batch fetch by call IDs |
+
+---
+
+## Tips
+
+
+
+ `status` is the outcome (completed, failed). `disconnectionReason` explains *why* it ended:
+ - `user_hangup` — Caller hung up
+ - `agent_hangup` — Agent ended the call
+ - `dial_no_answer` — No pickup
+ - `timeout` — Call timeout
+
+
+ Recordings generate after the call ends. They may take a few seconds to appear. Check if `recordingUrl` is non-empty before accessing.
+
+
+ Fetch calls with `get_calls()`, then calculate:
+ ```python
+ calls = call.get_calls(status="completed", limit=100)
+ durations = [log["duration"] for log in calls["data"]["logs"]]
+ avg = sum(durations) / len(durations)
+ ```
+
+
+ Use the `search` parameter:
+ ```python
+ calls = call.get_calls(search="+916366821717")
+ ```
+
+
+ Currently, use pagination and filter client-side by `createdAt`. Date range filters are coming soon.
+
+
diff --git a/fern/products/atoms/pages/dev/build/analytics/overview.mdx b/fern/products/atoms/pages/dev/build/analytics/overview.mdx
index 65b6401..39c7b52 100644
--- a/fern/products/atoms/pages/dev/build/analytics/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/analytics/overview.mdx
@@ -1,56 +1,48 @@
---
title: "Analytics"
sidebarTitle: "Overview"
-description: "Track call metrics and agent performance."
+description: "Track every call, measure performance, and extract insights."
---
-Retrieve conversation logs to analyze call metrics, view transcripts, and monitor your agents.
-
-## Quick Example
-
-```python
-import requests
-import os
-
-API_KEY = os.getenv("SMALLEST_API_KEY")
-
-# Get conversation details
-response = requests.get(
- f"https://atoms.smallest.ai/api/v1/conversation/{call_id}",
- headers={"Authorization": f"Bearer {API_KEY}"}
-)
-data = response.json()["data"]
-
-print(f"Duration: {data['duration']} seconds")
-print(f"Status: {data['status']}")
-print(f"Type: {data['type']}")
-print(f"Recording: {data['recordingUrl']}")
-```
-
-## Available Metrics
-
-| Metric | Field | Description |
-|--------|-------|-------------|
-| Call ID | `callId` | Unique call identifier |
-| Status | `status` | in_progress, completed, failed |
-| Duration | `duration` | Length in seconds |
-| Type | `type` | telephony_outbound, telephony_inbound, chat |
-| Transcript | `transcript` | Array of conversation messages |
-| Recording | `recordingUrl` | Link to mono audio |
-| Dual Recording | `recordingDualUrl` | Link to stereo audio |
-| Cost | `callCost` | Call cost in credits |
-| From | `from` | Caller phone number |
-| To | `to` | Recipient phone number |
-| Events | `events` | Call lifecycle events |
-| Agent | `agent` | Agent configuration used |
+**Analytics** gives you complete visibility into what happens during and after every call your agents handle.
+
+## What Can You Track?
+
+Every call generates rich data that you can access programmatically:
+
+| Category | Data Available |
+|----------|----------------|
+| **Call Details** | Duration, status, phone numbers, timestamps |
+| **Transcript** | Full conversation text with speaker labels |
+| **Recordings** | Mono and stereo audio files |
+| **AI Summaries** | Auto-generated call summaries |
+| **Disposition Metrics** | Extracted data points you define |
+| **Performance** | Latency breakdowns per component |
+| **Cost** | Credits consumed per call |
+
+## How It Works
+
+1. **During the call** — Events are logged in real-time (status changes, transcription, speech)
+2. **After the call** — AI processes the transcript to generate summaries and extract configured metrics
+3. **On demand** — SDK methods let you query, filter, and search call data
+
+## SDK Methods
+
+| Method | Purpose |
+|--------|---------|
+| `get_calls()` | List calls with filters |
+| `get_call(id)` | Get single call details |
+| `search_calls(ids)` | Batch fetch by call IDs |
+| `get_post_call_config(agent_id)` | Get agent's analytics config |
+| `set_post_call_config(agent_id, ...)` | Configure post-call extraction |
## What's Next
-
- Track call duration, status, and transcripts.
+
+ Retrieve calls, transcripts, recordings, and performance data.
-
- Monitor latency and identify bottlenecks.
+
+ Configure AI summaries and disposition metrics.
diff --git a/fern/products/atoms/pages/dev/build/analytics/post-call-analytics.mdx b/fern/products/atoms/pages/dev/build/analytics/post-call-analytics.mdx
new file mode 100644
index 0000000..a311b15
--- /dev/null
+++ b/fern/products/atoms/pages/dev/build/analytics/post-call-analytics.mdx
@@ -0,0 +1,252 @@
+---
+title: "Post-Call Analytics"
+sidebarTitle: "Post-Call Analytics"
+description: "Configure AI summaries and disposition metrics for automated call insights."
+---
+
+After each call, the platform automatically generates analytics. You can configure what data to extract.
+
+## What Gets Generated
+
+Every completed call includes `postCallAnalytics`:
+
+| Field | Description |
+|-------|-------------|
+| `summary` | AI-generated call summary |
+| `dispositionMetrics` | Extracted data points you configure |
+
+---
+
+## Accessing Post-Call Data
+
+```python
+from smallestai.atoms.call import Call
+
+call = Call()
+
+# Get call details
+details = call.get_call("CALL-1768842587790-69eb58")
+data = details["data"]
+
+# Access analytics
+analytics = data.get("postCallAnalytics", {})
+
+print(f"Summary: {analytics.get('summary')}")
+
+for metric in analytics.get("dispositionMetrics", []):
+ print(f" {metric['identifier']}: {metric['value']}")
+ print(f" Confidence: {metric['confidence']}")
+ print(f" Reasoning: {metric['reasoning']}")
+```
+
+### Example Output
+
+```
+Summary: The call involved an agent reaching out to discuss AI products.
+The user expressed interest and provided their name.
+
+ user_interested: yes
+ Confidence: 1
+ Reasoning: The user explicitly stated 'I am interested'.
+ user_name: John
+ Confidence: 1
+ Reasoning: The user provided their name directly.
+```
+
+---
+
+## Configuring Disposition Metrics
+
+Use `set_post_call_config()` to define what data to extract:
+
+```python
+from smallestai.atoms.call import Call
+
+call = Call()
+
+call.set_post_call_config(
+ agent_id="696e655577e1d88ff54b4fbf",
+ summary_prompt="Summarize this sales call briefly.",
+ disposition_metrics=[
+ {
+ "identifier": "user_interested",
+ "dispositionMetricPrompt": "Was the user interested? yes, no, or unclear",
+ "dispositionValues": {"type": "ENUM"},
+ "choices": ["yes", "no", "unclear"]
+ },
+ {
+ "identifier": "user_name",
+ "dispositionMetricPrompt": "What is the user's name? Return 'unknown' if not mentioned.",
+ "dispositionValues": {"type": "STRING"}
+ }
+ ]
+)
+```
+
+---
+
+## Disposition Metric Types
+
+| Type | Description | Requires `choices` |
+|------|-------------|-------------------|
+| `STRING` | Free text (names, notes) | No |
+| `BOOLEAN` | Yes/No values | No |
+| `INTEGER` | Numeric values (ratings) | No |
+| `ENUM` | Selection from predefined list | Yes |
+| `DATETIME` | Date/time values | No |
+
+---
+
+## Metric Configuration Schema
+
+Each disposition metric requires:
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| `identifier` | Yes | Unique ID (e.g., `customer_status`) |
+| `dispositionMetricPrompt` | Yes | Question to extract this data |
+| `dispositionValues.type` | Yes | STRING, BOOLEAN, INTEGER, ENUM, DATETIME |
+| `choices` | For ENUM | List of allowed values |
+
+---
+
+## Getting Current Configuration
+
+```python
+config = call.get_post_call_config("696e655577e1d88ff54b4fbf")
+
+print("Configured metrics:")
+for metric in config["data"].get("dispositionMetrics", []):
+ print(f" {metric['identifier']}: {metric['dispositionMetricType']}")
+```
+
+---
+
+## Complete Example: Sales Call Analytics
+
+```python
+import time
+from smallestai.atoms import AtomsClient
+from smallestai.atoms.call import Call
+from smallestai.atoms.audience import Audience
+from smallestai.atoms.campaign import Campaign
+
+client = AtomsClient()
+call = Call()
+audience = Audience()
+campaign = Campaign()
+
+# 1. Create agent
+agent = client.new_agent(
+ name=f"Sales Agent {int(time.time())}",
+ prompt="You are a sales agent. Ask if interested and get their name.",
+ description="Testing disposition metrics"
+)
+agent_id = agent.data
+
+# 2. Configure disposition metrics
+call.set_post_call_config(
+ agent_id=agent_id,
+ summary_prompt="Summarize this sales call briefly.",
+ disposition_metrics=[
+ {
+ "identifier": "user_interested",
+ "dispositionMetricPrompt": "Was the user interested? yes, no, or unclear",
+ "dispositionValues": {"type": "ENUM"},
+ "choices": ["yes", "no", "unclear"]
+ },
+ {
+ "identifier": "user_name",
+ "dispositionMetricPrompt": "What is the user's name? Return 'unknown' if not mentioned.",
+ "dispositionValues": {"type": "STRING"}
+ }
+ ]
+)
+
+# 3. Create audience and campaign
+phones = client.get_phone_numbers()
+phone_id = phones["data"][0]["_id"]
+
+aud = audience.create(
+ name=f"Test Audience {int(time.time())}",
+ phone_numbers=["+916366821717"],
+ names=[("Test", "User")]
+)
+audience_id = aud["data"]["_id"]
+
+camp = campaign.create(
+ name=f"Analytics Test {int(time.time())}",
+ agent_id=agent_id,
+ audience_id=audience_id,
+ phone_ids=[phone_id]
+)
+campaign_id = camp["data"]["_id"]
+
+# 4. Start campaign
+campaign.start(campaign_id)
+print("Call in progress...")
+
+# 5. Wait for completion
+time.sleep(60)
+
+# 6. Get call with analytics
+calls = call.get_calls(agent_id=agent_id, limit=1)
+call_id = calls["data"]["logs"][0]["callId"]
+
+details = call.get_call(call_id)
+data = details["data"]
+
+# 7. Display results
+print(f"\nCall Status: {data['status']}")
+print(f"Duration: {data['duration']}s")
+
+print("\nTranscript:")
+for line in data.get("transcript", []):
+ print(f" [{line['role'].upper()}]: {line['content']}")
+
+analytics = data.get("postCallAnalytics", {})
+if analytics:
+ print(f"\nSummary: {analytics.get('summary')}")
+ print("\nDisposition Metrics:")
+ for m in analytics.get("dispositionMetrics", []):
+ print(f" {m['identifier']}: {m['value']}")
+ print(f" Confidence: {m['confidence']}")
+ print(f" Reasoning: {m['reasoning']}")
+
+# 8. Cleanup
+campaign.delete(campaign_id)
+audience.delete(audience_id)
+client.delete_agent(id=agent_id)
+```
+
+---
+
+## SDK Reference
+
+| Method | Description |
+|--------|-------------|
+| `call.get_post_call_config(agent_id)` | Get agent's analytics config |
+| `call.set_post_call_config(agent_id, ...)` | Configure summary and disposition metrics |
+| `call.get_call(call_id)` | Get call details with analytics |
+| `call.get_calls(agent_id=..., limit=...)` | List calls with optional filters |
+
+---
+
+## Tips
+
+
+
+ Disposition metrics are extracted after the call ends, typically within 10-30 seconds. The AI analyzes the transcript based on your configured prompts.
+
+
+ Be specific and direct. Instead of "What happened?", use:
+ - "Did the customer agree to schedule a follow-up? Answer yes or no."
+ - "What is the customer's email? Return 'not provided' if not mentioned."
+
+
+ Yes. New calls use the updated config. Existing calls keep their original analytics.
+
+
+ The metric will have an empty or null value. Specify fallback behavior in your prompts, like "Return 'unknown' if not mentioned."
+
+
diff --git a/fern/products/atoms/pages/dev/build/analytics/sse-live-transcripts.mdx b/fern/products/atoms/pages/dev/build/analytics/sse-live-transcripts.mdx
new file mode 100644
index 0000000..8326a7f
--- /dev/null
+++ b/fern/products/atoms/pages/dev/build/analytics/sse-live-transcripts.mdx
@@ -0,0 +1,227 @@
+---
+title: "SSE for Live Transcripts"
+sidebarTitle: "SSE for Live Transcripts"
+description: "Real-time streaming of user speech (STT) and agent speech (TTS) events for an active call via Server-Sent Events."
+---
+
+Real-time streaming of user speech (STT) and agent speech (TTS) events for an active call via Server-Sent Events.
+
+## Endpoint
+
+**GET** `/api/v1/events?callId={callId}`
+
+| Detail | Value |
+|--------|--------|
+| **Protocol** | Server-Sent Events (SSE) |
+| **Authentication** | Cookie-based (logged-in dashboard user) |
+| **Authorization** | User must belong to the org that owns the agent |
+| **Content-Type** | `text/event-stream` |
+
+### Query Parameters
+
+| Parameter | Type | Required | Description |
+|-----------|------|----------|-------------|
+| `callId` | string | Yes | The call ID to subscribe events for |
+
+### Errors
+
+| Status | Condition |
+|--------|-----------|
+| 400 | Missing or invalid callId |
+| 400 | Call is already completed |
+| 404 | Not authorized / org mismatch |
+| 404 | Call log or agent not found |
+
+## Event Types (Transcript-related)
+
+All events are sent as `data: \n\n`. The three transcript-relevant event types are:
+
+### 1. user_interim_transcription
+
+Fired as the user is speaking. Contains partial, in-progress transcription text. These events are emitted frequently and may change as more audio is processed.
+
+```json
+{
+ "event_type": "user_interim_transcription",
+ "event_id": "evt_abc123",
+ "timestamp": "2026-03-02T10:00:01.123Z",
+ "call_id": "CALL-1758124225863-80752e",
+ "interim_transcription_text": "I wanted to ask about my"
+}
+```
+
+### 2. user_transcription
+
+Fired when the user finishes a speech segment. Contains the final transcription for that turn.
+
+```json
+{
+ "event_type": "user_transcription",
+ "event_id": "evt_abc456",
+ "timestamp": "2026-03-02T10:00:02.456Z",
+ "call_id": "CALL-1758124225863-80752e",
+ "user_transcription_text": "I wanted to ask about my recent order"
+}
+```
+
+### 3. tts_completed
+
+Fired when the agent finishes speaking a TTS segment. Contains the text that was spoken and optionally the TTS latency.
+
+```json
+{
+ "event_type": "tts_completed",
+ "event_id": "evt_abc789",
+ "timestamp": "2026-03-02T10:00:03.789Z",
+ "call_id": "CALL-1758124225863-80752e",
+ "tts_latency": 245,
+ "tts_text": "Sure, I can help you with your recent order. Could you provide your order number?"
+}
+```
+
+## Lifecycle Events
+
+### sse_init
+
+Sent immediately when the SSE connection is established.
+
+```json
+{
+ "event_type": "sse_init",
+ "event_time": "2026-03-02T10:00:00.000Z"
+}
+```
+
+### sse_close
+
+Sent when the call ends, right before the server closes the connection.
+
+```json
+{
+ "event_type": "sse_close",
+ "event_time": "2026-03-02T10:05:00.000Z"
+}
+```
+
+## Usage Examples
+
+### cURL
+
+```bash
+curl -N 'https://api.smallest.ai/atoms/v1/events?callId=CALL-1758124225863-80752e' \
+ -H 'Cookie: your_session_cookie' \
+ -H 'Accept: text/event-stream'
+```
+
+### JavaScript (Browser)
+
+```javascript
+const callId = "CALL-1758124225863-80752e";
+const evtSource = new EventSource(
+ `/api/v1/events?callId=${callId}`,
+ { withCredentials: true }
+);
+
+evtSource.onmessage = (event) => {
+ const data = JSON.parse(event.data);
+
+ switch (data.event_type) {
+ case "user_interim_transcription":
+ // Update live transcription preview (partial, will change)
+ console.log("[STT interim]", data.interim_transcription_text);
+ break;
+
+ case "user_transcription":
+ // Final user speech for this turn
+ console.log("[STT final]", data.user_transcription_text);
+ break;
+
+ case "tts_completed":
+ // Agent finished speaking this segment
+ console.log("[TTS]", data.tts_text);
+ break;
+
+ case "sse_close":
+ // Call ended, clean up
+ evtSource.close();
+ break;
+ }
+};
+
+evtSource.onerror = (err) => {
+ console.error("SSE connection error:", err);
+ evtSource.close();
+};
+```
+
+### Node.js
+
+```javascript
+import EventSource from "eventsource";
+
+const BASE_URL = "https://api.smallest.ai/atoms/v1";
+const callId = "CALL-1758124225863-80752e";
+
+const es = new EventSource(
+ `${BASE_URL}/events?callId=${callId}`,
+ { headers: { Cookie: "your_session_cookie" } }
+);
+
+es.onmessage = (event) => {
+ const data = JSON.parse(event.data);
+
+ if (data.event_type === "user_transcription") {
+ console.log(`User said: ${data.user_transcription_text}`);
+ }
+
+ if (data.event_type === "tts_completed") {
+ console.log(`Agent said: ${data.tts_text}`);
+ }
+
+ if (data.event_type === "sse_close") {
+ es.close();
+ }
+};
+```
+
+### Python
+
+```python
+import json
+import requests
+
+url = "https://api.smallest.ai/atoms/v1/events"
+params = {"callId": "CALL-1758124225863-80752e"}
+headers = {
+ "Cookie": "your_session_cookie",
+ "Accept": "text/event-stream",
+}
+
+with requests.get(url, params=params, headers=headers, stream=True) as resp:
+ for line in resp.iter_lines(decode_unicode=True):
+ if not line or not line.startswith("data: "):
+ continue
+
+ data = json.loads(line[len("data: "):])
+
+ if data["event_type"] == "user_interim_transcription":
+ print(f"[STT interim] {data['interim_transcription_text']}")
+
+ elif data["event_type"] == "user_transcription":
+ print(f"[STT final] {data['user_transcription_text']}")
+
+ elif data["event_type"] == "tts_completed":
+ print(f"[TTS] {data['tts_text']}")
+
+ elif data["event_type"] == "sse_close":
+ print("Call ended.")
+ break
+```
+
+## Notes
+
+- The connection is **real-time** — events stream directly from the call runtime as they are produced.
+- **Interim transcriptions** are partial and will be superseded by the final `user_transcription` event. Use them for live preview UI only.
+- The SSE connection **auto-closes** when the call ends (`sse_close` event). The server will also terminate the connection.
+- **Only active calls** can be subscribed to. Completed calls return a 400 error.
+- Other event types (e.g. `call_start`, `call_end`, `turn_latency`, metrics) are also sent on this stream but are not covered in this doc.
diff --git a/fern/products/atoms/pages/dev/build/campaigns/creating-campaigns.mdx b/fern/products/atoms/pages/dev/build/campaigns/creating-campaigns.mdx
index 5598f9f..644af29 100644
--- a/fern/products/atoms/pages/dev/build/campaigns/creating-campaigns.mdx
+++ b/fern/products/atoms/pages/dev/build/campaigns/creating-campaigns.mdx
@@ -1,6 +1,212 @@
---
-title: "Creating Campaigns"
-description: "Create outbound campaigns"
+title: "Running Campaigns"
+sidebarTitle: "Running Campaigns"
+description: "Create, start, monitor, and manage outbound call campaigns."
---
-# Creating Campaigns
+This guide walks through the complete campaign lifecycle—from setup to cleanup.
+
+## Prerequisites
+
+Before creating a campaign, you need:
+
+- **Agent ID** — Create one with `new_agent()` or use an existing agent
+- **Audience ID** — Create one with `create_audience()` ([see Audiences](/atoms/developer-guide/build/campaigns/managing-audiences))
+- **Phone Number ID** — Retrieve available numbers with `get_phone_numbers()`
+
+---
+
+## Getting Your Phone Number
+
+`get_phone_numbers()` returns all outbound phone numbers available for campaigns:
+
+```python
+from smallestai.atoms import AtomsClient
+from smallestai.atoms.campaign import Campaign
+
+client = AtomsClient()
+campaign = Campaign()
+
+phones = client.get_phone_numbers()
+phone_id = phones["data"][0]["_id"]
+```
+
+Each phone includes provider details:
+
+```json
+{
+ "status": true,
+ "data": [
+ {
+ "_id": "6963d3a8862e1cb702da7244",
+ "attributes": {
+ "provider": "plivo",
+ "phoneNumber": "+912268093560"
+ },
+ "isActive": true
+ }
+ ]
+}
+```
+
+---
+
+## Creating a Campaign
+
+`create()` creates a campaign linking your agent, audience, and phone number:
+
+```python
+response = campaign.create(
+ name="January Outreach",
+ agent_id=agent_id,
+ audience_id=audience_id,
+ phone_ids=[phone_id],
+ max_retries=2,
+ retry_delay=30
+)
+
+campaign_id = response["data"]["_id"]
+```
+
+The response includes all campaign details:
+
+```json
+{
+ "status": true,
+ "data": {
+ "name": "January Outreach",
+ "agentId": "696ddd281ea16a73cb8aafbe",
+ "audienceId": "696ddd287f45bf7b27344e7c",
+ "participantsCount": 2,
+ "maxRetries": 2,
+ "retryDelay": 30,
+ "status": "draft",
+ "_id": "696ddd2a04ff172dbd8eddad"
+ // ...
+ }
+}
+```
+
+### Campaign Parameters
+
+| Parameter | Type | Description |
+|-----------|------|-------------|
+| `name` | string | Campaign name (required) |
+| `agent_id` | string | Agent to handle calls (required) |
+| `audience_id` | string | Contacts to dial (required) |
+| `phone_ids` | list | Outbound phone number IDs (required) |
+| `max_retries` | int | Retry attempts for failed calls (0–10, default: 3) |
+| `retry_delay` | int | Minutes between retries (1–1440, default: 15) |
+
+---
+
+## Starting a Campaign
+
+`start()` begins dialing contacts in the audience:
+
+```python
+result = campaign.start(campaign_id)
+```
+
+The response confirms the campaign is processing:
+
+```json
+{
+ "status": true,
+ "data": {
+ "message": "Campaign is being processed",
+ "taskId": "081a5402-3f1f-4447-a257-6dd7bc6bad60",
+ "campaignId": "696ddd2a04ff172dbd8eddad"
+ }
+}
+```
+
+---
+
+## Monitoring Progress
+
+`get()` returns the campaign status, execution history, and metrics:
+
+```python
+status = campaign.get(campaign_id)
+
+data = status["data"]["campaign"]
+metrics = status["data"]["metrics"]
+
+print(f"Status: {data['status']}")
+print(f"Called: {metrics['contacts_called']}/{metrics['total_participants']}")
+print(f"Connected: {metrics['contacts_connected']}")
+```
+
+Full status response:
+
+```json
+{
+ "status": true,
+ "data": {
+ "campaign": {
+ "status": "running",
+ "executions": [
+ {
+ "executionNumber": 1,
+ "status": "completed",
+ "totalMembers": 2,
+ "processedMembers": 2
+ }
+ ]
+ },
+ // ...
+ "metrics": {
+ "total_participants": 2,
+ "contacts_called": 2,
+ "contacts_connected": 1
+ }
+ }
+}
+```
+
+---
+
+## Cleaning Up
+
+`delete()` removes the campaign and its execution history:
+
+```python
+campaign.delete(campaign_id)
+```
+
+
+Running campaigns should be paused before deletion. Use `pause(id)` first if needed.
+
+
+---
+
+## SDK Reference
+
+| Method | Description |
+|--------|-------------|
+| `get_phone_numbers()` | List available outbound numbers (via generic client) |
+| `create(...)` | Create a campaign |
+| `start(id)` | Begin dialing |
+| `get(id)` | Get status and metrics |
+| `pause(id)` | Pause a running campaign |
+| `delete(id)` | Remove a campaign |
+
+---
+
+## Tips
+
+
+
+ `contacts_called` counts dial attempts. `contacts_connected` counts answered calls. The difference represents voicemail, busy signals, and no-answers.
+
+
+ Failed calls enter the retry queue based on your `max_retries` and `retry_delay` settings. After all retries are exhausted, the contact is marked as failed.
+
+
+ Yes. Each campaign operates independently. Just ensure you have sufficient phone capacity for parallel dialing.
+
+
+ Campaigns cannot change agents after creation. Create a new campaign with the desired agent and audience.
+
+
diff --git a/fern/products/atoms/pages/dev/build/campaigns/managing-audiences.mdx b/fern/products/atoms/pages/dev/build/campaigns/managing-audiences.mdx
index d975206..3edbc37 100644
--- a/fern/products/atoms/pages/dev/build/campaigns/managing-audiences.mdx
+++ b/fern/products/atoms/pages/dev/build/campaigns/managing-audiences.mdx
@@ -1,6 +1,177 @@
---
-title: "Managing Audiences"
-description: "Audience lists and segmentation"
+title: "Audiences"
+sidebarTitle: "Audiences"
+description: "Create and manage contact lists for outbound campaigns."
---
-# Managing Audiences
+An **Audience** is a curated list of phone numbers your campaigns will dial. Think of it as a segment—leads to call, customers to survey, appointments to confirm.
+
+## Creating an Audience
+
+Use `create_audience` with a list of phone numbers and optional contact names:
+
+```python
+from smallestai.atoms.audience import Audience
+
+audience = Audience()
+
+response = audience.create(
+ name="Q1 Sales Leads",
+ phone_numbers=["+916366821717", "+919353662554"],
+ names=[("John", "Doe"), ("Jane", "Smith")]
+)
+
+audience_id = response["data"]["_id"]
+```
+
+The response confirms creation with the audience ID:
+
+```json
+{
+ "status": true,
+ "data": {
+ "name": "Q1 Sales Leads",
+ "phoneNumberColumnName": "phoneNumber",
+ "_id": "696ddd56b905442f52b71392"
+ }
+}
+```
+
+
+Phone numbers must use E.164 format: `+` followed by country code and number. Example: `+916366821717`
+
+
+---
+
+## Listing Audiences
+
+`list()` returns all audiences with their campaign associations:
+
+```python
+audiences = audience.list()
+```
+
+Each audience includes campaign associations and member counts:
+
+```json
+{
+ "status": true,
+ "data": [
+ {
+ "_id": "696ddd56b905442f52b71392",
+ "name": "Q1 Sales Leads",
+ "memberCount": 2,
+ "hasCampaigns": true,
+ "campaigns": [
+ {"_id": "...", "name": "January Outreach", "status": "completed"}
+ ]
+ }
+ ]
+}
+```
+
+---
+
+## Viewing Members
+
+`get_members()` returns a paginated list of contacts in the audience:
+
+```python
+members = audience.get_members(
+ audience_id=audience_id,
+ page=1,
+ offset=10
+)
+```
+
+Each member stores their contact data:
+
+```json
+{
+ "status": true,
+ "data": {
+ "members": [
+ {
+ "_id": "696ddd56b905442f52b71394",
+ "data": {
+ "firstName": "John",
+ "lastName": "Doe",
+ "phoneNumber": "+916366821717"
+ }
+ }
+ ],
+ "totalCount": 2,
+ "totalPages": 1,
+ "hasMore": false
+ }
+}
+```
+
+---
+
+## Adding Members
+
+`add_contacts()` appends new contacts to an existing audience:
+
+```python
+audience.add_contacts(
+ audience_id=audience_id,
+ phone_numbers=["+919876543210"],
+ names=[("New", "Contact")]
+)
+```
+
+The response reports how many were added:
+
+```json
+{
+ "status": true,
+ "data": [{"message": "1 members added successfully", "data": {"added": 1, "skipped": 0}}]
+}
+```
+
+---
+
+## Deleting an Audience
+
+`delete()` removes the audience and all its members:
+
+```python
+audience.delete(audience_id=audience_id)
+```
+
+
+Audiences with active campaigns cannot be deleted. Complete or delete the campaigns first.
+
+
+---
+
+## SDK Reference
+
+| Method | Description |
+|--------|-------------|
+| `create(name, phone_numbers, names)` | Create a new audience |
+| `list()` | List all audiences |
+| `get(id)` | Get a single audience |
+| `get_members(id, page, offset)` | Paginated member list |
+| `add_contacts(id, phone_numbers, names)` | Append contacts |
+| `delete(id)` | Remove an audience |
+
+---
+
+## Tips
+
+
+
+ E.164 format is required: `+` followed by country code and number with no spaces or dashes. Example: `+14155551234` for US, `+916366821717` for India.
+
+
+ Currently, you can add new members but not update existing ones. To change a contact's info, delete and recreate the audience or add the corrected record (duplicates are skipped).
+
+
+ Audiences can scale to thousands of contacts. For very large lists, consider splitting into segments for easier management.
+
+
+ Members with duplicate phone numbers within the same audience are skipped. Check that each phone number is unique.
+
+
diff --git a/fern/products/atoms/pages/dev/build/campaigns/overview.mdx b/fern/products/atoms/pages/dev/build/campaigns/overview.mdx
new file mode 100644
index 0000000..a47b59f
--- /dev/null
+++ b/fern/products/atoms/pages/dev/build/campaigns/overview.mdx
@@ -0,0 +1,84 @@
+---
+title: "Campaigns"
+sidebarTitle: "Overview"
+description: "Run outbound call campaigns at scale with the Atoms SDK."
+---
+
+Campaigns let your agents call through a list of contacts automatically. Upload an audience, assign an agent and phone number, then start the campaign — Atoms handles dialing, retries, and tracking.
+
+---
+
+## What You Can Do
+
+| Action | Method | Description |
+|--------|--------|-------------|
+| **Create** | `campaign.create()` | Set up a new campaign with agent, audience, and phone number |
+| **Start** | `campaign.start()` | Begin dialing contacts in the audience |
+| **Pause** | `campaign.pause()` | Temporarily stop dialing (resume later) |
+| **Monitor** | `campaign.get()` | Check progress, call counts, and status |
+| **Delete** | `campaign.delete()` | Remove a campaign and its data |
+
+---
+
+## How It Works
+
+```
+Audience (contacts) + Agent + Phone Number
+ ↓
+ Create Campaign
+ ↓
+ Start Campaign
+ ↓
+ Atoms dials each contact → Agent handles the call
+ ↓
+ Monitor progress → Pause/Resume as needed
+```
+
+---
+
+## Prerequisites
+
+Before running a campaign, you need three things:
+
+1. **An agent** — the AI that handles each call
+2. **An audience** — the list of phone numbers to dial
+3. **A phone number** — the outbound number your agent calls from
+
+```python
+from smallestai.atoms import AtomsClient
+from smallestai.atoms.campaign import Campaign
+
+client = AtomsClient()
+campaign = Campaign()
+
+# Get available phone numbers
+phones = client.get_phone_numbers()
+phone_id = phones[0]["_id"]
+```
+
+---
+
+## Campaign Lifecycle
+
+Campaigns move through these statuses:
+
+| Status | Meaning |
+|--------|---------|
+| **Draft** | Created but not started |
+| **Active** | Currently dialing contacts |
+| **Paused** | Temporarily stopped |
+| **Completed** | All contacts have been called |
+| **Failed** | Encountered an error |
+
+---
+
+## What's Next
+
+
+
+ Create and update contact lists for your campaigns.
+
+
+ Full walkthrough: create, start, monitor, and clean up.
+
+
diff --git a/fern/products/atoms/pages/dev/build/knowledge-base/overview.mdx b/fern/products/atoms/pages/dev/build/knowledge-base/overview.mdx
index 07253cc..2ee0610 100644
--- a/fern/products/atoms/pages/dev/build/knowledge-base/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/knowledge-base/overview.mdx
@@ -1,35 +1,69 @@
---
title: "Knowledge Base"
sidebarTitle: "Overview"
-description: "Give your agents access to your documents and data."
+description: "Give your agents accurate, domain-specific knowledge."
---
-A **Knowledge Base** (KB) is a searchable container for your content. Upload documents, FAQs, and product information, and your agent can answer questions based on that data automatically.
+A **Knowledge Base** is a collection of documents your agent can reference during conversations. Instead of relying solely on the LLM's training data, agents with a knowledge base provide answers grounded in *your* information.
-When a user asks a question, the platform searches your KB, finds relevant content, and includes it in the LLM's context—so your agent answers using real information instead of making things up.
+## Why Knowledge Bases Matter
-## What We Offer
+LLMs are powerful but imperfect. They hallucinate facts, go out of date, and know nothing about your specific business. Knowledge bases solve this.
-| Feature | Description |
-|---------|-------------|
-| **Document Upload** | Upload PDFs to be indexed and searchable |
-| **Automatic Retrieval** | Platform searches KB when users ask questions |
-| **Agent Integration** | Assign KBs to agents via `global_knowledge_base_id` |
-| **Multiple KBs** | Create separate KBs for different purposes |
+| Problem | Solution |
+|---------|----------|
+| **Hallucination** | Agent answers from verified documents, not imagination |
+| **Stale data** | Update your KB anytime; agent always has current info |
+| **Domain gaps** | Upload product specs, policies, FAQs—whatever your domain needs |
+| **Consistency** | Every agent using the same KB gives the same answers |
+
+## How It Works
+
+When a user asks a question:
+
+1. The agent searches the knowledge base for relevant content
+2. Matching passages are injected into the LLM context
+3. The agent responds using this grounded information
+
+This is called **Retrieval-Augmented Generation (RAG)**—your agent retrieves before it generates.
+
+---
+
+## Use Cases
+
+- **Product Support** — Upload manuals, troubleshooting guides, warranty policies. Agents answer product questions accurately.
+- **Sales Enablement** — Add pricing sheets, feature comparisons, objection handlers. Agents sell with confidence.
+- **HR & Onboarding** — Store employee handbooks, benefits info, org charts. New hire questions handled instantly.
+- **Legal & Compliance** — Include policies, regulations, approved language. Agents stay within bounds.
+
+---
+
+## Key Concepts
+
+### One Agent, One KB
+
+Each agent can link to one knowledge base via the `globalKnowledgeBaseId` field. This becomes the default source for all conversations with that agent.
+
+### KB Independence
+
+Knowledge bases exist independently of agents. You can:
+- Create a KB first, then link agents later
+- Reuse one KB across multiple agents
+- Update KB content without touching agent configuration
+
+### Document Types
+
+Currently supported:
+- **PDF files** (preferred) via the upload endpoint
+- **URL scraping** (fetch and ingest page content)
+- **Text content** (when the text upload endpoint is deployed, will be available soon)
+
+---
## What's Next
-
-
- Create and manage knowledge bases.
-
-
- Add documents to your KB.
-
-
- Best practices and troubleshooting.
-
-
- Connect KB to your agents.
+
+
+ Create a knowledge base, upload content, and link it to an agent.
diff --git a/fern/products/atoms/pages/dev/build/knowledge-base/usage.mdx b/fern/products/atoms/pages/dev/build/knowledge-base/usage.mdx
index f99a0fd..f3d0c8d 100644
--- a/fern/products/atoms/pages/dev/build/knowledge-base/usage.mdx
+++ b/fern/products/atoms/pages/dev/build/knowledge-base/usage.mdx
@@ -1,191 +1,169 @@
---
title: "Using Knowledge Bases"
sidebarTitle: "Usage"
-description: "Create, populate, and connect Knowledge Bases to your agents."
+description: "Create, upload content, and connect knowledge bases to your agents."
---
-Knowledge Bases give your agents context from your documents. Upload PDFs, and the platform automatically retrieves relevant information during conversations.
+This guide walks through the complete knowledge base workflow—from creation to agent integration.
-## Complete Workflow
+## Creating a Knowledge Base
+
+Every KB starts with a name and optional description. Use the `create` method:
```python
+from smallestai.atoms.kb import KB
from smallestai.atoms import AtomsClient
-from smallestai.atoms.models import KnowledgebasePostRequest, CreateAgentRequest
-import time
+# Initialize separate managers
+kb = KB()
client = AtomsClient()
-# 1. Create Knowledge Base
-kb = client.create_knowledge_base(
- knowledgebase_post_request=KnowledgebasePostRequest(
- name="ProductDocs",
- description="Product documentation"
- )
-)
-kb_id = kb.data
-
-# 2. Upload Documents
-with open("manual.pdf", "rb") as f:
- client.upload_media_to_knowledge_base(id=kb_id, media=("manual.pdf", f.read()))
-
-# 3. Wait for Processing
-for _ in range(10):
- items = client.get_knowledge_base_items(id=kb_id).data
- if all(item.processing_status == "completed" for item in items):
- print("Ready!")
- break
- time.sleep(2)
-
-# 4. Create Agent with KB
-agent = client.create_agent(
- create_agent_request=CreateAgentRequest(
- name="SupportBot",
- global_knowledge_base_id=kb_id,
- global_prompt="Answer using the knowledge base.",
- slm_model="gpt-4o"
- )
+# Create KB
+response = kb.create(
+ name="Product Documentation",
+ description="Technical specs and troubleshooting guides"
)
-```
-## Creating a Knowledge Base
+kb_id = response["data"]
+```
-```python
-from smallestai.atoms.models import KnowledgebasePostRequest
+The response contains the KB ID you'll use for all subsequent operations:
-kb = client.create_knowledge_base(
- knowledgebase_post_request=KnowledgebasePostRequest(
- name="CompanyKB",
- description="Internal documentation"
- )
-)
-kb_id = kb.data
+```json
+{
+ "status": true,
+ "data": "696ddd64b9f099f0679fdb41"
+}
```
-## Uploading Documents
+---
-### PDF Files
+## Retrieving KB Details
-```python
-with open("manual.pdf", "rb") as f:
- client.upload_media_to_knowledge_base(
- id=kb_id,
- media=("manual.pdf", f.read())
- )
-```
+### Single Knowledge Base
-### Multiple Files
+`get()` retrieves the full details of a specific KB:
```python
-import os
+details = kb.get(kb_id)
+```
-for filename in os.listdir("./documents"):
- if filename.endswith(".pdf"):
- with open(f"./documents/{filename}", "rb") as f:
- client.upload_media_to_knowledge_base(id=kb_id, media=(filename, f.read()))
+Returns the full KB object:
+
+```json
+{
+ "status": true,
+ "data": {
+ "_id": "696ddd64b9f099f0679fdb41",
+ "name": "Product Documentation",
+ "description": "Technical specs and troubleshooting guides",
+ "organization": "693abd625a5f74726c0450a4",
+ "createdBy": "693abd625a5f74726c0450a1"
+ }
+}
```
-## Checking Processing Status
+### All Knowledge Bases
-Documents are processed asynchronously. Poll until complete:
+`list()` returns every KB in your organization:
```python
-import time
-
-def wait_for_processing(client, kb_id, timeout=60):
- start = time.time()
-
- while time.time() - start < timeout:
- items = client.get_knowledge_base_items(id=kb_id).data
-
- if all(item.processing_status == "completed" for item in items):
- return True
-
- time.sleep(2)
-
- return False
+all_kbs = kb.list()
+
+for item in all_kbs["data"]:
+ print(f"{item['name']}: {item['_id']}")
```
-| Status | Meaning |
-|--------|---------|
-| `pending` | Queued |
-| `processing` | Being indexed |
-| `completed` | Ready |
-| `failed` | Error |
+---
-## Connecting to Agents
+## Linking a KB to an Agent
-### At Creation
+The connection happens at agent creation time. Pass `kb_id` to the `new_agent` helper:
```python
-from smallestai.atoms.models import CreateAgentRequest
-
-agent = client.create_agent(
- create_agent_request=CreateAgentRequest(
- name="SupportBot",
- global_knowledge_base_id=kb_id,
- global_prompt="Answer using the knowledge base.",
- slm_model="gpt-4o"
- )
+agent = client.new_agent(
+ name="Support Agent",
+ prompt="You are a helpful support agent. Use your knowledge base to answer product questions accurately.",
+ description="Agent with product KB",
+ kb_id=kb_id
)
-```
-### Update Existing Agent
+agent_id = agent.data
+```
-```python
-from smallestai.atoms.models import AgentIdPatchRequest
+The agent now has access to all content in that knowledge base during conversations.
-# Connect KB
-client.update_agent(
- id=agent_id,
- agent_id_patch_request=AgentIdPatchRequest(global_knowledge_base_id=kb_id)
-)
-
-# Disconnect KB
-client.update_agent(
- id=agent_id,
- agent_id_patch_request=AgentIdPatchRequest(global_knowledge_base_id="")
-)
-```
+---
-## Managing Documents
+## Verifying the Link
-### List Items
+`get_agent_by_id()` returns the agent with its `globalKnowledgeBaseId` field:
```python
-items = client.get_knowledge_base_items(id=kb_id).data
+agent_details = client.get_agent_by_id(id=agent_id)
-for item in items:
- print(f"{item.id}: {item.file_name or item.title}")
+linked_kb = agent_details["data"]["globalKnowledgeBaseId"]
+print(f"Agent is linked to KB: {linked_kb}")
```
-### Delete KB
+The response includes the linked KB ID:
+
+```json
+{
+ "status": true,
+ "data": {
+ "_id": "696ddd6593f50590da907bcf",
+ "name": "Support Agent",
+ "globalKnowledgeBaseId": "696ddd64b9f099f0679fdb41",
+ "globalPrompt": "You are a helpful support agent..."
+ }
+}
+```
+
+---
+
+## Deleting a Knowledge Base
- Disconnect the KB from agents before deleting.
+A knowledge base cannot be deleted while it's connected to an agent. Delete or archive the agent first.
+Use `delete_agent()` to archive the agent, then `delete()` to remove the KB:
+
```python
-from smallestai.atoms.models import AgentIdPatchRequest
+# First, remove the agent
+client.delete_agent(id=agent_id)
-client.update_agent(
- id=agent_id,
- agent_id_patch_request=AgentIdPatchRequest(global_knowledge_base_id="")
-)
-client.delete_knowledge_base(id=kb_id)
+# Then delete the KB
+kb.delete(kb_id)
```
-## Best Practices
+---
+
+## SDK Reference
+
+| Method | Description |
+|--------|-------------|
+| `kb.create(name, description)` | Create a new knowledge base |
+| `kb.list()` | List all KBs in your organization |
+| `kb.get(id)` | Retrieve a specific KB |
+| `kb.delete(id)` | Delete a KB (must be unlinked first) |
+
+---
+
+## Tips
-
- Upload content relevant to your agent's purpose. Quality over quantity.
+
+ Currently, each agent supports one knowledge base via `globalKnowledgeBaseId`. For multiple knowledge sources, combine them into a single KB before linking.
+
+
+ PDF files are fully supported. Text upload is available but may require backend deployment. Check with your administrator.
-
-
- Always confirm `completed` status before using with an agent.
+
+ Upload new documents to the same KB. The agent will automatically use the updated content in future conversations.
-
-
- Make test calls to verify the agent correctly uses KB content.
+
+ The error "This knowledge base is connected to an agent" means you must delete or archive the linked agent first. KBs with active connections cannot be removed.
diff --git a/fern/products/atoms/pages/dev/build/phone-calling/call-control.mdx b/fern/products/atoms/pages/dev/build/phone-calling/call-control.mdx
index 825a454..01bc49e 100644
--- a/fern/products/atoms/pages/dev/build/phone-calling/call-control.mdx
+++ b/fern/products/atoms/pages/dev/build/phone-calling/call-control.mdx
@@ -11,19 +11,20 @@ Control the call flow from within your agent. End calls gracefully or transfer t
Use `SDKAgentEndCallEvent` to end the call:
```python
-from smallestai.atoms.agent.nodes.output_agent import OutputAgentNode
+from smallestai.atoms.agent.nodes import OutputAgentNode
from smallestai.atoms.agent.events import SDKAgentEndCallEvent
from smallestai.atoms.agent.tools import function_tool
class MyAgent(OutputAgentNode):
@function_tool()
- def end_call(self) -> SDKAgentEndCallEvent:
+ async def end_call(self) -> None:
"""End the call gracefully."""
- return SDKAgentEndCallEvent()
+ await self.send_event(SDKAgentEndCallEvent())
+ return None
```
- `SDKAgentEndCallEvent` has no parameters.
+ Tools that send SDK events must use `await self.send_event()` and return `None`. Simply returning the event object won't work.
## Transferring to Humans
@@ -40,15 +41,18 @@ from smallestai.atoms.agent.tools import function_tool
class MyAgent(OutputAgentNode):
@function_tool()
- def transfer_to_human(self) -> SDKAgentTransferConversationEvent:
+ async def transfer_to_human(self) -> None:
"""Transfer to a human agent."""
- return SDKAgentTransferConversationEvent(
+ await self.send_event(
+ SDKAgentTransferConversationEvent(
transfer_call_number="+14155551234",
transfer_options=TransferOption(
type=TransferOptionType.COLD_TRANSFER
),
on_hold_music="relaxing_sound"
)
+ )
+ return None
```
### Transfer Parameters
@@ -62,7 +66,12 @@ class MyAgent(OutputAgentNode):
### Transfer Types
```python
-from smallestai.atoms.agent.events import TransferOption, TransferOptionType
+from smallestai.atoms.agent.events import (
+ TransferOption,
+ TransferOptionType,
+ WarmTransferPrivateHandoffOption,
+ WarmTransferHandoffOptionType,
+)
# Cold transfer (immediate handoff)
cold = TransferOption(type=TransferOptionType.COLD_TRANSFER)
@@ -70,10 +79,10 @@ cold = TransferOption(type=TransferOptionType.COLD_TRANSFER)
# Warm transfer (agent briefs human first)
warm = TransferOption(
type=TransferOptionType.WARM_TRANSFER,
- private_handoff_option={
- "type": "prompt",
- "prompt": "Customer calling about billing"
- }
+ private_handoff_option=WarmTransferPrivateHandoffOption(
+ type=WarmTransferHandoffOptionType.PROMPT,
+ prompt="Customer calling about billing"
+ )
)
```
diff --git a/fern/products/atoms/pages/dev/build/phone-calling/campaigns.mdx b/fern/products/atoms/pages/dev/build/phone-calling/campaigns.mdx
index b618c1c..eedbc4f 100644
--- a/fern/products/atoms/pages/dev/build/phone-calling/campaigns.mdx
+++ b/fern/products/atoms/pages/dev/build/phone-calling/campaigns.mdx
@@ -18,173 +18,240 @@ Create → Start → Running → Pause/Complete → Delete
Before creating a campaign, you need:
-1. **Agent** — With a phone number linked (configured in Dashboard)
-2. **Audience** — A contact list uploaded in Dashboard
-3. **Phone Number** — Assigned to your agent in Dashboard → Phone Numbers
+1. **Agent** — Created via SDK or Dashboard
+2. **Audience** — Contact list with phone numbers
+3. **Phone Number ID** — From `get_phone_numbers()`
- Link a phone number to your agent in the [Dashboard](https://atoms.smallest.ai) under **Phone Numbers**. Campaigns use the phone number assigned to the agent as the caller ID.
+ Get your phone number ID using `client.get_phone_numbers()` — the `_id` field is what you pass to campaigns.
-
- Create audiences by uploading a CSV with columns:
- `phoneNumber`, `Name`, `Address`, `Email`, `CustomerID`
-
-
-## Creating a Campaign
-
-### Basic Campaign
+## Quick Start
```python
from smallestai.atoms import AtomsClient
+from smallestai.atoms.audience import Audience
+from smallestai.atoms.campaign import Campaign
client = AtomsClient()
+audience = Audience()
+campaign = Campaign()
+
+# 1. Get phone number
+phones = client.get_phone_numbers()
+phone_id = phones["data"][0]["_id"]
+
+# 2. Create agent
+agent = client.new_agent(
+ name="Campaign Agent",
+ prompt="You are a friendly assistant.",
+ description="Agent for outreach"
+)
+agent_id = agent.data
+
+# 3. Create audience
+aud = audience.create(
+ name="My Contacts",
+ phone_numbers=["+916366821717", "+919353662554"],
+ names=[("John", "Doe"), ("Jane", "Smith")]
+)
+audience_id = aud["data"]["_id"]
+
+# 4. Create campaign
+camp = campaign.create(
+ name="Outreach Campaign",
+ agent_id=agent_id,
+ audience_id=audience_id,
+ phone_ids=[phone_id],
+ description="Follow-up calls",
+ max_retries=2,
+ retry_delay=15
+)
+campaign_id = camp["data"]["_id"]
+
+# 5. Start campaign
+campaign.start(campaign_id)
+print(f"Campaign started: {campaign_id}")
+```
+
+## Creating an Audience
+
+```python
+from smallestai.atoms.audience import Audience
-campaign = client.create_campaign(
- campaign_post_request={
- "name": "January Lead Follow-up",
- "description": "Follow up with leads from webinar",
- "agentId": "your-agent-id", # Must have phone linked
- "audienceId": "your-audience-id"
- }
+audience = Audience()
+
+# Create with phone numbers and names
+result = audience.create(
+ name="January Leads",
+ phone_numbers=["+916366821717", "+919353662554"],
+ names=[("John", "Doe"), ("Jane", "Smith")]
)
-campaign_id = campaign.data.get('_id')
-print(f"Created campaign: {campaign_id}")
+audience_id = result["data"]["_id"]
+print(f"Created audience: {audience_id}")
```
-### With Retry and Schedule Settings
+### Adding Contacts Later
```python
-import requests
-import os
-from datetime import datetime, timedelta, timezone
-
-API_KEY = os.getenv("SMALLEST_API_KEY")
-
-# Schedule for tomorrow at 9 AM UTC
-scheduled_time = datetime.now(timezone.utc).replace(
- hour=9, minute=0, second=0
-) + timedelta(days=1)
-
-response = requests.post(
- "https://atoms.smallest.ai/api/v1/campaign",
- headers={
- "Authorization": f"Bearer {API_KEY}",
- "Content-Type": "application/json"
- },
- json={
- "name": "Summer Sale Campaign",
- "description": "Promotional calls",
- "agentId": "agent-with-phone",
- "audienceId": "summer-leads",
- "maxRetries": 3, # Retry unanswered (0-10)
- "retryDelay": 15, # Minutes between retries (1-1440)
- "scheduledAt": scheduled_time.isoformat()
- }
+# Add more contacts to existing audience
+audience.add_contacts(
+ audience_id=audience_id,
+ phone_numbers=["+919876543210"],
+ names=[("New", "User")]
+)
+```
+
+## Creating a Campaign
+
+```python
+from smallestai.atoms.campaign import Campaign
+
+campaign = Campaign()
+
+result = campaign.create(
+ name="Follow-up Campaign",
+ agent_id="your-agent-id",
+ audience_id="your-audience-id",
+ phone_ids=["your-phone-id"],
+ description="Following up with leads",
+ max_retries=3,
+ retry_delay=15
)
-result = response.json()
campaign_id = result["data"]["_id"]
-print(f"Scheduled campaign: {campaign_id}")
```
### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
-| `name` | string | Yes | Campaign name (max 40 chars) |
-| `description` | string | No | Notes about the campaign |
-| `agentId` | string | Yes | Agent ID (must have phone linked) |
-| `audienceId` | string | Yes | Contact list to dial |
-| `maxRetries` | int | No | Retry unanswered (0-10, default: 3) |
-| `retryDelay` | int | No | Minutes between retries (1-1440, default: 15) |
-| `scheduledAt` | string | No | ISO timestamp to auto-start |
+| `name` | string | Yes | Campaign name |
+| `agent_id` | string | Yes | Agent ID |
+| `audience_id` | string | Yes | Contact list ID |
+| `phone_ids` | list | Yes | Phone number IDs (from `get_phone_numbers()`) |
+| `description` | string | No | Campaign description |
+| `max_retries` | int | No | Retry unanswered (0-10, default: 3) |
+| `retry_delay` | int | No | Minutes between retries (default: 15) |
## Starting a Campaign
```python
-client.start_campaign(id=campaign_id)
-print("Campaign started")
+campaign.start(campaign_id)
+print("Campaign started!")
```
-Scheduled campaigns start automatically at the specified time.
-
-## Checking Campaign Status
+## Monitoring Progress
```python
-import requests
-import os
-
-API_KEY = os.getenv("SMALLEST_API_KEY")
+import time
-response = requests.get(
- f"https://atoms.smallest.ai/api/v1/campaign/{campaign_id}",
- headers={"Authorization": f"Bearer {API_KEY}"}
-)
-data = response.json()
+for i in range(10):
+ time.sleep(10)
+
+ status = campaign.get(campaign_id)
+ campaign_data = status["data"]["campaign"]
+ metrics = status["data"]["metrics"]
+
+ print(f"Status: {campaign_data['status']}")
+ print(f"Called: {metrics['contacts_called']}/{metrics['total_participants']}")
+
+ if campaign_data["status"] in ["completed", "failed"]:
+ break
+```
-campaign = data["data"]["campaign"]
-metrics = data["data"]["metrics"]
+## Stopping a Running Campaign
-print(f"Status: {campaign['status']}")
-print(f"Total: {metrics['total_participants']}")
-print(f"Called: {metrics['contacts_called']}")
-print(f"Connected: {metrics['contacts_connected']}")
+```python
+# Only works for running campaigns
+status = campaign.get(campaign_id)
+if status["data"]["campaign"]["status"] in ["running", "active"]:
+ campaign.stop(campaign_id)
+ print("Campaign stopped")
+else:
+ print("Campaign already completed")
```
-## Pausing a Campaign
+## Listing Campaigns
```python
-client.pause_campaign(id=campaign_id)
+campaigns = campaign.list()
+
+for c in campaigns["data"]["campaigns"]:
+ print(f"{c['name']}: {c['status']}")
```
## Deleting a Campaign
```python
-client.delete_campaign(id=campaign_id)
+campaign.delete(campaign_id)
```
## Complete Example
```python
-import requests
-import os
import time
from smallestai.atoms import AtomsClient
+from smallestai.atoms.audience import Audience
+from smallestai.atoms.campaign import Campaign
-API_KEY = os.getenv("SMALLEST_API_KEY")
-BASE_URL = "https://atoms.smallest.ai/api/v1"
-headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
-
-# 1. Create
-resp = requests.post(f"{BASE_URL}/campaign", headers=headers, json={
- "name": f"Outreach {int(time.time())}",
- "agentId": "your-agent-id",
- "audienceId": "your-audience-id",
- "maxRetries": 2,
- "retryDelay": 30
-})
-campaign_id = resp.json()["data"]["_id"]
-print(f"Created: {campaign_id}")
-
-# 2. Start
client = AtomsClient()
-client.start_campaign(id=campaign_id)
-print("Started")
-
-# 3. Monitor
-for _ in range(10):
- time.sleep(30)
- resp = requests.get(f"{BASE_URL}/campaign/{campaign_id}", headers=headers)
- status = resp.json()["data"]["campaign"]["status"]
- print(f"Status: {status}")
- if status in ["completed", "failed"]:
+audience = Audience()
+campaign = Campaign()
+
+# 1. Get phone number
+phones = client.get_phone_numbers()
+phone_id = phones["data"][0]["_id"]
+print(f"Using phone: {phones['data'][0]['attributes']['phoneNumber']}")
+
+# 2. Create agent
+agent = client.new_agent(
+ name=f"Campaign Agent {int(time.time())}",
+ prompt="You are a friendly survey agent. Ask about interest and get their name.",
+ description="Test agent"
+)
+agent_id = agent.data
+print(f"Agent: {agent_id}")
+
+# 3. Create audience
+aud = audience.create(
+ name=f"Test Audience {int(time.time())}",
+ phone_numbers=["+916366821717"],
+ names=[("Test", "User")]
+)
+audience_id = aud["data"]["_id"]
+print(f"Audience: {audience_id}")
+
+# 4. Create campaign
+camp = campaign.create(
+ name=f"Test Campaign {int(time.time())}",
+ agent_id=agent_id,
+ audience_id=audience_id,
+ phone_ids=[phone_id],
+ max_retries=1,
+ retry_delay=5
+)
+campaign_id = camp["data"]["_id"]
+print(f"Campaign: {campaign_id}")
+
+# 5. Start
+campaign.start(campaign_id)
+print("Campaign started!")
+
+# 6. Monitor
+for i in range(6):
+ time.sleep(10)
+ status = campaign.get(campaign_id)
+ print(f"Status: {status['data']['campaign']['status']}")
+ if status['data']['campaign']['status'] in ['completed', 'failed']:
break
-# 4. Delete
-client.delete_campaign(id=campaign_id)
-print("Deleted")
+# 7. Cleanup
+campaign.delete(campaign_id)
+audience.delete(audience_id)
+client.delete_agent(id=agent_id)
+print("Cleanup complete")
```
## Campaign States
@@ -202,23 +269,20 @@ print("Deleted")
| Error | Solution |
|-------|----------|
-| "No phone numbers available" | Link a phone number to your agent in Dashboard → Phone Numbers |
-| Campaign stays "draft" | Call `start_campaign()` |
-| Campaign fails immediately | Check agent has valid phone and audience has contacts |
+| "No phone numbers available" | Pass `phone_ids` from `get_phone_numbers()` |
+| Campaign stays "draft" | Call `campaign.start(campaign_id)` |
+| Campaign fails immediately | Verify agent and audience IDs are valid |
## Best Practices
-
- In Dashboard → Phone Numbers, link a phone to your agent before creating campaigns.
-
- Start with 5-10 contacts to verify before scaling.
+ Start with 1-2 contacts to verify before scaling.
2-3 retries with 15-30 minute delays balances persistence and respect.
-
- Call during 9am-8pm local time.
+
+ Monitor with `campaign.get()` and stop if needed.
diff --git a/fern/products/atoms/pages/dev/build/phone-calling/overview.mdx b/fern/products/atoms/pages/dev/build/phone-calling/overview.mdx
index 73bf55f..0865bde 100644
--- a/fern/products/atoms/pages/dev/build/phone-calling/overview.mdx
+++ b/fern/products/atoms/pages/dev/build/phone-calling/overview.mdx
@@ -38,10 +38,10 @@ Before making calls:
## What's Next
-
+
Make individual calls with code examples.
-
+
End calls and transfer to humans.
diff --git a/fern/products/atoms/pages/dev/build/voice-speech/voice-models/available-voices.mdx b/fern/products/atoms/pages/dev/build/voice-speech/voice-models/available-voices.mdx
index 7d66c87..75a07ca 100644
--- a/fern/products/atoms/pages/dev/build/voice-speech/voice-models/available-voices.mdx
+++ b/fern/products/atoms/pages/dev/build/voice-speech/voice-models/available-voices.mdx
@@ -108,7 +108,7 @@ Create custom voices with ElevenLabs:
3. Use the generated voice ID in your agent
- Voice cloning requires appropriate consent and permissions. See [Voice Cloning](/dev/build/voice-speech/advanced-voice/voice-cloning) for guidelines.
+ Voice cloning requires appropriate consent and permissions. See [Voice Cloning](/atoms/product-overview/capabilities/voice-and-speech) for guidelines.
### Request New Voices
diff --git a/fern/products/atoms/pages/dev/cookbooks/examples.mdx b/fern/products/atoms/pages/dev/cookbooks/examples.mdx
index 53d2d7f..d6a5336 100644
--- a/fern/products/atoms/pages/dev/cookbooks/examples.mdx
+++ b/fern/products/atoms/pages/dev/cookbooks/examples.mdx
@@ -1,11 +1,196 @@
---
title: "Examples"
sidebarTitle: "Examples"
-description: "Full end-to-end code examples."
+description: "Full end-to-end code examples from the cookbook."
---
-| Example | Description | Concepts | Link |
-|---------|-------------|----------|------|
-| **Getting Started** | SDK setup, outbound calls | AtomsClient, start_outbound_call | [View →](https://github.com/smallest-inc/cookbook/tree/main/atoms/getting_started) |
-| **Agent with Tools** | Custom function tools | function_tool, OutputAgentNode | [View →](https://github.com/smallest-inc/cookbook/tree/main/atoms/agent_with_tools) |
-| **Call Control** | End calls, transfer to humans | SDKAgentEndCallEvent, TransferConversationEvent | [View →](https://github.com/smallest-inc/cookbook/tree/main/atoms/call_control) |
+Complete, runnable examples you can deploy in minutes. Each example includes full source code, setup instructions, and deployment guide.
+
+
+ All examples are available in the [cookbook](https://github.com/smallest-inc/cookbook) repository.
+
+
+---
+
+## Getting Started
+
+
+
+ **5 min** · Build and deploy a basic conversational agent.
+
+ `OutputAgentNode` · `OpenAIClient` · `AtomsApp` · CLI deployment
+
+
+
+---
+
+## Agent Development
+
+
+
+ **10 min** · Give your agent actions it can perform.
+
+ `@function_tool` · `ToolRegistry` · Tool execution · LLM function calling
+
+
+
+ **15 min** · Real-time sentiment analysis alongside your main agent.
+
+ `BackgroundAgentNode` · Multi-node architecture · Shared state · Silent processing
+
+
+
+ **10 min** · Configure how your agent handles user interruptions.
+
+ `is_interruptible` · Dynamic settings · Barge-in handling
+
+
+
+ **15 min** · Multilingual agent with language detection.
+
+ Language detection · Dynamic prompts · Multi-language support
+
+
+
+---
+
+## Calling
+
+
+
+ **10 min** · End calls and transfer to human agents.
+
+ `SDKAgentEndCallEvent` · `SDKAgentTransferConversationEvent` · Cold/warm transfers · Hold music
+
+
+
+ **15 min** · Build an interactive voice response menu.
+
+ Menu navigation · DTMF handling · Department routing
+
+
+
+---
+
+## Platform Features
+
+
+
+ **15 min** · Connect your agent to a knowledge base for accurate answers.
+
+ Knowledge base setup · RAG retrieval · Document upload
+
+
+
+ **20 min** · Run outbound calling campaigns at scale.
+
+ `AtomsClient` · Audience management · Campaign creation · Batch calling
+
+
+
+---
+
+## Analytics
+
+
+
+ **10 min** · Retrieve call metrics, transcripts, and post-call analysis.
+
+ Call details · Transcript export · Post-call configuration · Metrics API
+
+
+
+---
+
+## End-to-End Projects
+
+
+
+ **30 min** · Production-grade voice banking agent with real database queries, identity verification, and compliance logging.
+
+ `BackgroundAgentNode` · SQL execution · Multi-round tool chaining · KBA verification · Audit logging · Call transfers
+
+
+
+ **30 min** · AI leasing agent with property search, tour scheduling, maintenance requests, and lead tracking — backed by a real SQLite database.
+
+ `BackgroundAgentNode` · SQL execution · Multi-round tool chaining · Lead tracking · Tour scheduling
+
+
+
+ **20 min** · Fun voice order-taker with menu browsing, pizza customization, cart management, combo deals, and deterministic pricing — zero external deps.
+
+ Multi-round tool chaining · In-memory state · Deterministic pricing · Upselling
+
+
+
+ **20 min** · Voice-based clinic receptionist that checks real Cal.com availability, negotiates time slots, and books appointments.
+
+ Cal.com API · Slot negotiation · `@function_tool` · Real calendar booking
+
+
+
+ **20 min** · State-machine-driven voice data collection with typed validation, backtracking, and native Jotform submission.
+
+ `FormEngine` · Step-by-step collection · Field validation · Jotform integration
+
+
+
+---
+
+## Observability & Integrations
+
+
+
+ **15 min** · Real-time voice agent observability with Langfuse via a BackgroundAgentNode — tool calls, LLM generations, and transcripts stream to your dashboard with zero latency impact.
+
+ `BackgroundAgentNode` · Langfuse traces · LLM generation tracking · Tool call spans
+
+
+
+ **15 min** · Error tracking and performance monitoring with Sentry via a BackgroundAgentNode — tool failures, conversation breadcrumbs, and performance metrics stream to Sentry with zero latency impact.
+
+ `BackgroundAgentNode` · Sentry transactions · Error capture · Performance spans · Breadcrumbs
+
+
+
+---
+
+## Running Examples
+
+Each example follows the same pattern:
+
+```bash
+# Clone the cookbook
+git clone https://github.com/smallest-inc/cookbook
+cd cookbook/voice-agents/
+
+# Install dependencies
+pip install -e .
+
+# Set environment variables
+export OPENAI_API_KEY="your-key"
+
+# Run locally
+python app.py
+
+# Test with CLI (in another terminal)
+smallestai agent chat
+```
+
+## Deploying Examples
+
+```bash
+# Login to Smallest AI
+smallestai auth login
+
+# Link to your agent
+smallestai agent init
+
+# Deploy
+smallestai agent deploy --entry-point app.py
+
+# Make live
+smallestai agent builds
+```
+
diff --git a/fern/products/atoms/pages/dev/introduction/core-concepts/nodes.mdx b/fern/products/atoms/pages/dev/introduction/core-concepts/nodes.mdx
index 44bed77..20cf719 100644
--- a/fern/products/atoms/pages/dev/introduction/core-concepts/nodes.mdx
+++ b/fern/products/atoms/pages/dev/introduction/core-concepts/nodes.mdx
@@ -15,7 +15,7 @@ In the conceptual graph, a Node is a vertex that performs three key actions:
## Abstracted Nodes
-To help you get started quickly, we have abstracted two common node patterns for you. You can use these out of the box or build your own custom nodes from scratch.
+To help you get started quickly, we have abstracted three common node patterns for you. You can use these out of the box or build your own custom nodes from scratch.
### 1. The Base Node (`Node`)
@@ -77,6 +77,36 @@ class MyAgent(OutputAgentNode):
yield chunk.content
```
+### 3. The Background Agent (`BackgroundAgentNode`)
+
+A silent observer node that processes events without producing audio output.
+
+**Key Features:**
+* **Silent Processing**: Receives all events but doesn't speak.
+* **Parallel Execution**: Runs alongside your main agent.
+* **State Sharing**: Main agent can query its state.
+
+**Use Case**: Sentiment analysis, call quality monitoring, analytics, webhooks.
+
+```python
+from smallestai.atoms.agent.nodes import BackgroundAgentNode
+from smallestai.atoms.agent.events import SDKEvent, SDKAgentTranscriptUpdateEvent
+
+class SentimentAnalyzer(BackgroundAgentNode):
+ def __init__(self):
+ super().__init__(name="sentiment-analyzer")
+ self.current_sentiment = "neutral"
+
+ async def process_event(self, event: SDKEvent):
+ if isinstance(event, SDKAgentTranscriptUpdateEvent):
+ if event.role == "user":
+ self.current_sentiment = await self._analyze(event.content)
+```
+
+
+ See [Background Agent](/atoms/developer-guide/build/agents/overview) for a complete guide.
+
+
---
## How to Write a Custom Node
diff --git a/fern/products/atoms/pages/dev/introduction/core-concepts/overview.mdx b/fern/products/atoms/pages/dev/introduction/core-concepts/overview.mdx
index afd27d5..6dbc3cb 100644
--- a/fern/products/atoms/pages/dev/introduction/core-concepts/overview.mdx
+++ b/fern/products/atoms/pages/dev/introduction/core-concepts/overview.mdx
@@ -19,16 +19,16 @@ The system manages all the complexity of real-time streaming, interruptions, and
## The Four Building Blocks
-
+
Processing units that handle events. The brain of your agent logic.
-
+
Messages flowing through the system. Audio, text, and control signals.
-
+
Connect nodes into pipelines. Build complex multi-agent flows.
-
+
Manage conversation state and lifecycle. One session per call.
diff --git a/fern/products/atoms/pages/dev/introduction/mcp/manual-setup.mdx b/fern/products/atoms/pages/dev/introduction/mcp/manual-setup.mdx
new file mode 100644
index 0000000..616f091
--- /dev/null
+++ b/fern/products/atoms/pages/dev/introduction/mcp/manual-setup.mdx
@@ -0,0 +1,155 @@
+---
+title: Manual Setup
+subtitle: Step-by-step config for Cursor and Claude Desktop.
+---
+
+
+ Need an API key first? Follow the steps below to create one from the Atoms platform.
+
+
+## Get Your API Key
+
+
+
+ Click your profile in the top-left of [app.smallest.ai](https://app.smallest.ai?utm_source=documentation&utm_medium=docs) and select **Settings**.
+
+
+
+
+
+
+
+ Click **API Keys** in the left sidebar, then click **Create API Key** in the top-right.
+
+
+
+
+
+
+
+ Give your key a descriptive name (e.g., `atoms-mcp-server`) and click **Create API Key**. Copy and save it — you won't see it again.
+
+
+
+
+
+
+
+---
+
+## Install
+
+
+
+ Zero dependencies — no Node.js, no npm.
+
+
+
+ ```bash
+ curl -fsSL https://raw.githubusercontent.com/smallest-inc/mcp-server/main/install.sh | bash
+ ```
+
+
+ ```powershell
+ irm https://raw.githubusercontent.com/smallest-inc/mcp-server/main/install.ps1 | iex
+ ```
+
+
+
+ It prompts for your API key and writes the config for both Cursor and Claude Desktop automatically.
+
+ Skip to [Restart your editor](#restart-your-editor) below.
+
+
+
+ Requires **Node.js 18+** installed on your machine.
+
+
+ Open the MCP config file for your editor:
+
+
+
+ | OS | Path |
+ |---|---|
+ | **Mac / Linux** | `~/.cursor/mcp.json` |
+ | **Windows** | `%USERPROFILE%\.cursor\mcp.json` |
+
+ If the file doesn't exist, create it.
+
+
+ Open **Claude Desktop** → **Settings** (gear icon) → **Developer** → **Edit Config**
+
+ Or open the file manually:
+
+ | OS | Path |
+ |---|---|
+ | **Mac** | `~/Library/Application Support/Claude/claude_desktop_config.json` |
+ | **Windows** | `%APPDATA%\Claude\claude_desktop_config.json` |
+
+
+
+ Paste this config. If you already have other MCP servers, just add the `"atoms"` entry inside `"mcpServers"`.
+
+ ```json
+ {
+ "mcpServers": {
+ "atoms": {
+ "command": "npx",
+ "args": ["-y", "@developer-smallestai/atoms-mcp-server"],
+ "env": {
+ "ATOMS_API_KEY": "sk_your_api_key_here"
+ }
+ }
+ }
+ }
+ ```
+
+ **Replace** `sk_your_api_key_here` with your actual API key.
+
+
+ Don't share your API key or commit it to git.
+
+
+
+
+---
+
+## Restart your editor
+
+
+
+ `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows) → **Developer: Reload Window**
+
+
+ Fully quit and reopen the app.
+
+
+
+---
+
+## Verify
+
+
+
+ Go to **Cursor Settings** → **MCP**. You should see `atoms` listed with a **green dot**.
+
+ Open a new chat (**make sure you're in Agent mode**, not Ask mode) and type:
+
+ ```
+ List all my agents
+ ```
+
+
+ Start a new conversation and type:
+
+ ```
+ List all my agents
+ ```
+
+
+
+You should see your Atoms agents listed back. If you do — you're done!
+
+## Next steps
+
+Head to the **[Prompt Cookbook](/atoms/mcp/using-the-mcp/prompt-cookbook)** — it has copy-paste prompts for everything you can do.
\ No newline at end of file
diff --git a/fern/products/atoms/pages/dev/introduction/mcp/overview.mdx b/fern/products/atoms/pages/dev/introduction/mcp/overview.mdx
new file mode 100644
index 0000000..6cd73c9
--- /dev/null
+++ b/fern/products/atoms/pages/dev/introduction/mcp/overview.mdx
@@ -0,0 +1,135 @@
+---
+title: Quick Start
+subtitle: Talk to your Atoms voice agents, debug calls, and view analytics — all without leaving your editor.
+---
+
+The Atoms MCP Server connects your AI editor to the Atoms platform. No console tab-switching — just type what you want in natural language.
+
+---
+
+## Setup
+
+
+
+ Open [app.smallest.ai](https://app.smallest.ai?utm_source=documentation&utm_medium=docs), click your profile in the top-left, and go to **Settings**.
+
+
+
+
+
+ Click **API Keys** in the sidebar, then **Create API Key**.
+
+
+
+
+
+ Name your key and click **Create API Key**. Copy it — it starts with `sk_`.
+
+
+
+
+
+
+
+ Open a chat in **Cursor** or **Claude Desktop** and paste one of these:
+
+
+
+ Zero dependencies — no Node.js needed.
+
+
+
+ ```
+ Set up the Atoms MCP server for me using the curl installer.
+ Run: curl -fsSL https://raw.githubusercontent.com/smallest-inc/mcp-server/main/install.sh | bash
+ My API key is: sk_paste_your_key_here
+ ```
+
+
+ ```
+ Set up the Atoms MCP server for me using the PowerShell installer.
+ Run: irm https://raw.githubusercontent.com/smallest-inc/mcp-server/main/install.ps1 | iex
+ My API key is: sk_paste_your_key_here
+ ```
+
+
+
+
+ Requires **Node.js 18+**.
+
+ ```
+ Set up the Atoms MCP server for me.
+ The npm package is @developer-smallestai/atoms-mcp-server.
+ My API key is: sk_paste_your_key_here
+ ```
+
+
+
+ Your assistant configures everything for you.
+
+
+
+
+
+ `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows) → **Developer: Reload Window**
+
+
+ Fully quit and reopen the app.
+
+
+
+
+
+ Type this in chat:
+
+ ```
+ List all my agents
+ ```
+
+ You should see your agents listed back. You're set up.
+
+
+
+Prefer to set things up yourself? See the **[Manual Setup](manual-setup)** guide.
+
+---
+
+## What can you do?
+
+Just type in your editor's chat — the AI picks the right tool:
+
+
+
+ ```
+ Show me all failed calls from this week
+ ```
+ ```
+ What's our total call spend this month?
+ ```
+ ```
+ List all my agents
+ ```
+
+
+ ```
+ Debug call CALL-1234567890-abc123
+ ```
+ Returns the full transcript, errors, timing, costs, and post-call analytics.
+
+
+ ```
+ Create a new agent called "Support Bot"
+ ```
+ ```
+ Update its prompt to: "You are a helpful support agent..."
+ ```
+
+
+ ```
+ Call +14155551234 using the "Sales" agent
+ ```
+ Triggers a real outbound call — the agent follows its configured prompt.
+
+
+
+See the full list in the **[Prompt Cookbook](/atoms/mcp/using-the-mcp/prompt-cookbook)**.
\ No newline at end of file
diff --git a/fern/products/atoms/pages/dev/introduction/mcp/prompt-cookbook.mdx b/fern/products/atoms/pages/dev/introduction/mcp/prompt-cookbook.mdx
new file mode 100644
index 0000000..61173ad
--- /dev/null
+++ b/fern/products/atoms/pages/dev/introduction/mcp/prompt-cookbook.mdx
@@ -0,0 +1,180 @@
+---
+title: Prompt Cookbook
+subtitle: Copy-paste prompts for everything the MCP can do. Just type them in your editor's chat.
+---
+
+No commands to memorize. Just ask in plain English — the AI picks the right tool.
+
+---
+
+## Agents
+
+
+
+ ```
+ List all my agents
+ ```
+ ```
+ Show me agents with "support" in the name
+ ```
+
+
+
+ ```
+ Create a new agent called "Customer Support"
+ ```
+ ```
+ Create an agent called "Survey Bot" with Hindi as the default language
+ ```
+
+
+
+ ```
+ Update the prompt for agent "Support Bot" to:
+ "You are a helpful customer support agent for Acme Corp.
+ Be polite, concise, and always confirm before taking action."
+ ```
+
+
+
+ ```
+ Change the first message of "Support Bot" to "Hi, thanks for calling Acme support! How can I help?"
+ ```
+ ```
+ Update "Support Bot" to support English and Hindi
+ ```
+
+
+
+ ```
+ Archive the agent called "Old Test Bot"
+ ```
+
+
+
+---
+
+## Call logs
+
+
+
+ ```
+ Show me all calls from the last 24 hours
+ ```
+ ```
+ Show me calls from this week
+ ```
+
+
+
+ ```
+ Show me failed calls from this week
+ ```
+ ```
+ Get all completed calls for agent "Support Bot"
+ ```
+
+
+
+ ```
+ Find all calls to +14155551234
+ ```
+
+
+
+ ```
+ Show me all inbound calls this month
+ ```
+ ```
+ List outbound calls from the last 7 days
+ ```
+
+
+
+---
+
+## Debugging
+
+
+ Call IDs look like `CALL-1234567890-abc123`. You can find them in call log responses or in the Atoms Console.
+
+
+```
+Debug call CALL-1234567890-abc123
+```
+
+This returns everything about a single call:
+
+- **Full transcript** — complete conversation between agent and caller
+- **Errors** — any errors that occurred during the call
+- **Cost breakdown** — LLM, TTS, STT, telephony, and platform costs
+- **Post-call analytics** — disposition metrics extracted from the conversation
+
+---
+
+## Usage & costs
+
+```
+What's our total call spend this week?
+```
+```
+Show usage stats for the "Sales Outreach" agent this month
+```
+```
+How many calls did we make in January?
+```
+
+---
+
+## Making calls
+
+
+ These trigger **real phone calls**. The agent will call the number and follow its configured prompt.
+
+
+```
+Call +14155551234 using the "Sales Outreach" agent
+```
+```
+Call +916366821717 using agent "Support Bot"
+```
+
+---
+
+## Campaigns & phone numbers
+
+
+
+ ```
+ Show me all running campaigns
+ ```
+ ```
+ List completed campaigns for the "Survey" agent
+ ```
+
+
+ ```
+ List all phone numbers in my organization
+ ```
+
+
+
+---
+
+## Chaining actions
+
+You can combine multiple steps in a single prompt — the AI executes them in sequence:
+
+```
+Create a new agent called "Demo Bot",
+set its prompt to "You are a friendly demo agent that introduces
+our product in under 30 seconds",
+then call +14155551234 with it
+```
+
+This will:
+1. Create the agent
+2. Update its prompt
+3. Make the call
+
+All in one go.
diff --git a/fern/products/atoms/pages/dev/introduction/mcp/tools.mdx b/fern/products/atoms/pages/dev/introduction/mcp/tools.mdx
new file mode 100644
index 0000000..a00483d
--- /dev/null
+++ b/fern/products/atoms/pages/dev/introduction/mcp/tools.mdx
@@ -0,0 +1,44 @@
+---
+title: Available Tools
+subtitle: Everything the MCP server can do, under the hood.
+---
+
+You never call these directly — just describe what you want and the AI picks the right tool. This page is a reference.
+
+---
+
+## Read
+
+| Tool | What it does |
+|---|---|
+| `get_call_logs` | Query call logs with filters for status, type, date range, agent name, or phone number |
+| `debug_call` | Deep-dive into a single call — full transcript, errors, timing, cost breakdown, post-call analytics |
+| `get_agents` | List agents with their configuration, voice, LLM model, and call stats |
+| `get_usage_stats` | Usage statistics — total calls, duration, costs, status breakdown |
+| `get_campaigns` | List outbound calling campaigns with status and progress |
+| `get_phone_numbers` | List phone numbers owned by your organization |
+
+## Write
+
+| Tool | What it does |
+|---|---|
+| `create_agent` | Create a new AI voice agent |
+| `update_agent_prompt` | Update an agent's system prompt / instructions |
+| `update_agent_config` | Update agent settings — name, language, voice, first message, etc. |
+| `delete_agent` | Archive (soft-delete) an agent |
+
+## Act
+
+| Tool | What it does |
+|---|---|
+| `make_call` | Initiate an outbound phone call using a specific agent — triggers a real call |
+
+---
+
+## Resources
+
+The MCP server also exposes a **Platform Overview** resource that gives the AI context about Atoms terminology, call types, statuses, and cost breakdowns. This helps the AI give more accurate answers without you having to explain the domain.
+
+| Resource | URI |
+|---|---|
+| Platform Overview | `atoms://docs/platform-overview` |
diff --git a/fern/products/atoms/pages/dev/introduction/mcp/troubleshooting.mdx b/fern/products/atoms/pages/dev/introduction/mcp/troubleshooting.mdx
new file mode 100644
index 0000000..685eec7
--- /dev/null
+++ b/fern/products/atoms/pages/dev/introduction/mcp/troubleshooting.mdx
@@ -0,0 +1,113 @@
+---
+title: Troubleshooting
+subtitle: Common issues and how to fix them.
+---
+
+## Server not showing up
+
+
+
+ After editing `~/.cursor/mcp.json`, you need to reload:
+
+ `Cmd+Shift+P` → **Developer: Reload Window**
+
+ For Claude Desktop, fully **quit and reopen** the app.
+
+
+
+ A missing comma or bracket will silently break the config. Paste your `mcp.json` into [jsonlint.com](https://jsonlint.com) to validate.
+
+ Common mistakes:
+ - Trailing comma after the last entry
+ - Missing closing brace `}`
+ - Using single quotes instead of double quotes
+
+
+
+ If you used the one-line installer, verify the binary is in place:
+
+ ```bash
+ ls ~/.atoms/atoms-mcp
+ ```
+
+ If not, re-run the installer:
+
+ ```bash
+ curl -fsSL https://raw.githubusercontent.com/smallest-inc/mcp-server/main/install.sh | bash
+ ```
+
+
+
+ The npm method requires **Node.js 18+**. Check with:
+
+ ```bash
+ node --version
+ ```
+
+ If not installed, download from [nodejs.org](https://nodejs.org), or use the one-line installer instead (no Node.js needed).
+
+
+
+---
+
+## API key errors
+
+
+
+ Your `ATOMS_API_KEY` is either incorrect or has been revoked.
+
+
+ ### Go to the Atoms Console
+
+ Open **[console.smallest.ai](https://console.smallest.ai?utm_source=documentation&utm_medium=docs)** → **API Keys**
+
+ ### Create a new key
+
+ Click **Create API Key** and copy it.
+
+ ### Update your config
+
+ Replace the old key in `~/.cursor/mcp.json` or `claude_desktop_config.json`.
+
+ ### Reload
+
+ Reload Cursor (`Cmd+Shift+P` → Reload Window) or restart Claude Desktop.
+
+
+
+
+ Your API key is valid but isn't linked to an organization. This usually means the account was just created. Ask your team admin to add you to the org.
+
+
+
+---
+
+## Tools not being called
+
+
+ In Cursor, make sure you're in **Agent mode** (not Ask mode). Ask mode is read-only and won't trigger tools.
+
+
+If the AI still doesn't pick up the tools, be more explicit:
+
+```
+Use the atoms MCP to list my agents
+```
+
+---
+
+## Calls not going through
+
+When using `make_call`, check these:
+
+| Requirement | Example |
+|---|---|
+| Phone number in **E.164 format** | `+14155551234` (with `+` and country code) |
+| Agent exists and is **not archived** | Check with `List all my agents` |
+| Org has a **phone number assigned** | Check with `List all phone numbers` |
+
+---
+
+## Still stuck?
+
+Reach out to the Atoms team on your internal Slack channel or email **support@smallest.ai**.
diff --git a/fern/products/atoms/pages/dev/introduction/overview.mdx b/fern/products/atoms/pages/dev/introduction/overview.mdx
index 359a272..cb38096 100644
--- a/fern/products/atoms/pages/dev/introduction/overview.mdx
+++ b/fern/products/atoms/pages/dev/introduction/overview.mdx
@@ -3,20 +3,20 @@ title: "What is Atoms SDK?"
description: "Build real-time voice AI agents in Python."
---
-The Atoms SDK is the Python framework for building voice agents on the [Smallest AI platform](https://smallest.ai). It handles streaming audio, conversation state, and tool coordination so you can focus on your agent's logic.
+The Atoms SDK is the Python framework for building voice agents on the Smallest AI platform. It handles streaming audio, conversation state, and tool coordination so you can focus on your agent's logic.
---
## Get Started
-
+
Build your first agent in minutes.
-
+
Nodes, Sessions, Events.
-
+
Full code samples.
@@ -26,16 +26,16 @@ The Atoms SDK is the Python framework for building voice agents on the [Smallest
## Build
-
+
Voice agent architecture.
-
+
Outbound calls.
-
+
End calls, transfers.
-
+
Call metrics.
diff --git a/fern/products/atoms/pages/dev/introduction/python-sdk.mdx b/fern/products/atoms/pages/dev/introduction/python-sdk.mdx
index 6f16d24..16eb631 100644
--- a/fern/products/atoms/pages/dev/introduction/python-sdk.mdx
+++ b/fern/products/atoms/pages/dev/introduction/python-sdk.mdx
@@ -18,10 +18,10 @@ pip install smallestai
| Component | Description | Learn More |
|-----------|-------------|------------|
-| **Nodes** | Processing units that handle events | [Nodes →](/dev/introduction/core-concepts/nodes) |
-| **Events** | Messages flowing through the system | [Events →](/dev/introduction/core-concepts/events) |
-| **Graphs** | Connect nodes into pipelines | [Graphs →](/dev/introduction/core-concepts/graphs) |
-| **Sessions** | Manage conversation state and lifecycle | [Sessions →](/dev/introduction/core-concepts/sessions) |
+| **Nodes** | Processing units that handle events | [Nodes →](/atoms/developer-guide/introduction/sdk/nodes) |
+| **Events** | Messages flowing through the system | [Events →](/atoms/developer-guide/introduction/sdk/events) |
+| **Graphs** | Connect nodes into pipelines | [Graphs →](/atoms/developer-guide/introduction/sdk/graphs) |
+| **Sessions** | Manage conversation state and lifecycle | [Sessions →](/atoms/developer-guide/introduction/sdk/sessions) |
---
@@ -29,7 +29,7 @@ pip install smallestai
| Import | Purpose |
|--------|---------|
-| `smallestai.atoms.agent.nodes` | `Node`, `OutputAgentNode` base classes |
+| `smallestai.atoms.agent.nodes` | `Node`, `OutputAgentNode`, `BackgroundAgentNode` base classes |
| `smallestai.atoms.agent.events` | Event types (`SDKEvent`, etc.) |
| `smallestai.atoms.agent.tools` | `@function_tool` decorator, registry |
| `smallestai.atoms.agent.clients` | LLM clients (OpenAI-compatible) |
@@ -41,10 +41,10 @@ pip install smallestai
## Next Steps
-
+
Understand nodes, sessions, and events.
-
+
Development and deployment tools.
diff --git a/fern/products/atoms/pages/dev/introduction/quickstart.mdx b/fern/products/atoms/pages/dev/introduction/quickstart.mdx
index f03f8f6..2f92ae4 100644
--- a/fern/products/atoms/pages/dev/introduction/quickstart.mdx
+++ b/fern/products/atoms/pages/dev/introduction/quickstart.mdx
@@ -1,9 +1,10 @@
---
-title: "Getting Started"
-description: "From zero to a running AI agent."
+title: "Quick Start"
+sidebarTitle: "Quick Start"
+description: "Install the SDK, build an agent, and run it."
---
-This guide walks you through installing the SDK, writing your first intelligent agent, and running it.
+Install the SDK, write your first agent, and test it — locally or deployed to the cloud.
## Prerequisites
@@ -42,7 +43,11 @@ Create two files: one for the agent logic, and one to run the application.
)
async def generate_response(self):
- async for chunk in await self.llm.chat(self.context.messages, stream=True):
+ response = await self.llm.chat(
+ messages=self.context.messages,
+ stream=True
+ )
+ async for chunk in response:
if chunk.content:
yield chunk.content
```
@@ -69,6 +74,18 @@ Create two files: one for the agent logic, and one to run the application.
Your entry point can be named anything (`app.py`, `run.py`, etc.). When deploying, specify it with `--entry-point your_file.py`.
+
+
+ **Want a greeting?** Use `@session.on_event` to speak when the user joins:
+ ```python
+ @session.on_event("on_event_received")
+ async def on_event(_, event):
+ if isinstance(event, SDKSystemUserJoinedEvent):
+ agent.context.add_message({"role": "assistant", "content": "Hello!"})
+ await agent.speak("Hello! How can I help?")
+ ```
+ Adding the greeting to context ensures the LLM knows the conversation has started.
+
@@ -97,7 +114,7 @@ Once your files are ready, you have two options:
To have Smallest AI host your agent in the cloud (for production, API access, or phone calls):
- **Prerequisite:** You must first create an agent on the [Atoms platform](https://atoms.smallest.ai). The `agent init` command links your local code to that agent.
+ **Prerequisite:** You must first create an agent on the [Atoms platform](https://app.smallest.ai?utm_source=documentation&utm_medium=docs). The `agent init` command links your local code to that agent.
@@ -128,10 +145,16 @@ Once your files are ready, you have two options:
## What's Next?
-
+
Give your agent calculators, search, and APIs.
-
+
Connect multiple agents for complex workflows.
+
+### Need Help?
+
+
+ Ask questions, share what you're building, and get help from other developers.
+
\ No newline at end of file
diff --git a/fern/products/atoms/pages/docs.json b/fern/products/atoms/pages/docs.json
index 13aa960..9077154 100644
--- a/fern/products/atoms/pages/docs.json
+++ b/fern/products/atoms/pages/docs.json
@@ -8,109 +8,166 @@
"dark": "#004D4D"
},
"favicon": "logo/favi.svg",
+ "modeToggle": {
+ "default": "light"
+ },
"navigation": {
"tabs": [
{
- "tab": "Documentation",
+ "tab": "Introduction",
"groups": [
{
- "group": "Get Started",
+ "group": "Capabilities",
"pages": [
- "introduction",
- "quickstart"
+ "intro/welcome",
+ "intro/capabilities/agents-explained",
+ "intro/capabilities/knowledge-base",
+ "intro/capabilities/voice-speech",
+ "intro/capabilities/campaigns",
+ "intro/capabilities/telephony",
+ "intro/capabilities/integrations"
]
},
{
- "group": "Deep Dive",
+ "group": "Reference",
+ "pages": ["intro/reference/changelog", "intro/reference/support"]
+ }
+ ]
+ },
+ {
+ "tab": "Atoms Platform",
+ "groups": [
+ {
+ "group": "Introduction",
"pages": [
+ "platform/introduction/intro",
+ "platform/introduction/quick-start",
+ "platform/introduction/quick-ref"
+ ]
+ },
+ {
+ "group": "Single Prompt Agents",
+ "pages": [
+ "platform/single-prompt/overview",
{
- "group": "Workflow",
+ "group": "Creating Your Agent",
"pages": [
- "deep-dive/workflow/what-is-a-workflow",
- "deep-dive/workflow/what-is-a-node",
- "deep-dive/workflow/what-is-a-branch",
- "deep-dive/workflow/what-are-variables",
- {
- "group": "Types of Nodes",
- "pages": [
- "deep-dive/workflow/types-of-nodes/default",
- "deep-dive/workflow/types-of-nodes/api-call",
- "deep-dive/workflow/types-of-nodes/transfer-call",
- "deep-dive/workflow/types-of-nodes/end-call",
- "deep-dive/workflow/types-of-nodes/pre-call-api",
- "deep-dive/workflow/types-of-nodes/post-call-api"
- ]
- },
- "deep-dive/workflow/best-practices-for-prompting",
- "deep-dive/workflow/workflow-vs-single-prompt"
+ "platform/single-prompt/manual-setup",
+ "platform/single-prompt/from-template",
+ "platform/single-prompt/ai-assisted"
]
},
{
- "group": "Single Prompt",
+ "group": "Prompt Section",
"pages": [
- "deep-dive/single-prompt/overview",
- "deep-dive/single-prompt/tool-calls",
- "deep-dive/single-prompt/prompting-best-practices"
+ "platform/single-prompt/writing-prompts",
+ "platform/single-prompt/config/model-selection",
+ "platform/single-prompt/config/voice-selection",
+ "platform/single-prompt/config/language-selection"
]
},
{
- "group": "Voice Config",
+ "group": "Configuration Panel",
"pages": [
- "deep-dive/voice-config/types-of-voice-models",
- "deep-dive/voice-config/understanding-voice-parameters",
- "deep-dive/voice-config/pronunciation-dictionaries",
- "deep-dive/voicemail-detection/voicemail-detection"
+ "platform/single-prompt/config/end-call",
+ "platform/single-prompt/config/transfer-call",
+ "platform/single-prompt/config/knowledge-base",
+ "platform/single-prompt/config/variables",
+ "platform/single-prompt/config/api-calls"
]
},
{
- "group": "LLM Config",
+ "group": "Agent Settings",
"pages": [
- "deep-dive/llm-config/llm-config"
+ "platform/single-prompt/config/voice-settings",
+ "platform/single-prompt/config/model-settings",
+ "platform/single-prompt/config/phone-number",
+ "platform/single-prompt/config/webhooks",
+ "platform/single-prompt/config/general-settings"
]
- },
+ }
+ ]
+ },
+ {
+ "group": "Conversational Flow Agents",
+ "pages": [
+ "platform/convo-flow/overview",
{
- "group": "Call Logs",
+ "group": "Creating Your Agent",
"pages": [
- "deep-dive/call-logs/what-is-a-call-log"
+ "platform/convo-flow/manual-setup",
+ "platform/convo-flow/from-template"
]
},
{
- "group": "Phone Number",
+ "group": "Workflow Tab",
"pages": [
- "deep-dive/phone-number/phone-number",
- "deep-dive/phone-number/sip-trunking",
- {
- "group": "Provider Setup Guides",
- "pages": [
- "deep-dive/phone-number/twilio-sip-setup",
- "deep-dive/phone-number/telnyx-sip-setup",
- "deep-dive/phone-number/vonage-sip-setup"
- ]
- }
+ "platform/convo-flow/workflow-builder",
+ "platform/convo-flow/node-types",
+ "platform/convo-flow/conditions",
+ "platform/convo-flow/config/variables"
]
},
- "deep-dive/audience/audience",
- "deep-dive/campaign/campaign",
- "deep-dive/webhooks/webhooks",
- "deep-dive/widget/widget",
- "deep-dive/realtime-events/events"
+ {
+ "group": "Agent Settings",
+ "pages": [
+ "platform/convo-flow/config/languages",
+ "platform/convo-flow/config/voice-settings",
+ "platform/convo-flow/config/model-settings",
+ "platform/convo-flow/config/phone-number",
+ "platform/convo-flow/config/webhooks",
+ "platform/convo-flow/config/general-settings"
+ ]
+ }
]
- }
- ]
- },
- {
- "tab": "Usecases",
- "groups": [
+ },
+ {
+ "group": "Features",
+ "pages": [
+ "platform/features/knowledge-base",
+ "platform/features/webhooks",
+ "platform/features/widget",
+ "platform/features/integrations",
+ "platform/features/post-call-metrics",
+ "platform/features/variables-reference",
+ "platform/features/api-calls-reference"
+ ]
+ },
+ {
+ "group": "Deployment",
+ "pages": [
+ "platform/deployment/phone-numbers",
+ "platform/deployment/audiences",
+ "platform/deployment/campaigns"
+ ]
+ },
{
- "group": "Top Industries",
+ "group": "Analytics & Logs",
"pages": [
- "usecases/banking",
- "usecases/e-commerce",
- "usecases/logistics",
- "usecases/healthcare",
- "usecases/recruitment",
- "usecases/small-business",
- "usecases/startups"
+ "platform/analytics/overview",
+ "platform/analytics/testing",
+ "platform/analytics/conversation-logs",
+ "platform/analytics/locking"
+ ]
+ },
+ {
+ "group": "Cookbooks",
+ "pages": ["platform/cookbooks/using-cookbooks"]
+ },
+ {
+ "group": "Troubleshooting",
+ "pages": [
+ {
+ "group": "Common Issues",
+ "pages": [
+ "platform/troubleshooting/common-issues/agent-issues",
+ "platform/troubleshooting/common-issues/call-quality",
+ "platform/troubleshooting/common-issues/configuration"
+ ]
+ },
+ "platform/troubleshooting/faq",
+ "platform/troubleshooting/glossary",
+ "platform/troubleshooting/getting-help"
]
}
]
@@ -180,6 +237,13 @@
}
]
},
+ {
+ "group": "Knowledge Base",
+ "pages": [
+ "dev/build/knowledge-base/overview",
+ "dev/build/knowledge-base/usage"
+ ]
+ },
{
"group": "Calling",
"pages": [
@@ -188,71 +252,36 @@
"dev/build/phone-calling/call-control"
]
},
+ {
+ "group": "Campaigns",
+ "pages": [
+ "dev/build/campaigns/overview",
+ "dev/build/campaigns/managing-audiences",
+ "dev/build/campaigns/creating-campaigns"
+ ]
+ },
{
"group": "Analytics",
"pages": [
"dev/build/analytics/overview",
"dev/build/analytics/call-metrics",
- "dev/build/analytics/agent-performance"
+ "dev/build/analytics/post-call-analytics"
]
}
]
},
{
"group": "Examples",
- "pages": [
- "dev/cookbooks/examples"
- ]
+ "pages": ["dev/cookbooks/examples"]
}
]
},
{
- "tab": "API Reference V1",
+ "tab": "API Reference",
"href": "docs/api-reference/",
"openapi": "/api-reference/openapi.yaml"
- },
- {
- "tab": "Client Libraries",
- "groups": [
- {
- "group": "Client Libraries",
- "pages": [
- "client-libraries/overview"
- ]
- }
- ]
- },
- {
- "tab": "FAQs",
- "groups": [
- {
- "group": "Frequently Asked Questions",
- "pages": [
- "faqs/frequently-asked-questions"
- ]
- }
- ]
}
- ],
- "global": {
- "anchors": [
- {
- "anchor": "Documentation",
- "href": "https://atoms-docs.smallest.ai/",
- "icon": "book-open-cover"
- },
- {
- "anchor": "Community",
- "href": "https://smallest.ai/discord",
- "icon": "discord"
- },
- {
- "anchor": "Blog",
- "href": "https://smallest.ai/blog",
- "icon": "newspaper"
- }
- ]
- }
+ ]
},
"logo": {
"light": "/logo/dark.png",
@@ -279,4 +308,4 @@
"youtube": "https://www.youtube.com/@smallest_ai"
}
}
-}
\ No newline at end of file
+}
diff --git a/fern/products/atoms/pages/faqs/frequently-asked-questions.mdx b/fern/products/atoms/pages/faqs/frequently-asked-questions.mdx
index 2f26d0f..42849c2 100644
--- a/fern/products/atoms/pages/faqs/frequently-asked-questions.mdx
+++ b/fern/products/atoms/pages/faqs/frequently-asked-questions.mdx
@@ -5,24 +5,27 @@ icon: circle-question
---
### 1. How many languages do you support?
-We primarily support English, Hindi for enterprises with extremely robust controls on quality.
+
+We primarily support English, Hindi for enterprises with extremely robust controls on quality.
Apart from that, we also have support for 30+ languages
such as French, Spanish, German, Italian in Europe; Marathi, Tamil, Telegu, Kannada, Gujarati, Malayalam in India;
Arabic for the middle-east and Chinese, Japanese, Korean in Asia. However, the accuracy for these languages is limited at the moment.
### 2. Can we integrate our systems with Atoms?
-Yes, atoms has a very robust API that can be integrated into any software. You can get the full list of APIs [here](/api-reference).
+
+Yes, atoms has a very robust API that can be integrated into any software. You can get the full list of APIs [here](/atoms/api-reference).
### 3. What integrations are supported for Atoms?
+
Almost every single software can be integrated in an Atom - before, during and after a call is complete.
-We suggest using tools like [Zapier](https://zapier.com/), [Make.com](https://www.make.com/), [N8N](https://n8n.io/) etc. that provide easy integrations support to
+We suggest using tools like [Zapier](https://zapier.com/), [Make.com](https://www.make.com/), [N8N](https://n8n.io/) etc. that provide easy integrations support to
1000s of third party softwares.
-To get the full list of integrations, please check [here](/developer-guide/integrations).
+To get the full list of integrations, please check the [API Reference](/atoms/api-reference).
-Apart from the ones mentioned above, you can also use the [API](/api-reference) to integrate Atoms into any software.
+Apart from the ones mentioned above, you can also use the [API](/atoms/api-reference) to integrate Atoms into any software.
### 3. Do you provide developer support for integration?
@@ -34,21 +37,21 @@ In case your account size is smaller, feel free to reach out to our development
You can expect a sub 1 second latency unless you are doing actions in your system that are taking longer to return.
-For example, if you are doing a long running data base call, then the latency might increase. However, there are tricks to
+For example, if you are doing a long running data base call, then the latency might increase. However, there are tricks to
overcome this by adding filler words in between as shown [here](deep-dive/filler-words)
### 5. Can I use Atoms over chat?
-Yes, you can use atoms over chat as well. Please refer to the [API documentation](/api-reference) to know more.
+Yes, you can use atoms over chat as well. Please refer to the [API documentation](/atoms/api-reference) to know more.
### 6. How much does it cost?
The cost depends on the volume of usage. It starts at 0.08 USD/min and goes 2-3x lower as you scale in volumes.
-You can get the detailed pricing [here](https://smallest.ai/pricing) and it is also explained in depth [here](/pricing/introduction])
+You can get the detailed pricing [here](https://smallest.ai/pricing) and it is also explained in depth [here](/atoms/product-overview/capabilities/welcome)
### 7. Do you provide on-premise deployments?
Yes we provide on-premise deployments both in private clouds and on physical hardware for annual account sizes larger than 100,000 USD.
-Please reach out to [support@smallest.ai](mailto:support@smallest.ai) if this fits your profile.
\ No newline at end of file
+Please reach out to [support@smallest.ai](mailto:support@smallest.ai) if this fits your profile.
diff --git a/fern/products/atoms/pages/images/api-keys-page.png b/fern/products/atoms/pages/images/api-keys-page.png
new file mode 100644
index 0000000..d7ffbcb
Binary files /dev/null and b/fern/products/atoms/pages/images/api-keys-page.png differ
diff --git a/fern/products/atoms/pages/images/app.smallest.ai_sign_up_atoms-platform.png b/fern/products/atoms/pages/images/app.smallest.ai_sign_up_atoms-platform.png
new file mode 100644
index 0000000..897301e
Binary files /dev/null and b/fern/products/atoms/pages/images/app.smallest.ai_sign_up_atoms-platform.png differ
diff --git a/fern/products/atoms/pages/images/app.smallest.ai_welcome_screen_atoms-platform.png b/fern/products/atoms/pages/images/app.smallest.ai_welcome_screen_atoms-platform.png
new file mode 100644
index 0000000..33608e0
Binary files /dev/null and b/fern/products/atoms/pages/images/app.smallest.ai_welcome_screen_atoms-platform.png differ
diff --git a/fern/products/atoms/pages/images/create-api-key-dialog.png b/fern/products/atoms/pages/images/create-api-key-dialog.png
new file mode 100644
index 0000000..b5f77c8
Binary files /dev/null and b/fern/products/atoms/pages/images/create-api-key-dialog.png differ
diff --git a/fern/products/atoms/pages/images/platform-settings-menu.png b/fern/products/atoms/pages/images/platform-settings-menu.png
new file mode 100644
index 0000000..3ffcdc4
Binary files /dev/null and b/fern/products/atoms/pages/images/platform-settings-menu.png differ
diff --git a/fern/products/atoms/pages/images/test-agent-web-call.png b/fern/products/atoms/pages/images/test-agent-web-call.png
new file mode 100644
index 0000000..6e26d6d
Binary files /dev/null and b/fern/products/atoms/pages/images/test-agent-web-call.png differ
diff --git a/fern/products/atoms/pages/images/testing-voice-agent.png b/fern/products/atoms/pages/images/testing-voice-agent.png
new file mode 100644
index 0000000..560f3c8
Binary files /dev/null and b/fern/products/atoms/pages/images/testing-voice-agent.png differ
diff --git a/fern/products/atoms/pages/intro/admin/account-team.mdx b/fern/products/atoms/pages/intro/admin/account-team.mdx
new file mode 100644
index 0000000..4700e3b
--- /dev/null
+++ b/fern/products/atoms/pages/intro/admin/account-team.mdx
@@ -0,0 +1,51 @@
+---
+title: "Settings & Team"
+description: "Manage your profile, organization, and team members"
+---
+
+**Location:** [app.smallest.ai](https://app.smallest.ai/dashboard/settings?utm_source=documentation&utm_medium=docs) → Settings
+
+
+ 
+
+
+---
+
+## Profile
+
+The Settings page shows your account details:
+
+| Field | Description |
+|-------|-------------|
+| **User Name** | Your display name |
+| **Organization ID** | Unique identifier for your organization (click to copy) |
+
+---
+
+## Organization Members
+
+Manage who has access to your organization. You can invite new members and see the status of existing ones.
+
+### Inviting a Member
+
+1. Go to [app.smallest.ai](https://app.smallest.ai/dashboard/settings?utm_source=documentation&utm_medium=docs) → **Settings**
+2. Click **+ Invite Member**
+3. Enter the team member's email address
+4. The invitee will receive an email to join your organization
+
+### Member Details
+
+The members table shows:
+
+| Column | Description |
+|--------|-------------|
+| **Email** | The member's email address |
+| **Status** | Active or **Pending** (invitation sent but not yet accepted) |
+| **Role** | **Admin** or **Member** |
+
+### Roles
+
+| Role | Access |
+|------|--------|
+| **Admin** | Full access — manage agents, campaigns, settings, billing, and team members |
+| **Member** | Standard access — work with agents and campaigns, no team or billing management |
diff --git a/fern/products/atoms/pages/intro/admin/api-keys.mdx b/fern/products/atoms/pages/intro/admin/api-keys.mdx
new file mode 100644
index 0000000..ac26124
--- /dev/null
+++ b/fern/products/atoms/pages/intro/admin/api-keys.mdx
@@ -0,0 +1,86 @@
+---
+title: "API Keys"
+description: "Create and manage API keys for programmatic access"
+---
+
+**Location:** [app.smallest.ai](https://app.smallest.ai/dashboard/settings?utm_source=documentation&utm_medium=docs) → API Keys
+
+
+ 
+
+
+---
+
+## Creating an API Key
+
+1. Go to [app.smallest.ai](https://app.smallest.ai/dashboard/settings?utm_source=documentation&utm_medium=docs) → Settings → **API Keys**
+2. Click **Create API Key**
+3. Give it a name (e.g. `production`, `staging`, `dev-team`)
+4. **Copy immediately** — the key is only shown once
+
+
+ Your API key provides access to your account. Never share it publicly, commit it to version control, or expose it in client-side code.
+
+
+---
+
+## Managing Keys
+
+The API Keys page shows all your keys with their name and creation date.
+
+| Action | How |
+|--------|-----|
+| **Search** | Use the search bar to find a key by name |
+| **Copy** | Click the copy icon next to any key |
+| **Delete** | Click the delete icon to revoke a key |
+
+Create separate keys for different environments (production, staging, development) so you can rotate or revoke them independently.
+
+---
+
+## Using Your API Key
+
+### Environment Variable (Recommended)
+
+```bash
+export SMALLEST_API_KEY="your-api-key-here"
+```
+
+### In API Requests
+
+Include the key in the `Authorization` header as a Bearer token:
+
+```bash
+curl -X GET "https://api.smallest.ai/atoms/v1/agent" \
+ -H "Authorization: Bearer YOUR_API_KEY"
+```
+
+### In Code
+
+
+```python Python
+from smallestai.atoms import AtomsClient
+
+# Automatically reads SMALLEST_API_KEY from environment
+client = AtomsClient()
+
+# Or pass explicitly
+client = AtomsClient(api_key="your-api-key")
+```
+
+```javascript Node.js
+import { AtomsClient } from '@smallest/atoms';
+
+// Automatically reads SMALLEST_API_KEY from environment
+const client = new AtomsClient();
+```
+
+
+---
+
+## Best Practices
+
+- **Use environment variables** — never hardcode keys in source code
+- **One key per environment** — separate keys for dev, staging, production
+- **Rotate regularly** — rotate keys periodically and after any team changes
+- **Revoke unused keys** — delete keys that are no longer needed
diff --git a/fern/products/atoms/pages/intro/admin/billing.mdx b/fern/products/atoms/pages/intro/admin/billing.mdx
new file mode 100644
index 0000000..48d9f08
--- /dev/null
+++ b/fern/products/atoms/pages/intro/admin/billing.mdx
@@ -0,0 +1,110 @@
+---
+title: "Subscription & Plans"
+description: "Manage your subscription, compare plans, and track credits"
+---
+
+**Location:** [app.smallest.ai](https://app.smallest.ai/dashboard/settings?utm_source=documentation&utm_medium=docs) → Subscription
+
+
+ 
+
+
+---
+
+## Manage Subscription
+
+The Subscription page shows your current plan details at a glance:
+
+| Field | Description |
+|-------|-------------|
+| **Current Plan & Cost** | Your active plan and billing cycle |
+| **Billing Date** | Next billing date |
+| **Credits Remaining** | Remaining credits out of your plan's total |
+
+Click **Manage Subscription** to upgrade, downgrade, or update payment details.
+
+---
+
+## Plans
+
+Plans are available on **Monthly** or **Annual** billing. All plans include access to the no-code Agent Builder and Agentic Graph Builder.
+
+### Overview
+
+| | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| **Price** | Usage Based | $49/month | $1,999/month | Custom |
+| **Best For** | Pay only for what you use. No monthly commitment. | Individual developers or early-stage teams building with voice AI | Growing teams deploying voice AI across products or workflows | High-volume, regulated, or OEM deployments requiring full control |
+
+---
+
+### AI Agents
+
+| Feature | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| No. of AI Agents | 5 | 5 | 20 | Unlimited |
+| Agentic Graph Builder / No-code Agent Builder | ✅ | ✅ | ✅ | ✅ |
+| Prompt Engineering Support | — | — | 1 agent free setup | Custom |
+| Extra Custom Agent Setup | — | — | $2,000 per agent | Custom support |
+| Voice Cloned Calls | — | — | — | Custom |
+| Analytics (Coming soon) | — | — | — | Custom support |
+
+---
+
+### Calling & Campaigns
+
+| Feature | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| Cost/min (India) | ~$0.09 | ~$0.09 | ~$0.07 | Custom |
+| Cost/min (US) | ~$0.15 | ~$0.15 | ~$0.12 | Custom |
+| Campaigns | 60 | 60 | 1,000 | Custom |
+| Parallel Calls | 1 | 1 | 10 | Custom |
+| Add-On Phone Numbers | — | $10/number/month | $10/number/month | Custom |
+| Phone Number Rotation | — | — | — | Contact Sales |
+
+---
+
+### Our Models
+
+| Feature | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| Speech Model Access | All models | All models | All models | All models |
+| Lightning / 10K chars (USD) | ~$0.08 | ~$0.08 | ~$0.05 | Custom |
+| Lightning V2 / 10K chars (USD) | ~$0.20 | ~$0.20 | ~$0.10 | Custom |
+| No. of Voice Clones | 5 | 5 | 15 | Unlimited |
+| Professional Voice Clone Support | — | — | — | Unlimited |
+| Custom Model Support | — | — | — | ✅ |
+| Concurrency on WebSocket | 3 requests | 3 requests | 15 requests | Custom |
+| RPM for TTS APIs | 100 | 100 | 1,000 | Custom |
+
+---
+
+### Support & Security
+
+| Feature | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| API Access | Limited | Limited | Full access | Full access |
+| CRM Integrations | — | — | ✅ | ✅ |
+| On-premise Deployment | — | — | — | ✅ |
+| Compliance (HIPAA, SOC2, etc.) | — | — | — | ✅ |
+| SIP Server Access | — | — | — | ✅ |
+| KYC Requirement | — | — | — | ✅ |
+| SLAs & Support | Email support | Email support | Slack + Priority Support | Custom |
+
+---
+
+### Tools / Products
+
+| Feature | Pay As You Go | Personal | Business | Enterprise |
+|---|---|---|---|---|
+| TTS Studio | ✅ | ✅ | ✅ | ✅ |
+| AI Script Assistant | ✅ | ✅ | ✅ | ✅ |
+| No. of TTS Projects | 10 | 10 | 500 | Custom |
+
+---
+
+## Questions?
+
+
+ Custom pricing for enterprise or high-volume needs
+
diff --git a/fern/products/atoms/pages/intro/admin/data-privacy.mdx b/fern/products/atoms/pages/intro/admin/data-privacy.mdx
new file mode 100644
index 0000000..9e476a4
--- /dev/null
+++ b/fern/products/atoms/pages/intro/admin/data-privacy.mdx
@@ -0,0 +1,147 @@
+---
+title: "Data & Privacy"
+description: "How we handle your data and protect privacy"
+---
+
+# Data & Privacy
+
+Understand how Atoms handles data, what we collect, and how we protect privacy.
+
+---
+
+## Data We Collect
+
+| Data Type | Purpose | Retention |
+|-----------|---------|-----------|
+| **Account info** | User management | Account lifetime |
+| **Call metadata** | Analytics, billing | 90 days default |
+| **Call recordings** | Quality, compliance | Configurable |
+| **Transcripts** | Analytics, training | Configurable |
+| **Knowledge base** | Agent intelligence | Until deleted |
+
+---
+
+## Data Ownership
+
+**Your data belongs to you.**
+
+- You own all content you upload
+- You own all call recordings and transcripts
+- We don't use your data to train AI models (unless you opt in)
+- You can export or delete your data at any time
+
+---
+
+## Data Retention
+
+### Default Retention
+
+| Data | Default Retention |
+|------|-------------------|
+| Call metadata | 90 days |
+| Call recordings | 30 days |
+| Transcripts | 90 days |
+| Analytics | 1 year |
+
+### Custom Retention
+
+Enterprise customers can configure:
+- Extended retention (up to 7 years)
+- Reduced retention (for privacy compliance)
+- Automatic deletion rules
+
+---
+
+## Data Export
+
+Export your data at any time:
+
+1. Go to **Settings** → **Data Management**
+2. Click **Export Data**
+3. Select what to export (agents, calls, contacts)
+4. Download as JSON or CSV
+
+---
+
+## Data Deletion
+
+### Delete Specific Data
+- Delete individual call recordings
+- Remove contacts from campaigns
+- Clear knowledge base content
+
+### Delete Everything
+Request full account deletion:
+1. Contact support@smallest.ai
+2. We'll verify your identity
+3. All data deleted within 30 days
+
+---
+
+## GDPR Compliance
+
+For EU users and data subjects:
+
+| Right | How to Exercise |
+|-------|-----------------|
+| **Access** | Export your data via dashboard |
+| **Rectification** | Edit your data in dashboard |
+| **Erasure** | Delete data or request full deletion |
+| **Portability** | Export in standard formats |
+| **Objection** | Contact privacy@smallest.ai |
+
+**Data Processing Agreement (DPA)** available for Enterprise customers.
+
+---
+
+## HIPAA Compliance
+
+For healthcare data:
+
+- **BAA required** — Sign a Business Associate Agreement
+- **PHI handling** — Special protections for patient data
+- **Audit logging** — Enhanced logging for compliance
+
+
+ Contact us to sign a Business Associate Agreement
+
+
+---
+
+## PII Handling
+
+### Automatic Protection
+- Phone numbers masked in debug logs
+- PII detection in transcripts
+- Secure credential storage
+
+### Configurable
+- Enable/disable call recording
+- Redact sensitive info from transcripts
+- Set data retention policies
+
+---
+
+## Third-Party Processors
+
+We use trusted partners for infrastructure:
+
+| Partner | Purpose | Compliance |
+|---------|---------|------------|
+| **AWS** | Cloud infrastructure | SOC 2, ISO 27001 |
+| **Google Cloud** | AI/ML services | SOC 2, ISO 27001 |
+| **Stripe** | Payment processing | PCI DSS Level 1 |
+
+Full list of sub-processors available on request.
+
+---
+
+## Contact
+
+For privacy questions or data requests:
+- **Email:** privacy@smallest.ai
+- **Address:** [Company address]
+
+
+ Read our full Privacy Policy
+
diff --git a/fern/products/atoms/pages/intro/admin/security.mdx b/fern/products/atoms/pages/intro/admin/security.mdx
new file mode 100644
index 0000000..99862df
--- /dev/null
+++ b/fern/products/atoms/pages/intro/admin/security.mdx
@@ -0,0 +1,115 @@
+---
+title: "Security Overview"
+description: "How Atoms protects your data and calls"
+---
+
+# Security Overview
+
+Atoms is built with enterprise security in mind. Here's how we protect your data, calls, and infrastructure.
+
+---
+
+## Infrastructure Security
+
+| Layer | Protection |
+|-------|------------|
+| **Network** | All traffic encrypted via TLS 1.3 |
+| **Data at rest** | AES-256 encryption |
+| **Infrastructure** | SOC 2 Type II compliant cloud |
+| **Access** | Role-based access control (RBAC) |
+
+---
+
+## Data Protection
+
+### Encryption
+
+- **In transit** — TLS 1.3 for all API and voice traffic
+- **At rest** — AES-256 for stored data
+- **Call recordings** — Encrypted with customer-specific keys
+
+### Data Residency
+
+Choose where your data is stored:
+- 🇺🇸 United States
+- 🇪🇺 European Union
+- 🇦🇺 Australia
+- More regions available for Enterprise
+
+---
+
+## Access Control
+
+### Authentication
+- **API Keys** — Secure token-based access
+- **SSO/SAML** — Enterprise single sign-on
+- **MFA** — Multi-factor authentication supported
+
+### Authorization
+- **Role-based** — Owner, Admin, Editor, Viewer roles
+- **Workspace isolation** — Data separated between workspaces
+- **Audit logs** — Track all user actions
+
+---
+
+## Compliance
+
+| Standard | Status |
+|----------|--------|
+| **SOC 2 Type II** | ✅ Certified |
+| **GDPR** | ✅ Compliant |
+| **HIPAA** | ✅ Available (Enterprise) |
+| **PCI DSS** | ✅ Level 1 |
+| **ISO 27001** | 🔄 In progress |
+
+Request our SOC 2 report or sign a BAA by contacting security@smallest.ai
+
+---
+
+## Call Security
+
+### Voice Traffic
+- End-to-end encryption for voice data
+- No call content stored unless recording is enabled
+- Recordings encrypted and access-controlled
+
+### PII Handling
+- Phone numbers masked in logs by default
+- PII redaction available for transcripts
+- Configurable data retention policies
+
+---
+
+## Penetration Testing
+
+- Annual third-party penetration tests
+- Continuous vulnerability scanning
+- Bug bounty program (coming soon)
+
+---
+
+## Incident Response
+
+| SLA | Response Time |
+|-----|---------------|
+| Critical (P1) | < 1 hour |
+| High (P2) | < 4 hours |
+| Medium (P3) | < 24 hours |
+| Low (P4) | < 72 hours |
+
+Report security issues to: **security@smallest.ai**
+
+---
+
+## Enterprise Security Features
+
+Available on Enterprise plans:
+- Dedicated infrastructure
+- Custom data retention policies
+- Private cloud deployment
+- Advanced audit logging
+- Custom SSO/SCIM
+
+
+ Discuss enterprise security requirements
+
diff --git a/fern/products/atoms/pages/intro/capabilities/agents-explained.mdx b/fern/products/atoms/pages/intro/capabilities/agents-explained.mdx
new file mode 100644
index 0000000..5a2eba9
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/agents-explained.mdx
@@ -0,0 +1,76 @@
+---
+title: "Voice AI Agents"
+sidebarTitle: "Agents"
+icon: "robot"
+description: "AI-powered voice assistants that handle real conversations"
+---
+
+An agent is an AI that talks on the phone. It understands what callers say, reasons through the conversation, takes actions, and responds naturally — all in real-time.
+
+---
+
+## What Agents Can Do
+
+| Capability | Description |
+|------------|-------------|
+| **Answer questions** | Pull from knowledge bases, policies, and FAQs |
+| **Take actions** | Book appointments, update records, process payments |
+| **Route calls** | Transfer to humans, escalate issues, route to departments |
+| **Collect data** | Qualify leads, gather feedback, complete intake forms |
+
+---
+
+## Two Ways to Build
+
+
+
+ **One prompt, infinite flexibility.** You define personality and rules — the AI handles the flow. Best for support, FAQs, open-ended conversations.
+
+
+ Deprecated
+
+ **Visual workflow builder.** You design the exact path — nodes, branches, conditions. Best for qualification, booking, structured processes.
+
+
+
+| Aspect | Single Prompt | Conversational Flow |
+|--------|---------------|---------------------|
+| **Setup** | Fast — write one prompt | Longer — design the flow |
+| **Flexibility** | High — handles unexpected topics | Structured — follows your design |
+| **Control** | AI decides the path | You dictate the path |
+| **Best for** | Support, FAQs, advisory | Booking, intake, qualification |
+
+---
+
+## How It Works
+
+1. **Caller speaks** → Real-time speech-to-text
+2. **AI processes** → Understands intent, retrieves context
+3. **Takes action** → Calls APIs, queries knowledge base
+4. **Responds** → Natural text-to-speech, sub-second latency
+
+The entire turn happens in under a second. Callers experience natural, human-like conversation.
+
+---
+
+## Use Cases
+
+- **Customer Support** — Handle FAQs, troubleshoot, escalate to humans
+- **Sales** — Qualify leads, book demos, follow up on interest
+- **Scheduling** — Book, reschedule, confirm appointments
+- **Collections** — Friendly payment reminders
+- **Surveys** — Gather feedback through natural conversation
+- **Healthcare** — Patient intake, reminders, triage
+
+---
+
+## Get Started
+
+
+
+ Build agents visually — no code required
+
+
+ Full SDK access for custom implementations
+
+
diff --git a/fern/products/atoms/pages/intro/capabilities/campaigns.mdx b/fern/products/atoms/pages/intro/capabilities/campaigns.mdx
new file mode 100644
index 0000000..49a0a67
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/campaigns.mdx
@@ -0,0 +1,70 @@
+---
+title: "Campaigns"
+sidebarTitle: "Campaigns"
+icon: "megaphone"
+description: "Outbound calling at scale"
+---
+
+Campaigns let you make thousands of calls automatically. Upload contacts, assign an agent, schedule the timing — Atoms handles the rest.
+
+---
+
+## Use Cases
+
+| Campaign Type | Example |
+|---------------|---------|
+| **Lead outreach** | Initial contact with new leads |
+| **Appointment reminders** | Confirm upcoming bookings |
+| **Payment reminders** | Friendly collection calls |
+| **Surveys** | Gather feedback at scale |
+| **Re-engagement** | Reach dormant customers |
+| **Event invitations** | Promote webinars, events |
+
+---
+
+## How It Works
+
+1. **Upload contacts** — CSV with phone numbers and personalization data
+2. **Select agent** — Choose which agent handles the calls
+3. **Configure** — Set calling hours, timezone, retry rules
+4. **Launch** — Start the campaign
+5. **Monitor** — Real-time dashboard shows progress
+
+---
+
+## Features
+
+| Feature | Description |
+|---------|-------------|
+| **Scheduling** | Business hours only, timezone-aware |
+| **Rate limiting** | Control calls per minute |
+| **Retry logic** | Automatic retries for no-answers |
+| **DNC compliance** | Do Not Call list handling |
+| **Personalization** | Use contact data in conversations |
+| **Analytics** | Success rates, durations, outcomes |
+
+---
+
+## Personalization
+
+Pass contact data to your agent:
+
+```csv
+phone,first_name,appointment_date
++12025551234,John,January 15th
+```
+
+Agent says: *"Hi John, I'm calling to confirm your appointment on January 15th..."*
+
+---
+
+## Get Started
+
+
+
+ Launch campaigns from the dashboard
+
+
+ Programmatic campaign management
+
+
diff --git a/fern/products/atoms/pages/intro/capabilities/integrations.mdx b/fern/products/atoms/pages/intro/capabilities/integrations.mdx
new file mode 100644
index 0000000..9058823
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/integrations.mdx
@@ -0,0 +1,70 @@
+---
+title: "Integrations"
+sidebarTitle: "Integrations"
+icon: "plug"
+description: "Connect Atoms to your existing tools"
+---
+
+Atoms connects to your existing systems — CRMs, calendars, databases, custom APIs. Your agent reads data, takes actions, and keeps everything in sync.
+
+---
+
+## Integration Types
+
+| Type | Examples |
+|------|----------|
+| **CRM** | Salesforce, HubSpot, Zoho — log calls, update records |
+| **Calendar** | Google Calendar, Outlook — book appointments |
+| **Payments** | Stripe, Square — process transactions |
+| **Messaging** | Twilio SMS, Slack — send notifications |
+| **Custom APIs** | Any REST endpoint |
+| **Webhooks** | Push events to your systems |
+
+---
+
+## Pre-built Integrations
+
+| Integration | What Your Agent Can Do |
+|-------------|------------------------|
+| **Salesforce** | Create leads, log calls, update contacts |
+| **HubSpot** | Create contacts, log activities, update deals |
+| **Google Calendar** | Check availability, book, reschedule, cancel |
+| **Outlook** | Check availability, book, reschedule, cancel |
+| **Stripe** | Create payment links, check status |
+
+---
+
+## Custom APIs
+
+Connect any REST API:
+
+1. Define the endpoint
+2. Map parameters from conversation
+3. Handle response in agent logic
+
+Your agent can query order status, verify accounts, check inventory — anything your APIs support.
+
+---
+
+## Webhooks
+
+Push call events to your systems in real-time:
+
+| Event | When |
+|-------|------|
+| `call.started` | Call begins |
+| `call.ended` | Call completes |
+| `analytics.ready` | Post-call analysis done |
+
+---
+
+## Get Started
+
+
+
+ Configure integrations visually
+
+
+ Build custom integrations with the SDK
+
+
diff --git a/fern/products/atoms/pages/intro/capabilities/knowledge-base.mdx b/fern/products/atoms/pages/intro/capabilities/knowledge-base.mdx
new file mode 100644
index 0000000..fee5781
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/knowledge-base.mdx
@@ -0,0 +1,64 @@
+---
+title: "Knowledge Base"
+sidebarTitle: "Knowledge Base"
+icon: "book"
+description: "Give agents your company's knowledge"
+---
+
+A knowledge base lets your agent answer questions using your content — product docs, FAQs, policies, pricing. Instead of generic AI responses, your agent provides accurate, sourced answers from your actual documents.
+
+---
+
+## How It Works
+
+1. **Upload** — PDFs, docs, CSVs, web pages
+2. **Customer asks** — Agent searches your content
+3. **Finds match** — Retrieves relevant sections
+4. **Responds** — Answers grounded in your data
+
+This is called Retrieval-Augmented Generation (RAG) — combining search with AI for accurate, hallucination-free and grounded answers.
+
+---
+
+## What You Can Upload
+
+| Format | Examples |
+|--------|----------|
+| **Documents** | PDF, DOCX, TXT |
+| **Spreadsheets** | CSV, XLSX |
+| **Web content** | HTML, Markdown, URLs |
+| **Structured data** | JSON |
+
+---
+
+## Why Use It
+
+| Without KB | With KB |
+|------------|---------|
+| Agent guesses or hallucinates | Agent cites your documents |
+| "I'm not sure about that" | "According to our policy..." |
+| Generic responses | Company-specific expertise |
+| Outdated information | Always current |
+
+---
+
+## Example
+
+**Upload:** Return policy PDF
+
+**Customer:** "What's your return policy for electronics?"
+
+**Agent:** "You can return electronics within 30 days with original packaging. Would you like me to start a return for you?"
+
+---
+
+## Get Started
+
+
+
+ Create and manage knowledge bases visually
+
+
+ Programmatic knowledge base management
+
+
diff --git a/fern/products/atoms/pages/intro/capabilities/telephony.mdx b/fern/products/atoms/pages/intro/capabilities/telephony.mdx
new file mode 100644
index 0000000..23b3ce0
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/telephony.mdx
@@ -0,0 +1,82 @@
+---
+title: "Phone Numbers"
+sidebarTitle: "Phone Numbers"
+icon: "phone"
+description: "Inbound, outbound, and phone infrastructure"
+---
+
+Atoms provides full telephony infrastructure — buy phone numbers, receive inbound calls, make outbound calls, and integrate with existing phone systems.
+
+---
+
+## Capabilities
+
+| Type | Description |
+|------|-------------|
+| **Inbound** | Customers call your number, reach your agent |
+| **Outbound** | Your agent calls customers (single or campaigns) |
+| **Transfer** | Agent connects to human agents when needed |
+| **SIP** | Connect to existing phone infrastructure |
+
+---
+
+## Getting Numbers
+
+### Buy from Atoms
+
+Available in 40+ countries with instant provisioning.
+
+| Type | Best For |
+|------|----------|
+| **Local** | Regional presence, lower cost |
+| **Toll-free** | National reach, professional image |
+| **Mobile** | SMS capability |
+
+### Import Your Own Number (SIP)
+
+Already have phone numbers? Import them via SIP trunking. Provide your number and SIP termination URL, and Atoms sets up both inbound and outbound trunks so your number works for making and receiving calls through the platform.
+
+| You Provide | Description |
+|-------------|-------------|
+| **Phone Number** | Your existing number in E.164 format (e.g., `+14155551234`) |
+| **SIP Termination URL** | Where Atoms routes outbound calls (your SIP provider) |
+| **Username / Password** | Optional, only if your trunk requires authentication |
+
+Atoms gives you a **SIP Origination URL** to configure in your provider so inbound calls route to your agent.
+
+Works with any SIP-compatible provider: Twilio, Telnyx, Vonage, or your own infrastructure.
+
+> Set this up in the [Platform UI](/atoms/atoms-platform/deployment/phone-numbers) or via the [API](/atoms/api-reference).
+
+---
+
+## Call Controls
+
+During calls, agents can:
+
+| Action | Description |
+|--------|-------------|
+| **Transfer** | Connect to human or external number |
+| **Hold** | Place caller on hold with music |
+| **End** | Gracefully terminate call |
+| **DTMF** | Detect keypad presses |
+| **Record** | Start/stop recording |
+
+---
+
+## SIP Integration
+
+Connect Atoms to your existing phone system. Any provider that supports standard SIP trunking works — Twilio, Telnyx, Vonage, or your own PBX/VoIP setup.
+
+---
+
+## Get Started
+
+
+
+ Buy and manage phone numbers
+
+
+ Programmatic telephony control
+
+
diff --git a/fern/products/atoms/pages/intro/capabilities/voice-speech.mdx b/fern/products/atoms/pages/intro/capabilities/voice-speech.mdx
new file mode 100644
index 0000000..2a36949
--- /dev/null
+++ b/fern/products/atoms/pages/intro/capabilities/voice-speech.mdx
@@ -0,0 +1,79 @@
+---
+title: "Voice & Speech"
+sidebarTitle: "Voice & Speech"
+icon: "microphone"
+description: "Industry-leading voice AI with Lightning, Pulse, and Electron"
+---
+
+Atoms is powered by our proprietary voice AI stack — the fastest, most accurate, and most natural-sounding in the industry. Three models working together in sequence: transcribe speech, reason through the response, synthesize voice. Sub-800ms end-to-end.
+
+---
+
+## Pulse — Speech-to-Text
+
+High-accuracy, low-latency ASR built for real-time transcription. 32 languages with automatic detection.
+
+| Spec | Performance |
+|------|-------------|
+| **Latency (TTFT)** | 64ms |
+| **English WER** | 4.5% |
+| **Best WER** | 3.0% (Italian), 3.2% (Spanish) |
+| **Languages** | 32 supported |
+| **Concurrency** | 100 requests per GPU |
+
+**Key strengths:**
+- 64ms time-to-first-transcript
+- Industry-leading accuracy for Romance and Indic languages
+- PII/PCI redaction built-in
+- Handles accents and noisy environments
+
+### Supported Languages
+
+English, Hindi, Spanish, Portuguese, Italian, French, German, Dutch, Russian, Ukrainian, Polish, Czech, Slovak, Romanian, Bulgarian, Hungarian, Finnish, Swedish, Danish, Lithuanian, Latvian, Estonian, Maltese, Kannada, Malayalam, Telugu, Tamil, Marathi, Gujarati, Bengali, Punjabi, Oriya
+
+---
+
+## Electron — Small Language Model
+
+Our optimized SLM for voice AI. Fast reasoning with low latency, purpose-built for conversational agents.
+
+| Spec | Performance |
+|------|-------------|
+| **Optimized for** | Voice conversations |
+| **Latency** | Sub-500ms responses |
+| **Context handling** | Multi-turn conversations |
+
+Electron understands conversational context, handles interruptions gracefully, and generates responses optimized for spoken delivery — not just text.
+
+---
+
+## Lightning v3.1 — Text-to-Speech
+
+The fastest high-fidelity TTS model available. 44kHz native resolution with ultra-low latency.
+
+| Spec | Performance |
+|------|-------------|
+| **Latency** | 175ms @ 20 concurrency |
+| **Sample Rate** | 44,100 Hz native |
+| **Speed Control** | 0.5x to 2.0x |
+| **Languages** | English, Hindi (more coming) |
+| **Voice Cloning** | Instant (5-15s) and Professional (45min+) |
+
+**Key strengths:**
+- Studio-grade 44kHz audio clarity
+- Natural prosody and intonation
+- Real-time streaming (HTTP, SSE, WebSocket)
+- Voice cloning for custom brand voices
+
+---
+
+## Get Started
+
+
+
+ Configure voice settings visually
+
+
+ Programmatic voice configuration
+
+
diff --git a/fern/products/atoms/pages/intro/getting-started/quickstart-business.mdx b/fern/products/atoms/pages/intro/getting-started/quickstart-business.mdx
new file mode 100644
index 0000000..d36a935
--- /dev/null
+++ b/fern/products/atoms/pages/intro/getting-started/quickstart-business.mdx
@@ -0,0 +1,88 @@
+---
+title: "Quickstart for Business Users"
+description: "Build your first voice AI agent in 5 minutes — no coding required"
+---
+
+# Quickstart for Business Users
+
+Get your first AI voice agent up and running in just 5 minutes using our no-code platform.
+
+
+
+ 1. Go to [atoms.smallest.ai](https://atoms.smallest.ai)
+ 2. Create your account or sign in
+ 3. You'll land on your **Dashboard**
+
+ New accounts get free credits to test your first agents!
+
+
+
+ 1. Click **Create Agent** in the dashboard
+ 2. Choose a template or start from scratch:
+ - **Customer Support** — Handle inquiries 24/7
+ - **Appointment Booking** — Schedule meetings
+ - **Lead Qualification** — Screen inbound calls
+ - **Blank** — Build from scratch
+ 3. Give your agent a name
+
+ Templates come pre-configured with prompts, voices, and settings optimized for each use case.
+
+
+
+ **Choose Agent Type:**
+ - **Single Prompt** — One system prompt, agent decides flow
+ - **Convo Flow** — Step-by-step conversation script
+
+ **Set the Basics:**
+ - Write your agent's **Role & Objective**
+ - Select a **Voice** (preview to find the right one)
+ - Choose your **LLM** (GPT-4.1, Albert, or custom)
+ - Set the **Language**
+
+
+ Understanding Single Prompt vs Convo Flow
+
+
+
+
+ 1. Click the **Test Agent** button (top right)
+ 2. A test call will connect you to your agent
+ 3. Have a conversation — try different scenarios
+ 4. Review the **Conversation Logs** to see what happened
+
+ Always test thoroughly before going live! Try edge cases and unexpected inputs.
+
+
+
+ **Option A: Get a Phone Number**
+ 1. Go to **Phone Numbers** → **Buy Number**
+ 2. Search by country/area code
+ 3. Purchase and assign to your agent
+ 4. Your agent now answers calls to that number!
+
+ **Option B: Widget for Website**
+ 1. Go to **Widget** settings
+ 2. Copy the embed code
+ 3. Add to your website
+ 4. Visitors can call your agent from the browser
+
+
+
+---
+
+## Next Steps
+
+
+
+ Give your agent company-specific knowledge
+
+
+ Make outbound calls at scale
+
+
+ Connect to Salesforce, HubSpot, and more
+
+
+ Track call performance and insights
+
+
diff --git a/fern/products/atoms/pages/intro/getting-started/quickstart-developers.mdx b/fern/products/atoms/pages/intro/getting-started/quickstart-developers.mdx
new file mode 100644
index 0000000..caa08b5
--- /dev/null
+++ b/fern/products/atoms/pages/intro/getting-started/quickstart-developers.mdx
@@ -0,0 +1,180 @@
+---
+title: "Quickstart for Developers"
+description: "Get API access and make your first programmatic call in minutes"
+---
+
+# Quickstart for Developers
+
+Get your API keys, install the SDK, and create your first voice agent programmatically.
+
+## Prerequisites
+
+- Python 3.8+ or Node.js 16+
+- An Atoms account ([sign up here](https://atoms.smallest.ai))
+
+---
+
+## Step 1: Get Your API Key
+
+1. Log in to your [Atoms Dashboard](https://atoms.smallest.ai)
+2. Go to **Settings** → **API Keys**
+3. Click **Generate New Key**
+4. Copy and save your key securely
+
+Never commit your API key to version control. Use environment variables.
+
+```bash
+export SMALLEST_API_KEY="your-api-key-here"
+```
+
+---
+
+## Step 2: Install the SDK
+
+
+```bash Python
+pip install smallestai
+```
+
+```bash Node.js
+npm install @smallest/atoms
+```
+
+
+---
+
+## Step 3: Create Your First Agent
+
+
+```python Python
+from smallestai.atoms import AtomsClient
+
+client = AtomsClient()
+
+# Create a new agent
+agent = client.new_agent(
+ name="My First Agent",
+ system_prompt="""You are a helpful customer support agent for Acme Corp.
+ Be friendly, professional, and helpful.
+ If you don't know something, offer to transfer to a human.""",
+ voice_id="emily", # Choose a voice
+ language="en-US"
+)
+
+print(f"Agent created! ID: {agent.id}")
+```
+
+```javascript Node.js
+import { AtomsClient } from '@smallest/atoms';
+
+const client = new AtomsClient();
+
+const agent = await client.newAgent({
+ name: "My First Agent",
+ systemPrompt: `You are a helpful customer support agent for Acme Corp.
+ Be friendly, professional, and helpful.
+ If you don't know something, offer to transfer to a human.`,
+ voiceId: "emily",
+ language: "en-US"
+});
+
+console.log(`Agent created! ID: ${agent.id}`);
+```
+
+
+---
+
+## Step 4: Make an Outbound Call
+
+
+```python Python
+# Start an outbound call
+call = client.start_outbound_call(
+ agent_id=agent.id,
+ phone_number="+1234567890",
+ from_number="+0987654321" # Your Atoms number
+)
+
+print(f"Call started! Call ID: {call.id}")
+```
+
+```javascript Node.js
+const call = await client.startOutboundCall({
+ agentId: agent.id,
+ phoneNumber: "+1234567890",
+ fromNumber: "+0987654321"
+});
+
+console.log(`Call started! Call ID: ${call.id}`);
+```
+
+
+---
+
+## Step 5: Get Call Results
+
+
+```python Python
+from smallestai.atoms import Call
+
+call_manager = Call()
+
+# Get call details
+call_data = call_manager.get_call(call_id=call.id)
+
+print(f"Status: {call_data['status']}")
+print(f"Duration: {call_data['duration']}s")
+print(f"Transcript: {call_data['transcript']}")
+```
+
+```javascript Node.js
+const callData = await client.getCall(call.id);
+
+console.log(`Status: ${callData.status}`);
+console.log(`Duration: ${callData.duration}s`);
+console.log(`Transcript: ${callData.transcript}`);
+```
+
+
+---
+
+## Next Steps
+
+
+
+ Deep dive into SDK concepts
+
+
+ Full REST API documentation
+
+
+ Add RAG capabilities to agents
+
+
+ Scale to thousands of calls
+
+
+
+---
+
+## Common Patterns
+
+```python
+# List all agents
+agents = client.get_agents()
+
+# Update an agent
+client.update_agent(agent_id=agent.id, system_prompt="New prompt...")
+
+# Delete an agent
+client.delete_agent(agent_id=agent.id)
+
+# Search call logs
+from smallestai.atoms import Call
+call_manager = Call()
+calls = call_manager.search_calls(agent_id=agent.id, limit=100)
+```
+
+
+ Check out our [Cookbooks](/atoms/developer-guide/examples/examples) for complete working examples of common use cases.
+
diff --git a/fern/products/atoms/pages/intro/reference/changelog.mdx b/fern/products/atoms/pages/intro/reference/changelog.mdx
new file mode 100644
index 0000000..8a1308b
--- /dev/null
+++ b/fern/products/atoms/pages/intro/reference/changelog.mdx
@@ -0,0 +1,8 @@
+---
+title: "Changelog"
+sidebarTitle: "Changelog"
+icon: "clock-rotate-left"
+description: "What's new in Atoms"
+---
+
+Coming soon.
diff --git a/fern/products/atoms/pages/intro/reference/support.mdx b/fern/products/atoms/pages/intro/reference/support.mdx
new file mode 100644
index 0000000..4ca14dc
--- /dev/null
+++ b/fern/products/atoms/pages/intro/reference/support.mdx
@@ -0,0 +1,42 @@
+---
+title: "Support"
+sidebarTitle: "Support"
+icon: "life-ring"
+description: "Get help with Atoms"
+---
+
+## Contact
+
+
+
+ General questions and issues
+
+
+ Payment and subscription help
+
+
+ Report security concerns
+
+
+ Enterprise inquiries
+
+
+
+---
+
+## Resources
+
+
+
+ Guides, tutorials, and references
+
+
+ Community chat and quick answers
+
+
+ System status and incidents
+
+
+ SDKs and sample code
+
+
diff --git a/fern/products/atoms/pages/intro/welcome.mdx b/fern/products/atoms/pages/intro/welcome.mdx
new file mode 100644
index 0000000..9062c51
--- /dev/null
+++ b/fern/products/atoms/pages/intro/welcome.mdx
@@ -0,0 +1,212 @@
+---
+title: " "
+sidebarTitle: "Welcome"
+icon: "house"
+description: "Build, test, and deploy voice AI agents in minutes."
+mode: "wide"
+"og:title": "Welcome to Atoms - Voice AI Platform"
+---
+
+
+
+{/* Animated gradient border card hero */}
+
+ {/* Background gradient blob - like smallest logo */}
+
+
+
+ {/* Main title */}
+ Welcome to Atoms
+
+ {/* Description */}
+
Voice AI agents that sound human. Build, deploy, and scale intelligent conversations in minutes.
+
+
+
+
+Atoms is a voice AI platform that turns phone calls into outcomes. Customers get instant help. Leads get qualified. Appointments get booked — all in real-time, at any scale, around the clock.
+
+We built the entire stack from scratch. Pulse transcribes speech with 64ms time-to-first-transcript. Electron processes intent and generates responses in under 500ms. Lightning synthesizes studio-quality voice at 175ms latency. End-to-end, sub-800ms turn times — indistinguishable from human conversation.
+
+### Our Models
+
+| Model | What It Does | Performance |
+|-------|--------------|-------------|
+| **[Pulse](/atoms/product-overview/capabilities/voice-and-speech)** | Speech-to-Text | 32 languages, 64ms latency, 4.5% English WER |
+| **[Electron](/atoms/product-overview/capabilities/voice-and-speech)** | Language Model | Voice-optimized SLM, sub-500ms reasoning |
+| **[Lightning v3.1](/atoms/product-overview/capabilities/voice-and-speech)** | Text-to-Speech | 44kHz studio-grade, 175ms latency, voice cloning |
+
+---
+
+## Choose Your Path
+
+
+
+ **No-code visual builder** — Build your first agent in 5 minutes, no code required.
+
+
+ **Full SDK access** — Build your first agent in Python with the Atoms SDK.
+
+
+
+---
+
+## What You Can Build
+
+
+
+ AI that understands speech, processes intent, and responds naturally.
+
+
+ Give agents your docs, PDFs, and URLs to reference.
+
+
+ Outbound calling at scale with automated management.
+
+
+
+---
+
+## Capabilities
+
+
+
+ One prompt, infinite flexibility. Agent adapts dynamically.
+
+
+ Deprecated
+
+ Visual workflows for structured, predictable conversations.
+
+
+ Lightning + Pulse + Electron. Sub-800ms total turn time.
+
+
+ Numbers in 40+ countries. Inbound and outbound.
+
+
+ Connect CRMs, calendars, and custom APIs.
+
+
+ Call metrics and conversation insights.
+
+
+
+---
+
+## Resources
+
+
+
+ Code examples and templates on GitHub.
+
+
+ See what others have built with Atoms.
+
+
+ Join the community — ask questions, share projects.
+
+
diff --git a/fern/products/atoms/pages/introduction.mdx b/fern/products/atoms/pages/introduction.mdx
index 4a67a32..850cd64 100644
--- a/fern/products/atoms/pages/introduction.mdx
+++ b/fern/products/atoms/pages/introduction.mdx
@@ -17,14 +17,10 @@ who are great at having conversations. All you have to do is plug in your busine
Check the links below to get started.
-
+
For business representatives who wants to set this up.
-
+
For developers who want to get their hands dirty.
@@ -32,16 +28,11 @@ Check the links below to get started.
## Integration Options
-
- Integrate real-time voice and text chat with AI agents directly in your web
- applications using our multimodal SDK.
+
+ Integrate real-time voice and text chat with AI agents directly in your web applications using our
+ multimodal SDK.
-
- Build powerful backend integrations with our Python and Node.js SDKs for
- programmatic agent management.
+
+ Build powerful backend integrations with our Python and Node.js SDKs for programmatic agent management.
diff --git a/fern/products/atoms/pages/platform-api/agents.mdx b/fern/products/atoms/pages/platform-api/agents.mdx
new file mode 100644
index 0000000..67067e5
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/agents.mdx
@@ -0,0 +1,63 @@
+---
+title: "Agents"
+description: "Manage agents, templates, and webhooks."
+---
+
+The `AgentsApi` allows you to programmatically create agents, manage their configuration, and handle webhooks.
+
+## Clients
+
+```python
+from smallestai.atoms.api_client import ApiClient
+from smallestai.atoms.api.agents_api import AgentsApi
+
+client = ApiClient()
+api = AgentsApi(client)
+```
+
+## Common Operations
+
+### Get Agent Details
+
+Retrieve configuration for a specific agent.
+
+```python
+agent = api.agent_id_get(agent_id="your-agent-id")
+print(f"Agent Name: {agent.name}")
+```
+
+### Create Agent from Template
+
+Spin up a new agent using a pre-defined template.
+
+```python
+from smallestai.atoms.api import AgentTemplatesApi
+from smallestai.atoms.models import CreateAgentFromTemplateRequest
+
+# Initialize Templates API
+templates_api = AgentTemplatesApi()
+
+new_agent = templates_api.agent_from_template_post(
+ create_agent_from_template_request=CreateAgentFromTemplateRequest(
+ templateId="template-id",
+ name="My New Agent"
+ )
+)
+print(f"Created Agent ID: {new_agent.id}")
+```
+
+### Manage Webhooks
+
+Subscribe to events for your agent.
+
+```python
+from smallestai.atoms.models import AgentAgentIdWebhookSubscriptionsPostRequest
+
+api.agent_agent_id_webhook_subscriptions_post(
+ agent_id="your-agent-id",
+ agent_agent_id_webhook_subscriptions_post_request=AgentAgentIdWebhookSubscriptionsPostRequest(
+ url="https://your-server.com/webhook",
+ events=["call.completed", "transcript.ready"]
+ )
+)
+```
diff --git a/fern/products/atoms/pages/platform-api/calls.mdx b/fern/products/atoms/pages/platform-api/calls.mdx
new file mode 100644
index 0000000..29ab4f6
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/calls.mdx
@@ -0,0 +1,43 @@
+---
+title: "Calls"
+description: "Retrieve call history and transcripts."
+---
+
+The `Call` module provides access to your agent's call history, transcripts, and analytics.
+
+## Clients
+
+```python
+from smallestai.atoms.call import Call
+
+call = Call()
+```
+
+## Operations
+
+### List Calls
+
+Fetch a list of recent calls.
+
+```python
+calls = call.get_calls(limit=10)
+
+for log in calls["data"]["logs"]:
+ print(f"Call ID: {log['callId']} | Status: {log['status']}")
+```
+
+### Get Call Details
+
+Get detailed information, including transcripts, for a specific call.
+
+```python
+details = call.get_call("call-id-uuid")
+data = details["data"]
+
+print(f"Duration: {data['duration']}s")
+print(f"Status: {data['status']}")
+
+# Transcript
+for msg in data.get("transcript", []):
+ print(f"{msg['role']}: {msg['content']}")
+```
diff --git a/fern/products/atoms/pages/platform-api/campaigns.mdx b/fern/products/atoms/pages/platform-api/campaigns.mdx
new file mode 100644
index 0000000..7264050
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/campaigns.mdx
@@ -0,0 +1,49 @@
+---
+title: "Campaigns"
+description: "Manage outbound calling campaigns."
+---
+
+The `Campaign` module allows you to create and manage bulk outbound calling campaigns easily.
+
+## Clients
+
+```python
+from smallestai.atoms.campaign import Campaign
+from smallestai.atoms.audience import Audience
+
+campaign = Campaign()
+audience = Audience()
+```
+
+## Operations
+
+### Create a Campaign
+
+Launch a new outbound campaign.
+
+```python
+# 1. Create an audience first
+aud_response = audience.create(
+ name="Q3 Outreach List",
+ phone_numbers=["+14155551234"],
+ names=[("John", "Doe")]
+)
+audience_id = aud_response["data"]["_id"]
+
+# 2. Create the campaign
+camp_response = campaign.create(
+ name="Q3 Outreach",
+ agent_id="your-agent-id",
+ audience_id=audience_id,
+ phone_ids=["your-phone-id"], # Get from client.get_phone_numbers()
+ description="Sales outreach",
+ max_retries=2,
+ retry_delay=15
+)
+campaign_id = camp_response["data"]["_id"]
+print(f"Campaign Created: {campaign_id}")
+
+# 3. Start the campaign
+campaign.start(campaign_id)
+print("Campaign Started")
+```
diff --git a/fern/products/atoms/pages/platform-api/logs.mdx b/fern/products/atoms/pages/platform-api/logs.mdx
new file mode 100644
index 0000000..922d15b
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/logs.mdx
@@ -0,0 +1,39 @@
+---
+title: 'Logs'
+description: 'Retrieve conversation logs and details.'
+---
+
+The `Call` module allows you to access detailed logs and analytics for your conversations.
+
+## Clients
+
+```python
+from smallestai.atoms.call import Call
+
+call = Call()
+```
+
+## Get Call Logs
+
+Retrieve details and transcript for a specific conversation using its `call_id`.
+
+```python
+# specific_call_id is a string, usually a UUID
+call_id = "your_call_id_here"
+
+try:
+ # Get conversation details
+ details = call.get_call(call_id)
+ data = details["data"]
+
+ print(f"Status: {data['status']}")
+ print(f"Transcript lines: {len(data.get('transcript', []))}")
+
+ # Access post-call analytics if available
+ analytics = data.get("postCallAnalytics", {})
+ if analytics:
+ print(f"Summary: {analytics.get('summary')}")
+
+except Exception as e:
+ print(f"Error fetching logs: {e}")
+```
diff --git a/fern/products/atoms/pages/platform-api/organization.mdx b/fern/products/atoms/pages/platform-api/organization.mdx
new file mode 100644
index 0000000..7128b6d
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/organization.mdx
@@ -0,0 +1,28 @@
+---
+title: 'Organization'
+description: 'Manage and retrieve organization details.'
+---
+
+The `OrganizationApi` provides methods to access information about your organization within the Smallest.ai platform.
+
+## Initialize Organization API
+
+```python
+from smallestai.atoms.api import OrganizationApi
+
+# Initialize the API client
+api = OrganizationApi()
+```
+
+## Get Organization Details
+
+Retrieve the current organization's profile and settings.
+
+```python
+try:
+ # Get organization info
+ org_details = api.organization_get()
+ print(f"Organization Details: {org_details}")
+except Exception as e:
+ print(f"Error fetching organization details: {e}")
+```
diff --git a/fern/products/atoms/pages/platform-api/overview.mdx b/fern/products/atoms/pages/platform-api/overview.mdx
new file mode 100644
index 0000000..1928cfc
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/overview.mdx
@@ -0,0 +1,54 @@
+---
+title: "Overview"
+description: "Programmatically manage your Atoms platform resources."
+---
+
+The Platform API allows you to manage agents, calls, campaigns, knowledge bases, and more programmatically.
+
+## The Atoms Client
+
+The `AtomsClient` is the main entry point for interacting with the Smallest.ai Platform API. It wraps all specific API clients (Agents, Calls, etc.) into a single, cohesive interface.
+
+### Initialization
+
+```python
+from smallestai.atoms import AtomsClient
+
+# Initialize the client (picks up ATOMS_API_KEY from environment)
+client = AtomsClient()
+```
+
+### Accessing APIs
+
+You can access specific functionality through the client's properties or convenience methods:
+
+```python
+# Create an agent using the convenience method
+client.create_agent(create_agent_request=...)
+
+# Or access the specific API directly
+client.agents_api.agent_post(...)
+
+# Managing Knowledge Bases
+client.get_knowledge_bases()
+
+# Checking Logs
+client.get_conversation_logs(id="call_id")
+```
+
+## Explore the APIS
+
+
+
+ Create and manage AI agents.
+
+
+ Run outbound calling campaigns.
+
+
+ Access call history and transcripts.
+
+
+ Debug with conversation logs.
+
+
diff --git a/fern/products/atoms/pages/platform-api/user.mdx b/fern/products/atoms/pages/platform-api/user.mdx
new file mode 100644
index 0000000..de56d5c
--- /dev/null
+++ b/fern/products/atoms/pages/platform-api/user.mdx
@@ -0,0 +1,28 @@
+---
+title: 'User'
+description: 'Manage and retrieve user details.'
+---
+
+The `UserApi` allows you to access information about the authenticated user.
+
+## Initialize User API
+
+```python
+from smallestai.atoms.api import UserApi
+
+# Initialize the API client
+api = UserApi()
+```
+
+## Get User Details
+
+Retrieve the current user's profile information.
+
+```python
+try:
+ # Get user info
+ user_details = api.user_get()
+ print(f"User Details: {user_details}")
+except Exception as e:
+ print(f"Error fetching user details: {e}")
+```
diff --git a/fern/products/atoms/pages/platform/analytics/conversation-logs.mdx b/fern/products/atoms/pages/platform/analytics/conversation-logs.mdx
new file mode 100644
index 0000000..779faf7
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/conversation-logs.mdx
@@ -0,0 +1,142 @@
+---
+title: "Conversation Logs"
+sidebarTitle: "Conversation Logs"
+description: "Review transcripts and debug agent behavior."
+---
+
+Conversation Logs are your window into every call. See exactly what was said, when events occurred, and how metrics were captured — everything you need to understand and improve your agent.
+
+**Location:** Top right → **Convo Logs** button
+
+---
+
+## Call Logs List
+
+
+ 
+
+
+The main view shows all calls with key information at a glance:
+
+| Column | Description |
+|--------|-------------|
+| **Call Date** | When the call occurred |
+| **Call ID** | Unique identifier (click to copy) |
+| **From / To** | Phone numbers or sources |
+| **Duration** | How long the call lasted |
+| **Hangup Cause** | Why the call ended |
+| **Status** | Current state of the call |
+| **Retries** | Number of retry attempts |
+| **Details** | Click to view full conversation |
+
+---
+
+## Filtering
+
+Click **Filter By** to narrow down your logs:
+
+| Filter | Options |
+|--------|---------|
+| **Conversation Type** | Inbound Calls, Outbound Calls, Web Calls, Chat |
+| **Status** | Pending, In Queue, In Progress, Active, Completed, Failed, Cancelled, No Answer, Processing |
+| **End Reason** | Dial No Answer, User Hangup, Agent Hangup, Busy, Timeout, Error, Voicemail |
+| **Call Type** | All Attempts, Retry Attempts, Initial Attempts |
+| **Call Duration** | 0-30 seconds, 30-60 seconds, 1-5 minutes, 5+ minutes |
+
+Use **Search Logs** to find specific calls by ID or content.
+
+---
+
+## Call Details
+
+Click **Details** on any call to open the full conversation view. You'll see tabs for different types of information:
+
+
+
+
+ 
+
+
+ High-level summary of the call:
+
+ | Field | Description |
+ |-------|-------------|
+ | **Call Summary** | AI-generated summary of what happened |
+ | **Agent** | Which agent handled the call |
+ | **Call ID** | Unique identifier |
+ | **Model** | AI model used |
+ | **Voice** | Voice used |
+ | **Date & Time** | When the call occurred |
+ | **Cost (Credits)** | Credit usage |
+ | **Disconnection Reason** | Why the call ended |
+
+ Play the audio recording using the waveform player at the top.
+
+
+
+
+ 
+
+
+ The full conversation, word for word. Each message shows:
+ - Who spoke (Agent or User)
+ - What was said
+ - Timestamp
+
+ Use this to understand exactly how the conversation flowed.
+
+
+
+
+ 
+
+
+ Timeline of everything that happened:
+ - Agent responses
+ - Call End triggers
+ - Transfers
+ - API calls
+ - Other system events
+
+ Each event shows the timestamp and what occurred.
+
+
+
+
+ 
+
+
+ Post-call metrics you've configured, with their values:
+
+ Each metric shows:
+ - Name
+ - Data type (Integer, String, Boolean, etc.)
+ - Value extracted from this call
+
+ Click the dropdown on any metric to see details.
+
+
+
+---
+
+## Exporting
+
+Click the **Export** button to download your logs:
+
+| Format | Best for |
+|--------|----------|
+| **JSON** | Developers, programmatic analysis |
+| **CSV** | Spreadsheets, reporting |
+
+---
+
+## Related
+
+
+
+ Define what to track from each call
+
+
+ Test your agent
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/dashboard-overview.mdx b/fern/products/atoms/pages/platform/analytics/dashboard-overview.mdx
new file mode 100644
index 0000000..897f12d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/dashboard-overview.mdx
@@ -0,0 +1,98 @@
+---
+title: "Analytics Dashboard Overview"
+sidebarTitle: "Dashboard Overview"
+description: "Monitor your voice AI performance with comprehensive analytics."
+---
+
+The Analytics dashboard provides a unified view of how your voice AI agents are performing. Track call volumes, success rates, and key metrics across all your agents.
+
+---
+
+## Location
+
+**Left Sidebar → Observe → Analytics**
+
+---
+
+## Dashboard Layout
+
+→ **NEEDS PLATFORM INFO:** Analytics dashboard interface
+
+The dashboard typically includes:
+
+| Section | Content |
+|---------|---------|
+| **Summary Cards** | Key metrics at a glance |
+| **Charts** | Trends over time |
+| **Agent Breakdown** | Per-agent performance |
+| **Recent Activity** | Latest calls |
+
+---
+
+## Key Metrics
+
+### Volume Metrics
+
+| Metric | Description |
+|--------|-------------|
+| **Total Calls** | Number of calls handled |
+| **Inbound Calls** | Calls received |
+| **Outbound Calls** | Calls made (campaigns) |
+| **Active Agents** | Agents currently live |
+
+### Performance Metrics
+
+| Metric | Description |
+|--------|-------------|
+| **Avg Call Duration** | Average length of calls |
+| **Completion Rate** | % of calls that completed normally |
+| **Success Rate** | % achieving desired outcome |
+| **Transfer Rate** | % transferred to human |
+
+### Quality Metrics
+
+| Metric | Description |
+|--------|-------------|
+| **Customer Satisfaction** | From post-call metrics |
+| **Resolution Rate** | Issues resolved on first call |
+| **Escalation Rate** | Calls requiring escalation |
+
+---
+
+## Time Filters
+
+View data for different periods:
+
+| Period | Use Case |
+|--------|----------|
+| Today | Real-time monitoring |
+| Last 7 days | Weekly trends |
+| Last 30 days | Monthly overview |
+| Custom range | Specific analysis |
+
+---
+
+## Agent Comparison
+
+Compare performance across agents:
+
+| Agent | Calls | Avg Duration | Success Rate |
+|-------|-------|--------------|--------------|
+| Support Bot | 1,234 | 3:45 | 87% |
+| Sales Agent | 567 | 5:12 | 42% |
+| Reminder Bot | 2,890 | 1:23 | 95% |
+
+Identify top performers and areas for improvement.
+
+---
+
+## What's Next
+
+
+
+ Deep dive into metrics
+
+
+ Optimization tips
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/improving-performance.mdx b/fern/products/atoms/pages/platform/analytics/improving-performance.mdx
new file mode 100644
index 0000000..02a0a6b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/improving-performance.mdx
@@ -0,0 +1,177 @@
+---
+title: "Improving Performance"
+sidebarTitle: "Improving Performance"
+description: "Use analytics insights to optimize your voice AI agents."
+---
+
+Analytics tell you what's happening. This page shows you how to turn insights into improvements.
+
+---
+
+## Common Issues and Solutions
+
+### Low Success Rate
+
+**Symptoms:**
+- Fewer calls achieve desired outcome
+- High "unsuccessful" disposition
+
+**Investigate:**
+1. Review conversation logs for failed calls
+2. Identify where conversations break down
+3. Check if callers are asking unexpected questions
+
+**Solutions:**
+| Finding | Action |
+|---------|--------|
+| Agent misunderstands requests | Improve prompt clarity |
+| Missing information | Expand Knowledge Base |
+| Wrong branch taken (Convo Flow) | Refine conditions |
+| Caller frustration | Improve tone/empathy in prompt |
+
+---
+
+### High Transfer Rate
+
+**Symptoms:**
+- Many calls end in transfer
+- Humans are overloaded
+
+**Investigate:**
+1. What triggers transfers?
+2. Are they appropriate escalations?
+3. Could the agent handle these?
+
+**Solutions:**
+| Finding | Action |
+|---------|--------|
+| Legitimate escalations | Transfer rate is appropriate |
+| Agent can't answer questions | Add to Knowledge Base |
+| Agent gives up too easily | Adjust prompt instructions |
+| Caller requests human | Improve agent experience |
+
+---
+
+### Short Call Duration
+
+**Symptoms:**
+- Calls end very quickly
+- Low engagement
+
+**Investigate:**
+1. Are callers hanging up?
+2. Are end conditions triggering too early?
+3. Is the greeting off-putting?
+
+**Solutions:**
+| Finding | Action |
+|---------|--------|
+| Poor greeting | Improve opening |
+| Immediate hang-up | Check voice/audio quality |
+| Misunderstood intent | Improve understanding |
+| Too aggressive end conditions | Relax end call triggers |
+
+---
+
+### Very Long Calls
+
+**Symptoms:**
+- Calls exceeding expected duration
+- Rambling conversations
+
+**Investigate:**
+1. Is the agent getting stuck in loops?
+2. Is it asking too many questions?
+3. Is caller unable to get answers?
+
+**Solutions:**
+| Finding | Action |
+|---------|--------|
+| Loops in Convo Flow | Fix workflow logic |
+| Agent too verbose | Shorten responses |
+| Caller can't get answer | Improve Knowledge Base |
+| No clear path to resolution | Add more direct paths |
+
+---
+
+### Low Satisfaction Scores
+
+**Symptoms:**
+- Post-call metrics show unhappy callers
+
+**Investigate:**
+1. Read transcripts of low-scoring calls
+2. Identify frustration points
+3. Note specific complaints
+
+**Solutions:**
+| Finding | Action |
+|---------|--------|
+| Agent sounds robotic | Improve prompt for naturalness |
+| Answers are wrong | Fix Knowledge Base |
+| Process is frustrating | Simplify workflow |
+| Agent doesn't empathize | Add empathy instructions |
+
+---
+
+## Optimization Cycle
+
+Follow this continuous improvement process:
+
+```
+1. Monitor Analytics
+ ↓
+2. Identify Issues
+ ↓
+3. Review Conversation Logs
+ ↓
+4. Diagnose Root Cause
+ ↓
+5. Make Changes
+ ↓
+6. Test Changes
+ ↓
+7. Deploy and Monitor
+ ↓
+(Repeat)
+```
+
+---
+
+## A/B Testing
+
+To test improvements:
+
+1. Create a new agent version with changes
+2. Split traffic between old and new
+3. Compare metrics
+4. Roll out winner
+
+→ **NEEDS PLATFORM INFO:** A/B testing capabilities
+
+---
+
+## Quick Wins
+
+Improvements that often help:
+
+| Quick Win | Impact |
+|-----------|--------|
+| Add more FAQ to KB | Better answers |
+| Shorten agent responses | Faster calls |
+| Add empathy phrases | Better satisfaction |
+| Fix pronunciation issues | Clearer communication |
+| Improve greeting | Better engagement |
+
+---
+
+## What's Next
+
+
+
+ Dig into specific calls
+
+
+ See optimized examples
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/locking.mdx b/fern/products/atoms/pages/platform/analytics/locking.mdx
new file mode 100644
index 0000000..3e36b2c
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/locking.mdx
@@ -0,0 +1,45 @@
+---
+title: "Locking Your Agent"
+sidebarTitle: "Locking"
+description: "Protect production agents from accidental changes."
+---
+
+Once your agent is working well, lock it. Locking prevents accidental edits that could break a production agent.
+
+**Location:** Top right → **Lock Agent** toggle
+
+
+ 
+
+
+---
+
+## How It Works
+
+Toggle **Lock Agent** to ON — all editing becomes disabled.
+
+**What's blocked:**
+- Prompt editing
+- Configuration changes
+- Settings modifications
+- Node changes (Convo Flow)
+
+**What still works:**
+- Test Agent
+- View Conversation Logs
+- Live calls continue normally
+
+To make changes, toggle it back to OFF, edit, test, then re-lock.
+
+---
+
+## Related
+
+
+
+ Test before locking
+
+
+ Deploy to production
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/overview.mdx b/fern/products/atoms/pages/platform/analytics/overview.mdx
new file mode 100644
index 0000000..02f994b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/overview.mdx
@@ -0,0 +1,81 @@
+---
+title: "Analytics"
+description: "Monitor call performance across your agents and campaigns"
+---
+
+The Analytics dashboard gives you a bird's-eye view of all your voice AI agnets activity — call volumes, connection rates, costs, and agent performance.
+
+**Location:** Left Sidebar → Observe → Analytics
+
+
+
+
+
+---
+
+## Filters
+
+Narrow down your data with the filters at the top:
+
+| Filter | Options |
+|--------|---------|
+| **Date Range** | Select start and end dates |
+| **Filter by Agent** | View specific agent's calls |
+| **Filter by Campaign** | View specific campaign's calls |
+| **Filter by Call** | Filter by call type or status |
+
+Click **Refresh** to update the dashboard with your selections.
+
+---
+
+## Summary Cards
+
+Quick metrics at the top of the dashboard:
+
+| Metric | Description |
+|--------|-------------|
+| **Call Counts** | Total number of calls |
+| **Avg. Call Duration** | Average length of calls |
+| **Avg. Call Latency** | Average response time |
+| **Total Cost** | Credits spent on calls |
+
+---
+
+## Charts
+
+### Call Connected Percentage
+
+Pie chart showing the connection rate by agent—how many calls connected vs. didn't connect.
+
+### Disconnection Reason
+
+Breakdown of why calls ended:
+- **Dial No Answer** — Contact didn't pick up
+- **User Hangup** — Contact ended the call
+- **Agent Hangup** — Agent ended the call
+
+---
+
+## Most Called Agents
+
+Table showing which agents handled the most calls:
+
+| Column | Description |
+|--------|-------------|
+| Agent Name | The agent |
+| Number of calls | Total calls handled |
+| Call Minutes | Total talk time |
+| Credits Spent | Cost for this agent |
+
+---
+
+## Related
+
+
+
+ Drill into individual call details
+
+
+ View campaign-specific analytics
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/testing.mdx b/fern/products/atoms/pages/platform/analytics/testing.mdx
new file mode 100644
index 0000000..0f5cabb
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/testing.mdx
@@ -0,0 +1,58 @@
+---
+title: "Testing Your Agent"
+sidebarTitle: "Testing"
+description: "Validate your agent before deploying to production."
+---
+
+Testing is the difference between a great agent and a frustrating one. Atoms gives you three ways to test, so you can catch issues before real callers do.
+
+**Location:** Top right → **Test Agent** button
+
+---
+
+## Three Test Modes
+
+
+
+
+ 
+
+
+ **Voice call in your browser.** Quick and convenient — no phone needed.
+
+ Best for rapid testing during development.
+
+
+
+
+ 
+
+
+ **Real phone call.** The authentic experience — exactly what your callers will hear.
+
+ Best for final validation before launch.
+
+
+
+
+ 
+
+
+ **Text-only conversation.** Test conversation logic without voice.
+
+ Best for testing branching and prompts quickly.
+
+
+
+---
+
+## Related
+
+
+
+ Review call transcripts
+
+
+ Protect production agents
+
+
diff --git a/fern/products/atoms/pages/platform/analytics/understanding-metrics.mdx b/fern/products/atoms/pages/platform/analytics/understanding-metrics.mdx
new file mode 100644
index 0000000..d2d6772
--- /dev/null
+++ b/fern/products/atoms/pages/platform/analytics/understanding-metrics.mdx
@@ -0,0 +1,174 @@
+---
+title: "Understanding Metrics"
+sidebarTitle: "Understanding Metrics"
+description: "Learn what each metric means and how to interpret it."
+---
+
+The analytics dashboard shows many metrics. This page explains what each one means, how it's calculated, and what insights you can draw.
+
+---
+
+## Call Volume Metrics
+
+### Total Calls
+
+The number of calls handled in the selected period.
+
+**Includes:**
+- Inbound calls answered
+- Outbound calls connected
+- Test calls (if enabled)
+
+**Use it to:**
+- Track overall usage
+- Identify busy periods
+- Plan capacity
+
+### Inbound vs Outbound
+
+| Type | Source |
+|------|--------|
+| **Inbound** | Customers calling your numbers |
+| **Outbound** | Campaigns calling customers |
+
+**Ratio insight:**
+- High inbound = reactive support
+- High outbound = proactive engagement
+
+---
+
+## Duration Metrics
+
+### Average Call Duration
+
+Total call time ÷ Number of calls
+
+**What it indicates:**
+- Short calls → Quick resolutions or early hang-ups
+- Long calls → Complex issues or engaged conversations
+- Very long calls → Possible stuck conversations
+
+**Benchmarks vary by use case:**
+- Simple FAQ: 1-2 minutes
+- Support: 3-5 minutes
+- Sales qualification: 5-10 minutes
+
+### Total Call Time
+
+Sum of all call durations. Useful for:
+- Cost estimation
+- Capacity planning
+- Usage tracking
+
+---
+
+## Outcome Metrics
+
+### Completion Rate
+
+Calls that ended normally ÷ Total calls
+
+**"Normally" means:**
+- End Call function triggered
+- Caller said goodbye
+- Transfer completed
+
+**Does NOT include:**
+- Caller hung up unexpectedly
+- Technical failures
+- Timeouts
+
+### Success Rate
+
+Calls achieving desired outcome ÷ Total calls
+
+Based on **disposition** or **post-call metrics**.
+
+**Examples:**
+- Support: Issue resolved
+- Sales: Lead qualified
+- Reminders: Appointment confirmed
+
+### Transfer Rate
+
+Calls transferred to human ÷ Total calls
+
+**High transfer rate may indicate:**
+- Complex issues beyond agent capability
+- Prompt needs improvement
+- Knowledge Base gaps
+- Appropriate escalation (not always bad)
+
+---
+
+## Quality Metrics
+
+### Customer Satisfaction
+
+From post-call metrics (if configured).
+
+**Common scales:**
+- 1-5 rating
+- NPS (0-10)
+- Thumbs up/down
+
+**Use it to:**
+- Track service quality
+- Identify problem areas
+- Measure improvements
+
+### Resolution Rate
+
+Issues resolved on first call.
+
+**High resolution rate = efficient agent**
+
+Low resolution may indicate:
+- Incomplete knowledge
+- Process issues
+- Complex problems
+
+---
+
+## Time-Based Analysis
+
+### Peak Hours
+
+When do most calls occur?
+
+**Use it to:**
+- Staff humans appropriately
+- Schedule campaigns effectively
+- Expect higher/lower volumes
+
+### Day-of-Week Patterns
+
+Some days are busier than others.
+
+**Use it to:**
+- Plan maintenance windows
+- Schedule campaigns
+- Set expectations
+
+### Trends Over Time
+
+Is performance improving?
+
+| Trend | Meaning |
+|-------|---------|
+| Success rate increasing | Agent improving |
+| Duration decreasing | More efficient |
+| Volume increasing | Growing usage |
+
+---
+
+## What's Next
+
+
+
+ Act on your insights
+
+
+ Configure custom metrics
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/language-settings.mdx b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/language-settings.mdx
new file mode 100644
index 0000000..69bfef5
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/language-settings.mdx
@@ -0,0 +1,97 @@
+---
+title: "Language Settings"
+sidebarTitle: "Language"
+description: "Configure language and localization for your agent."
+---
+
+Language settings control what language your agent speaks and understands. Get this right and conversations feel natural. Get it wrong and callers struggle to communicate.
+
+---
+
+## Primary Language
+
+Set the primary language during agent creation or in settings. This affects:
+
+**Speech Recognition**
+What language the system expects to hear from callers. Optimized for the accents and vocabulary of that language.
+
+**Text-to-Speech**
+What language the agent speaks in. Pronunciation, rhythm, and intonation are tuned for that language.
+
+**LLM Processing**
+The language context the AI uses when understanding and generating responses.
+
+---
+
+## Supported Languages
+
+Atoms supports a growing list of languages. Common options include:
+
+| Language | Code | Notes |
+|----------|------|-------|
+| English (US) | en-US | Default, most tested |
+| English (UK) | en-GB | British pronunciation |
+| Spanish | es | Latin American and Castilian variants |
+| French | fr | France and Canadian variants |
+| German | de | Standard German |
+| Portuguese | pt-BR | Brazilian Portuguese |
+| Hindi | hi | Indian Hindi |
+| And more... | | Check the language dropdown for full list |
+
+---
+
+## Multi-Language Support
+
+For agents that need to handle multiple languages:
+
+### Language Detection
+
+Enable automatic language detection. The agent listens to the first few seconds and switches to match the caller's language.
+
+### Language Switching
+
+You can design flows that explicitly ask about language preference:
+
+```
+"Hello! Para español, diga 'español'. For English, say 'English'."
+```
+
+Then route to language-specific nodes or prompts.
+
+---
+
+## Language in Prompts
+
+Write prompts in the language your agent will speak. If your agent speaks Spanish, write your prompts in Spanish:
+
+```
+Hola, soy María del servicio al cliente de TechStore.
+¿En qué puedo ayudarte hoy?
+```
+
+The LLM understands prompts in most languages and responds appropriately.
+
+---
+
+
+**Test with native speakers.** Automated testing catches errors, but native speakers catch awkward phrasing and cultural mismatches.
+
+**Consider regional variants.** Spanish in Mexico sounds different from Spanish in Spain. Choose the variant that matches your audience.
+
+**Keep translations consistent.** If you support multiple languages, maintain the same quality across all of them. A great English experience with a bad Spanish translation frustrates bilingual customers.
+
+**Handle code-switching.** Some callers mix languages ("Spanglish"). Decide whether your agent should match this or stick to one language.
+
+
+---
+
+## Next Steps
+
+
+
+ Choose a voice that matches your language
+
+
+ Configure how calls conclude
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/llm-selection.mdx b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/llm-selection.mdx
new file mode 100644
index 0000000..64dfe77
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/llm-selection.mdx
@@ -0,0 +1,105 @@
+---
+title: "LLM Selection"
+sidebarTitle: "LLM"
+description: "Choose the AI model that powers your agent's understanding and responses."
+---
+
+The LLM (Large Language Model) is the brain behind your agent. It's what understands caller intent, generates natural responses, and decides what to do next. Different models offer different tradeoffs between intelligence, speed, and cost.
+
+---
+
+## Available Models
+
+Atoms supports multiple LLM providers and models. Choose based on your use case:
+
+| Model | Best For | Characteristics |
+|-------|----------|-----------------|
+| **GPT-4.1** | Complex conversations, nuanced understanding | Most capable, higher cost, slightly slower |
+| **GPT-4o-mini** | Balanced performance | Good capability, moderate cost, fast |
+| **Albert** | High-volume, simple interactions | Fast, cost-effective, handles routine conversations well |
+
+---
+
+## How to Choose
+
+### Choose GPT-4.1 when:
+- Conversations are complex or nuanced
+- You need the best possible understanding
+- Accuracy matters more than cost
+- Callers may ask unexpected or difficult questions
+
+### Choose GPT-4o-mini when:
+- You want a balance of capability and cost
+- Conversations are moderately complex
+- Speed matters but so does quality
+
+### Choose Albert when:
+- You're handling high call volumes
+- Conversations follow predictable patterns
+- Speed and cost are primary concerns
+- You're running outbound campaigns at scale
+
+---
+
+## Model Settings
+
+Beyond choosing a model, you can configure behavior:
+
+### Temperature
+
+Controls how "creative" vs "predictable" the model behaves.
+
+| Value | Behavior | Best For |
+|-------|----------|----------|
+| **0.0 - 0.3** | Consistent, factual | Support, FAQ, compliance |
+| **0.4 - 0.6** | Balanced | General conversations |
+| **0.7 - 1.0** | Creative, varied | Sales, engagement |
+
+Lower temperature = more predictable responses. Higher temperature = more variety and creativity.
+
+### Max Tokens
+
+Limits response length. For voice agents, keep this moderate (100-300 tokens). Long responses lose caller attention.
+
+---
+
+## Impact on Agent Behavior
+
+The LLM affects:
+
+**Understanding**
+How well the agent interprets what callers mean, even when they speak unclearly or use unexpected phrasing.
+
+**Response Quality**
+How natural, helpful, and appropriate the agent's responses are.
+
+**Prompt Following**
+How closely the agent follows your instructions in the system prompt.
+
+**Edge Case Handling**
+How well the agent handles unusual situations not explicitly covered in your prompt.
+
+---
+
+
+**Start with GPT-4.1, optimize later.** Build and test with the best model first. Once your agent works well, try cheaper models to see if quality holds up.
+
+**Match model to use case.** A complex sales conversation needs more intelligence than "Press 1 for billing, press 2 for support."
+
+**Monitor conversations.** Review conversation logs to see if the model is understanding callers correctly. Frequent misunderstandings might mean you need a more capable model.
+
+**Consider cost at scale.** For outbound campaigns with thousands of calls, model cost adds up. Test with Albert to see if it handles your specific use case.
+
+
+---
+
+## Next Steps
+
+
+
+ Configure language and localization
+
+
+ Choose how your agent sounds
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/voice-selection.mdx b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/voice-selection.mdx
new file mode 100644
index 0000000..8850d6f
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuration/agent-settings/voice-selection.mdx
@@ -0,0 +1,97 @@
+---
+title: "Voice Selection"
+sidebarTitle: "Voice"
+description: "Choose how your agent sounds."
+---
+
+Voice is the first thing callers notice. Before they hear what your agent says, they hear *how* it says it. A warm, natural voice builds trust. A robotic voice makes people hang up.
+
+Atoms offers a range of high-quality voices optimized for real-time phone conversations.
+
+---
+
+## Choosing a Voice
+
+When creating or editing an agent, you'll find voice selection in the agent settings. Click to browse available voices and preview each one before choosing.
+
+### What to Consider
+
+**Match your brand**
+A luxury concierge service needs a different voice than a tech support line. Think about your brand's personality — formal or casual? Energetic or calm?
+
+**Match your audience**
+Consider who's calling. Different demographics respond to different voice characteristics.
+
+**Match the use case**
+- **Customer support** — Calm, patient, reassuring
+- **Sales** — Energetic, confident, engaging
+- **Healthcare** — Warm, empathetic, professional
+- **Financial services** — Authoritative, trustworthy, clear
+
+### Available Voice Characteristics
+
+| Characteristic | Options |
+|----------------|---------|
+| **Gender** | Male, Female |
+| **Tone** | Professional, Friendly, Casual, Authoritative |
+| **Energy** | Calm, Neutral, Upbeat |
+| **Accent** | American, British, Australian, Indian, and more |
+
+---
+
+## Voice Quality
+
+All voices on Atoms are powered by **Waves**, our text-to-speech engine optimized for real-time telephony. This means:
+
+**Ultra-low latency**
+Responses start playing immediately. No awkward pauses while audio generates.
+
+**Natural prosody**
+Voices emphasize words naturally, pause appropriately, and sound human — not robotic.
+
+**Phone-optimized**
+Audio is tuned for phone call quality, not podcast production. It sounds clear over phone networks.
+
+---
+
+## Premium Voices
+
+Some voices are marked as Premium and may have additional per-minute costs. Premium voices typically offer:
+- More natural intonation
+- Better handling of complex sentences
+- Enhanced emotional range
+
+Check the pricing page for current Premium voice rates.
+
+---
+
+## Voice Cloning (Enterprise)
+
+For enterprise customers, Atoms supports custom voice cloning. Train the system on audio samples to create a voice unique to your brand.
+
+Contact sales for voice cloning capabilities.
+
+---
+
+
+**Preview with your actual prompts.** The same voice sounds different saying "Welcome to Acme Support" vs "Your payment of $1,247.83 is due tomorrow."
+
+**Test on actual phone calls.** Browser preview sounds different than phone audio. Make test calls before deploying.
+
+**Consider multilingual needs.** If your agent handles multiple languages, make sure your chosen voice supports them well.
+
+**Get feedback.** Play sample calls for colleagues or customers. What sounds good to you might not resonate with your audience.
+
+
+---
+
+## Next Steps
+
+
+
+ Choose the AI model powering your agent
+
+
+ Configure language and localization
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/end-call.mdx b/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/end-call.mdx
new file mode 100644
index 0000000..ec299c5
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/end-call.mdx
@@ -0,0 +1,143 @@
+---
+title: "End Call Configuration"
+sidebarTitle: "End Call"
+description: "Configure how and when your agent ends conversations."
+---
+
+Every call needs to end eventually. How it ends matters — a graceful conclusion leaves callers satisfied, while an abrupt cutoff frustrates them.
+
+End call settings control when your agent concludes conversations and what happens when it does.
+
+---
+
+## How End Call Works
+
+### In Single Prompt Agents
+
+End call behavior is defined in your prompt's "End Call Conditions" section. You write natural language rules:
+
+```
+End the call when:
+- Customer confirms their issue is resolved
+- Customer explicitly asks to end the call
+- Customer says they have no more questions
+```
+
+The AI interprets these conditions and ends the call when appropriate.
+
+### In Convo Flow Agents
+
+You explicitly place **End Call** nodes in your workflow. When the conversation reaches one of these nodes, the call ends.
+
+```
+Confirmation → End Call (Disposition: Successful)
+Not Interested → End Call (Disposition: Unsuccessful)
+```
+
+---
+
+## Configuring End Behavior
+
+### Farewell Message
+
+What the agent says before hanging up. Make it warm and professional:
+
+```
+Thanks for calling TechStore! We hope we were able to help.
+Have a wonderful day!
+```
+
+Avoid abrupt endings like "Goodbye" followed by immediate disconnection.
+
+### Disposition Tagging
+
+Tag call outcomes for analytics:
+
+| Disposition | Meaning |
+|-------------|---------|
+| **Successful** | Goal achieved — booking made, question answered, issue resolved |
+| **Unsuccessful** | Goal not achieved — not interested, couldn't help, wrong number |
+| **Transferred** | Handed off to a human agent |
+| **Voicemail** | Left a message (outbound only) |
+| **No Answer** | Caller didn't pick up (outbound only) |
+| **Callback Requested** | Caller asked for a follow-up call |
+
+Dispositions appear in your analytics and help measure agent performance.
+
+---
+
+## Automatic End Conditions
+
+Beyond explicit end triggers, calls can end automatically:
+
+### Silence Timeout
+
+If the caller stops responding for too long, the agent should handle it gracefully:
+
+```
+"Hello? Are you still there?"
+[Wait 5 seconds]
+"I haven't heard from you, so I'll let you go.
+Feel free to call back if you need anything!"
+```
+
+Configure the timeout duration and the agent's response.
+
+### Max Call Duration
+
+Set a maximum call length as a safety net. Very long calls may indicate the conversation is stuck or the caller is not engaging productively.
+
+### Error Conditions
+
+What happens if something breaks — API failure, voice synthesis error, etc. Configure fallback behavior:
+
+```
+"I'm experiencing a technical issue. Let me transfer you to someone who can help."
+```
+
+---
+
+## Post-Call Actions
+
+After a call ends, you can trigger actions:
+
+**CRM Updates**
+Log the call outcome, duration, and summary to your CRM.
+
+**Follow-up Emails**
+Send confirmation emails or summaries to the caller.
+
+**Ticket Creation**
+Create support tickets for unresolved issues.
+
+**Analytics**
+Track custom metrics and conversion events.
+
+In Convo Flow agents, use **Post-Call API** nodes for these actions. In Single Prompt agents, configure them in the integrations panel.
+
+---
+
+
+**Always give a proper goodbye.** Even if the caller says "thanks, bye" quickly, have the agent say something warm before disconnecting.
+
+**Don't end too early.** Make sure your conditions don't trigger on partial confirmations. "Yeah, I think so" isn't the same as "Yes, I'm all set."
+
+**Don't end too late.** If the caller clearly wants to go, let them. Repeated "is there anything else?" after they've said goodbye is annoying.
+
+**Handle silence gracefully.** Background noise, thinking pauses, and distractions happen. Give callers a chance before assuming they're gone.
+
+**Tag dispositions accurately.** Good analytics depend on honest categorization. Don't mark failed calls as successful.
+
+
+---
+
+## Next Steps
+
+
+
+ Hand calls off to humans
+
+
+ Test your end call behavior
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/transfer-call.mdx b/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/transfer-call.mdx
new file mode 100644
index 0000000..6139b37
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuration/call-controls/transfer-call.mdx
@@ -0,0 +1,161 @@
+---
+title: "Transfer Call Configuration"
+sidebarTitle: "Transfer Call"
+description: "Configure how your agent hands calls off to human agents."
+---
+
+Sometimes AI isn't enough. Complex issues, upset customers, high-value opportunities, or regulatory requirements may need a human touch. Transfer call settings control how your agent hands conversations to people.
+
+---
+
+## When to Transfer
+
+Common transfer scenarios:
+
+**Escalation requests**
+Caller explicitly asks to speak with a person: "Let me talk to a real human."
+
+**Complex issues**
+Problems the AI can't solve: technical issues outside scope, edge cases, account-specific problems requiring manual intervention.
+
+**High-value opportunities**
+Sales conversations that need closing by a human: qualified leads, large deals, hesitant buyers who need persuasion.
+
+**Compliance requirements**
+Certain topics may legally require human handling: financial advice, medical diagnoses, legal matters.
+
+**Caller frustration**
+When a caller is upset and the AI isn't helping: "This is ridiculous, I've already explained this three times."
+
+---
+
+## Configuring Transfers
+
+### Transfer Destination
+
+Where the call goes:
+
+| Type | Format | Use Case |
+|------|--------|----------|
+| **Phone Number** | +1-555-123-4567 | Direct line to support team |
+| **SIP Address** | sip:support@company.com | VoIP system |
+| **Queue** | sales-queue | Call center routing |
+
+### Hold Experience
+
+What the caller experiences while waiting:
+
+**Hold Message**
+What the caller hears while waiting to connect:
+```
+"I'm connecting you with a specialist now.
+Please hold for just a moment."
+```
+
+**Hold Music**
+Background audio during the transfer. Keep it professional and not too long — transfers should be quick.
+
+**Estimated Wait**
+If known, tell callers how long they'll wait: "Your estimated wait time is about 2 minutes."
+
+### Whisper Message
+
+What the human agent hears *before* connecting (the caller doesn't hear this):
+
+```
+Incoming transfer from AI assistant.
+Customer: John Smith
+Account: Premium
+Issue: Billing dispute - claims overcharge of $45
+Previous attempts: AI tried to explain charges, customer not satisfied
+```
+
+Whisper messages give context so humans don't start from scratch.
+
+---
+
+## Transfer in Single Prompt Agents
+
+Configure transfer behavior in your prompt's Dos and Don'ts section:
+
+```
+When to transfer:
+- Caller explicitly requests a human agent
+- Issue involves account security changes
+- Caller mentions legal action or regulatory complaints
+- You've failed to resolve the issue after 2 attempts
+
+When transferring:
+- Apologize briefly for not being able to help directly
+- Tell them what's about to happen
+- Stay warm and professional
+```
+
+Then configure the transfer destination in the agent settings panel.
+
+---
+
+## Transfer in Convo Flow Agents
+
+Use **Transfer Call** nodes in your workflow:
+
+1. Drag a Transfer Call node onto the canvas
+2. Configure the destination, hold message, and whisper
+3. Connect branches that should lead to transfer
+
+Create branches for different transfer scenarios:
+- "User requests human" → Transfer to support
+- "User mentions legal" → Transfer to compliance
+- "High-value lead" → Transfer to sales
+
+---
+
+## Transfer Failures
+
+What happens when transfer fails — busy line, no answer, technical issue:
+
+### Fallback Options
+
+| Option | When to Use |
+|--------|-------------|
+| **Voicemail** | "I'll transfer you to voicemail so you can leave a message." |
+| **Callback** | "Our team is busy. Can we call you back within the hour?" |
+| **Alternate Number** | "Let me try another line..." |
+| **Retry** | Attempt transfer again after brief hold |
+
+### Graceful Handling
+
+```
+"I'm having trouble reaching the team right now.
+Would you prefer to leave a callback number,
+or should I try again in a moment?"
+```
+
+Never leave callers hanging. Always have a backup plan.
+
+---
+
+
+**Set expectations before transferring.** Tell callers what's happening, where they're going, and roughly how long it might take.
+
+**Use whisper messages effectively.** A well-crafted whisper saves time and prevents callers from repeating themselves.
+
+**Monitor transfer rates.** If too many calls transfer, your AI might not be configured well. Investigate why and improve the prompt.
+
+**Keep hold times short.** Long holds after "let me transfer you" frustrate callers. If your team can't answer quickly, offer callbacks.
+
+**Train your human team.** Make sure they know calls are coming from an AI agent and how to pick up the context from whisper messages.
+
+
+---
+
+## Next Steps
+
+
+
+ Configure call endings
+
+
+ Test your transfer flows
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/api-calls.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/api-calls.mdx
new file mode 100644
index 0000000..4b24165
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/api-calls.mdx
@@ -0,0 +1,158 @@
+---
+title: "API Calls"
+sidebarTitle: "API Calls"
+description: "Connect your agent to external services and data."
+---
+
+API Calls let your agent fetch and send data during conversations. Look up customer information, check order status, book appointments, create tickets — all in real-time while the conversation is happening.
+
+**Location:** Config Panel (right sidebar) → API Calls toggle
+
+---
+
+## Setup
+
+1. Toggle **API Calls** ON
+2. Click ⚙️ to open settings
+3. Click **+ Add API Call**
+
+---
+
+## Configuration
+
+The API Call modal has two main sections.
+
+### Basic Setup & API Configuration
+
+
+ 
+
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Name** | Yes | Identifier for this API call (e.g., `lookup_customer`) |
+| **Description** | Yes | Tells the AI when to trigger this call |
+| **LLM Parameters** | No | Parameters the LLM can populate dynamically |
+| **URL** | Yes | The API endpoint |
+| **Method** | Yes | GET, POST, PUT, or DELETE |
+| **Timeout (ms)** | Yes | How long to wait before failing (default: 5000) |
+
+### Headers, Parameters & Response Extraction
+
+
+ 
+
+
+| Field | Purpose |
+|-------|---------|
+| **Headers** | Request headers (Authorization, Content-Type, etc.) |
+| **Query Parameters** | URL parameters for GET requests |
+| **Response Variable Extraction** | Map response fields to variables you can use in prompts |
+
+---
+
+## LLM Parameters
+
+These are values the AI determines during conversation and passes to your API. Click **+ Add Parameter** to define what the AI should collect.
+
+For example, if you need an order ID to look up status, add a parameter called `order_id` — the AI will extract it from the conversation and include it in the request.
+
+---
+
+## Response Variable Extraction
+
+This is where the magic happens. Map fields from the API response to variables you can use in your prompts.
+
+Click **+ Add Variable** and specify:
+- The path in the JSON response (e.g., `customer.name`)
+- The variable name (e.g., `customer_name`)
+
+Then use `{{api.customer_name}}` in your prompt.
+
+---
+
+## Example: Customer Lookup
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `lookup_customer` |
+ | **Description** | "Look up customer information when the call starts" |
+ | **URL** | `https://crm.example.com/api/customers` |
+ | **Method** | GET |
+ | **Query Parameters** | `phone: {{caller_phone}}` |
+
+
+
+ | Response Path | Variable |
+ |---------------|----------|
+ | `customer.name` | `{{api.customer_name}}` |
+ | `customer.tier` | `{{api.tier}}` |
+ | `customer.last_order` | `{{api.last_order}}` |
+
+
+
+ ```
+ Hello {{api.customer_name}}! I see you're a {{api.tier}}
+ member. Your last order is {{api.last_order}}.
+ ```
+
+
+
+---
+
+## Using Variables in API Calls
+
+You can use variables anywhere in your API configuration:
+
+**In URL:**
+```
+https://api.example.com/orders/{{collected.order_id}}
+```
+
+**In Headers:**
+```
+Authorization: Bearer {{api_key}}
+```
+
+**In Query Parameters:**
+```
+phone: {{caller_phone}}
+```
+
+---
+
+## Tips
+
+
+ The description tells the AI when to make this call. Be specific:
+
+ | Vague | Specific |
+ |-------|----------|
+ | "Get customer" | "Look up customer information using their phone number when the call starts" |
+ | "Check order" | "Fetch order status when the customer provides an order number" |
+
+
+
+ APIs can fail. In your prompt, tell the agent what to do:
+
+ "If customer data isn't available, greet generically and ask for their name. Don't mention that a lookup failed."
+
+
+
+ Default is 5000ms (5 seconds). For slow APIs, increase this — but remember the caller is waiting.
+
+
+---
+
+## Related
+
+
+
+ Use API response data in prompts
+
+
+ Send data after calls complete
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/editor-overview.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/editor-overview.mdx
new file mode 100644
index 0000000..af2182b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/editor-overview.mdx
@@ -0,0 +1,173 @@
+---
+title: "The Agent Editor"
+sidebarTitle: "Editor Overview"
+description: "Your workspace for building, configuring, and testing voice agents."
+---
+
+The editor is where your agent comes to life. It's the workspace you'll return to every time you want to tweak behavior, adjust settings, or test a new approach. Understanding the layout means you'll always know exactly where to go.
+
+This page walks you through every part of the interface — what each area does, why you'd use it, and where to dive deeper.
+
+
+ 
+
+
+---
+
+## The Header
+
+At the very top, you'll find navigation and identification.
+
+
+ 
+
+
+**← Back arrow** takes you to your agents list. Use it when you're done editing or want to switch to a different agent.
+
+**Agent name** is clickable — rename your agent anytime. Pick something meaningful; you'll thank yourself when you have twenty agents.
+
+**Agent ID** is the unique identifier for API calls and integrations. Click to copy it.
+
+---
+
+## The Prompt Section
+
+This bar runs across the top and controls the fundamentals: which AI model powers your agent, what voice it speaks with, and what language it uses.
+
+
+ 
+
+
+These three choices shape the foundation of your agent's personality:
+
+- **Model** determines intelligence and capability. GPT-4o is recommended for most cases.
+- **Voice** is what callers hear. Preview voices before choosing — the right voice builds trust instantly.
+- **Language** sets the primary language for responses. Multi-language support is configured separately.
+
+→ [Model Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/model-selection) · [Voice Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/voice-selection) · [Language Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/language-selection)
+
+---
+
+## The Prompt Editor
+
+The center of the screen is where you write. This is your agent's brain — the instructions that define who it is, what it knows, and how it behaves.
+
+
+ 
+
+
+Everything flows from what you write here. A good prompt covers identity, knowledge, behavior guidelines, and end conditions. You'll refine it over time based on real conversations.
+
+→ [Writing Effective Prompts](/atoms/atoms-platform/single-prompt-agents/prompt-section/writing-prompts)
+
+---
+
+## The Configuration Panel
+
+The right sidebar holds your agent's capabilities — the tools it can use beyond just talking.
+
+
+ 
+
+
+Each toggle enables a feature:
+
+**End Call** defines when and how your agent hangs up. Without this, calls may never end gracefully.
+
+**Transfer Call** lets your agent hand off to humans — either immediately (cold) or with a briefing (warm).
+
+**Knowledge Base** connects reference documents your agent can search during conversations.
+
+**Variables** enable personalization with dynamic values — caller names, account details, collected information.
+
+**API Calls** let your agent fetch and send data mid-conversation — look up orders, check availability, create tickets.
+
+→ [End Call](/atoms/atoms-platform/single-prompt-agents/configuration-panel/end-call) · [Transfer Call](/atoms/atoms-platform/single-prompt-agents/configuration-panel/transfer-call) · [Knowledge Base](/atoms/atoms-platform/single-prompt-agents/configuration-panel/knowledge-base) · [Variables](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables) · [API Calls](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls)
+
+---
+
+## The Left Sidebar
+
+This is your navigation between different configuration areas.
+
+
+ 
+
+
+**Prompt** brings you back to the main editor (where you are now in Single Prompt agents).
+
+**Agent Settings** opens detailed configuration tabs — voice tuning, model behavior, webhooks, and timeouts. This is where fine-tuning happens.
+
+**Widget** configures the embeddable web widget if you want callers to reach your agent from your website.
+
+**Integrations** connects third-party services like Salesforce directly, without custom API work.
+
+**Post Call Metrics** defines what data gets extracted from calls automatically — satisfaction scores, outcomes, categories.
+
+→ [Voice Settings](/atoms/atoms-platform/single-prompt-agents/agent-settings/voice-settings) · [Model Settings](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings) · [Webhooks](/atoms/atoms-platform/single-prompt-agents/agent-settings/webhooks) · [General Settings](/atoms/atoms-platform/single-prompt-agents/agent-settings/general-settings) · [Widget](/atoms/atoms-platform/features/widget) · [Integrations](/atoms/atoms-platform/features/integrations) · [Post-Call Metrics](/atoms/atoms-platform/features/post-call-metrics)
+
+---
+
+## The Action Buttons
+
+Top right corner — the buttons you'll use constantly.
+
+
+ 
+
+
+**Convo Logs** shows transcripts of every conversation your agent has had. Essential for debugging and improvement.
+
+**Lock Agent** prevents accidental edits. Turn this on for production agents. You can still test locked agents.
+
+**Test Agent** is how you try your agent before deploying. Choose from phone call, web call, or text chat.
+
+→ [Testing Your Agent](/atoms/atoms-platform/analytics-logs/testing) · [Conversation Logs](/atoms/atoms-platform/analytics-logs/conversation-logs) · [Locking Agents](/atoms/atoms-platform/analytics-logs/locking)
+
+---
+
+## For Conversational Flow Agents
+
+If you're building a Conversational Flow agent instead of Single Prompt, the layout changes slightly.
+
+
+ 
+
+
+The center becomes a visual canvas where you design workflows with nodes and branches. A **Workflow/Settings toggle** at the top switches between the flow builder and configuration options.
+
+The left panel becomes a **Node Palette** for dragging conversation steps onto the canvas.
+
+Everything else — action buttons, left sidebar navigation, agent settings — works the same way.
+
+→ [Workflow Builder](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/workflow-builder)
+
+---
+
+## Quick Reference
+
+| I want to... | Where to go |
+|--------------|-------------|
+| Change the AI model | Prompt Section → Model dropdown |
+| Pick a different voice | Prompt Section → Voice dropdown |
+| Set up call endings | Config Panel → End Call |
+| Configure human handoffs | Config Panel → Transfer Call |
+| Attach reference documents | Config Panel → Knowledge Base |
+| Use dynamic values | Config Panel → Variables |
+| Connect to external APIs | Config Panel → API Calls |
+| Fine-tune speech speed | Left Sidebar → Agent Settings → Voice |
+| Enable language switching | Left Sidebar → Agent Settings → Model |
+| Set up event webhooks | Left Sidebar → Agent Settings → Webhook |
+| Configure timeouts | Left Sidebar → Agent Settings → General |
+| Embed on my website | Left Sidebar → Widget |
+| Connect CRM | Left Sidebar → Integrations |
+| Set up call analytics | Left Sidebar → Post Call Metrics |
+| View past conversations | Top Right → Convo Logs |
+| Test my agent | Top Right → Test Agent |
+| Prevent accidental edits | Top Right → Lock Agent |
+
+---
+
+## Saving Your Work
+
+Most changes save automatically as you make them. When they don't, a footer appears: **"You have unsaved changes"** with Discard and Save buttons. Always save before navigating away.
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/end-call.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/end-call.mdx
new file mode 100644
index 0000000..50c8af1
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/end-call.mdx
@@ -0,0 +1,116 @@
+---
+title: "End Call"
+sidebarTitle: "End Call"
+description: "Configure when and how your agent ends calls."
+---
+
+End Call tells your agent when to hang up. Without proper end conditions, calls may drag on awkwardly or never conclude. Define clear triggers so conversations wrap up naturally.
+
+**Location:** Config Panel (right sidebar) → End Call toggle
+
+---
+
+## Setup
+
+1. Toggle **End Call** ON
+2. Click the ⚙️ icon to open settings
+3. Click **+ Add End Call** to create a function
+
+---
+
+## Configuration
+
+
+ 
+
+
+Each end call function has two fields:
+
+| Field | Purpose | Example |
+|-------|---------|---------|
+| **Name** | Identifier (used internally) | `end_call_resolved` |
+| **Description** | Tells the AI when to trigger | "End the call when the customer confirms their issue is resolved" |
+
+The Description is critical — it's what the AI uses to decide when to end the call. Be specific.
+
+---
+
+## Common End Call Functions
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `end_resolved` |
+ | **Description** | "End the call when the customer confirms their issue is completely resolved and they have no additional questions." |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `end_goodbye` |
+ | **Description** | "End the call when the customer says goodbye, thank you, or indicates they're done." |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `end_transferred` |
+ | **Description** | "End the AI portion of the call after successfully transferring to a human agent." |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `end_no_response` |
+ | **Description** | "End the call if the caller doesn't respond after three attempts to re-engage them." |
+
+
+
+---
+
+## Tips
+
+
+ | Vague | Specific |
+ |-------|----------|
+ | "When done" | "When customer confirms satisfaction" |
+ | "If goodbye" | "When customer says goodbye, thanks, or indicates they're finished" |
+
+
+
+ Don't just handle the happy path:
+
+ - Customer explicitly asks to end
+ - Customer becomes unresponsive after 3 prompts
+ - Customer requests callback instead
+
+
+
+ If your main prompt says "end when resolved," your end call description should match that language.
+
+
+
+ Think through every way a call might conclude:
+
+ | Function | Scenario |
+ |----------|----------|
+ | `end_resolved` | Issue fixed, customer happy |
+ | `end_goodbye` | Customer says goodbye |
+ | `end_transfer` | After transferring |
+ | `end_no_response` | Caller stopped responding |
+ | `end_out_of_scope` | Can't help, directed elsewhere |
+
+
+---
+
+## Related
+
+
+
+ Hand off to human agents
+
+
+ Configure idle timeouts
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/general-settings.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/general-settings.mdx
new file mode 100644
index 0000000..b06cc36
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/general-settings.mdx
@@ -0,0 +1,40 @@
+---
+title: "General Settings"
+sidebarTitle: "General Settings"
+description: "Configure timeout behavior for idle conversations."
+---
+
+General Settings control how long your agent waits for a response before prompting the caller — and when to give up.
+
+**Location:** Left Sidebar → Agent Settings → General tab
+
+
+ 
+
+
+---
+
+## LLM Idle Timeout Settings
+
+Configure how long the agent waits for user response before sending an inactivity message. After 3 attempts with no response, the conversation automatically ends.
+
+| Setting | Default | Description |
+|---------|---------|-------------|
+| **Chat Timeout** | 60 sec | For text chat conversations |
+| **Webcall Timeout** | 20 sec | For browser-based voice calls |
+| **Telephony Timeout** | 20 sec | For phone calls |
+
+Each timeout triggers an inactivity prompt. If the user still doesn't respond after 3 prompts, the agent ends the conversation gracefully.
+
+---
+
+## Related
+
+
+
+ Speech speed and detection tuning
+
+
+ Configure call termination
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/integrations.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/integrations.mdx
new file mode 100644
index 0000000..289a90e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/integrations.mdx
@@ -0,0 +1,67 @@
+---
+title: "Integrations"
+sidebarTitle: "Integrations"
+description: "Connect your agent to third-party services."
+---
+
+Integrations let your agent connect directly to external services like CRMs and calendars — without custom API configuration. Click, authenticate, and you're connected.
+
+**Location:** Left Sidebar → Integrations
+
+---
+
+## Available Integrations
+
+| Integration | Status | Description |
+|-------------|--------|-------------|
+| **Salesforce** | Available | Sync contacts, log calls, update records |
+| **HubSpot** | Coming Soon | CRM integration |
+| **Google Calendar** | Coming Soon | Appointment scheduling |
+| **Google Sheets** | Coming Soon | Data logging and retrieval |
+
+---
+
+## Salesforce Integration
+
+### Setup
+
+1. Click **Configure** on the Salesforce card
+2. Authenticate with your Salesforce account
+3. Map fields between Atoms and Salesforce
+4. Enable the integration
+
+### What It Does
+
+| Action | When |
+|--------|------|
+| **Lookup Contact** | On call start, by phone number |
+| **Log Call** | On call end, with transcript |
+| **Update Record** | After call, with collected data |
+
+---
+
+## In Conversational Flow
+
+Integrations also appear in the node palette for Conversational Flow agents. Use them to:
+
+- Fetch CRM data mid-conversation
+- Create records at specific flow points
+- Update records based on conversation outcomes
+
+---
+
+## Coming Soon
+
+| Integration | Capability |
+|-------------|------------|
+| **HubSpot** | Full CRM sync — contacts, deals, activities |
+| **Google Calendar** | Check availability and book appointments |
+| **Google Sheets** | Log data and retrieve from spreadsheets |
+
+Contact us for enterprise integrations.
+
+---
+
+## Need Something Else?
+
+For services not listed, use [API Calls](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls) to connect to any REST API.
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/knowledge-base.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/knowledge-base.mdx
new file mode 100644
index 0000000..968af0c
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/knowledge-base.mdx
@@ -0,0 +1,65 @@
+---
+title: "Knowledge Base"
+sidebarTitle: "Knowledge Base"
+description: "Give your agent access to reference documents."
+---
+
+A Knowledge Base is a repository of information your agent can search during conversations. Instead of cramming everything into the prompt, upload documents — product specs, policies, FAQs — and let the agent retrieve what it needs.
+
+**Location:** Config Panel (right sidebar) → Knowledge Base toggle
+
+---
+
+## Setup
+
+1. Toggle **Knowledge Base** ON
+2. Select a KB from the dropdown
+
+
+You need to create a Knowledge Base first before you can attach it here. See [Creating Knowledge Bases](/atoms/atoms-platform/features/knowledge-base).
+
+
+---
+
+## Local vs Global
+
+| Type | Scope | Best For |
+|------|-------|----------|
+| **Local** | This agent only | Agent-specific information |
+| **Global** | Shared across agents | Company-wide policies, general FAQs |
+
+---
+
+## How It Works
+
+1. **Caller asks a question** → "What's your return policy?"
+2. **Agent searches KB** → Finds relevant documents automatically
+3. **Agent responds** → Uses retrieved information in the answer
+
+The agent decides when to search based on the question. You don't need to configure triggers.
+
+---
+
+## Best Practices
+
+
+ | Put in KB | Put in Prompt |
+ |-----------|---------------|
+ | Product details | Personality and tone |
+ | Policies | Conversation patterns |
+ | FAQ answers | End conditions |
+ | Pricing info | Behavioral guidelines |
+
+
+
+ Smaller, topic-specific documents retrieve better than massive catch-all files.
+
+ | Better | Worse |
+ |--------|-------|
+ | `returns-policy.pdf` | `everything.pdf` |
+ | `pricing-2024.txt` | `company-info.docx` (500 pages) |
+
+
+
+ Ask your agent questions that should hit the KB. Verify it finds the right information.
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/language-selection.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/language-selection.mdx
new file mode 100644
index 0000000..f0959f4
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/language-selection.mdx
@@ -0,0 +1,36 @@
+---
+title: "Language Selection"
+sidebarTitle: "Language Selection"
+description: "Set the primary language for your agent."
+---
+
+This sets the language your agent speaks by default. Simple as that.
+
+**Location:** Prompt Section (top bar) → Language dropdown
+
+
+The Prompt Section is only available for **Single Prompt agents**. Conversational Flow agents configure language in [Agent Settings → Model tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings).
+
+
+---
+
+## How It Works
+
+Click the dropdown, pick your language. The options you see depend on which voice you've selected — different voices support different languages. If you don't see the language you need, try a different voice first.
+
+
+**Need multi-language support?** If your agent should switch languages mid-conversation based on what the caller speaks, configure that in [Model Settings](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings).
+
+
+---
+
+## Related Settings
+
+
+
+ Pick your agent's voice
+
+
+ Language switching & fine-tuning
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/model-selection.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/model-selection.mdx
new file mode 100644
index 0000000..0e76057
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/model-selection.mdx
@@ -0,0 +1,54 @@
+---
+title: "Model Selection"
+sidebarTitle: "Model Selection"
+description: "Choose the right AI model for your agent."
+---
+
+The model is your agent's brain. It's what understands what callers say, figures out how to respond, and generates the words your agent speaks. Different models have different strengths — some are faster, some are more expressive, some are more affordable.
+
+**Location:** Prompt Section (top bar) → Model dropdown
+
+
+The Prompt Section is only available for **Single Prompt agents**. Conversational Flow agents configure models in [Agent Settings → Model tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings).
+
+
+
+ 
+
+
+---
+
+## Available Models
+
+| Model | Provider | Type | Credit Usage |
+|-------|----------|------|--------------|
+| **Electron** | Smallest AI | Traditional | Lower |
+| **GPT-4o** | OpenAI | Traditional | Moderate |
+| **GPT-4.1** | OpenAI | Traditional | Moderate |
+| **GPT Realtime** | OpenAI | Emotive | Higher |
+| **GPT Realtime Mini** | OpenAI | Emotive | Higher |
+
+**Emotive models** have emotional awareness — they pick up on caller tone and respond with natural expression.
+
+
+**Getting started?** GPT-4o is a great all-rounder — reliable, capable, and well-tested.
+
+
+
+**Try Electron.** It's our own model, built specifically for voice. Fast, affordable, and optimized for real-time conversations.
+
+
+You can switch models anytime — nothing breaks when you do.
+
+---
+
+## Related Settings
+
+
+
+ Pick your agent's voice
+
+
+ Language switching & fine-tuning
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/model-settings.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/model-settings.mdx
new file mode 100644
index 0000000..b3157de
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/model-settings.mdx
@@ -0,0 +1,124 @@
+---
+title: "Model Settings"
+sidebarTitle: "Model Settings"
+description: "Configure AI model, language, and speech behavior."
+---
+
+Model Settings control how the AI behaves — the model powering responses, language handling, and formatting preferences. The options vary slightly depending on your agent type.
+
+**Location:** Left Sidebar → Agent Settings → Model tab
+
+---
+
+## What's Different by Agent Type
+
+
+
+
+ 
+
+
+ Single Prompt agents have:
+ - AI Model (LLM Model + Language)
+ - Speech Formatting
+ - Language Switching
+
+ The prompt itself lives in the Prompt Section (top of editor).
+
+
+
+
+ 
+
+
+ Conversational Flow agents have everything above, plus:
+ - **Global Prompt** — Set personality and behavior instructions
+ - **Knowledge Base** — Connect reference material
+
+
+
+---
+
+## AI Model
+
+Choose the LLM powering your agent and its primary language.
+
+| Setting | Description |
+|---------|-------------|
+| **LLM Model** | The AI model (Electron, GPT-4o, etc.) |
+| **Language** | Primary language for responses |
+
+For Single Prompt agents, you can also set the model in the [Prompt Section](/atoms/atoms-platform/single-prompt-agents/prompt-section/model-selection) dropdown.
+
+---
+
+## Speech Formatting
+
+When enabled (default: ON), Speech Formatting automatically applies additional formatting to transcripts to improve readability — including punctuation, paragraphs, and entity formatting like dates, times, and numbers.
+
+---
+
+## Language Switching
+
+Enable your agent to switch languages mid-conversation based on what the caller speaks (default: ON).
+
+### Advanced Settings
+
+When Language Switching is enabled, you can fine-tune how the agent detects language changes:
+
+| Setting | Range | Default | What it does |
+|---------|-------|---------|--------------|
+| **Minimum Words for Detection** | 1-10 | 2 | How many words before considering a language switch |
+| **Strong Signal Threshold** | 0-1 | 0.7 | Confidence level for immediate switch |
+| **Weak Signal Threshold** | 0-1 | 0.3 | Confidence level for tentative detection |
+| **Consecutive Weak Signals** | 1-8 | 2 | How many weak signals needed to switch |
+
+**Understanding the thresholds:**
+
+- **Strong Signal:** The AI is very confident the caller switched languages → switches immediately.
+- **Weak Signal:** The AI is somewhat confident → waits for more evidence.
+- **Higher thresholds** = More certain before switching (reduces false switches)
+- **Lower thresholds** = Quicker to switch (more responsive, but may false-trigger)
+
+For most cases, the defaults work well. Adjust only if you're seeing unwanted switching behavior.
+
+---
+
+## Global Prompt (Conversational Flow Only)
+
+Set global instructions for your agent's personality and behavior. This applies across all nodes in your flow (limit: 4,000 characters).
+
+Use this to define:
+- Personality traits ("friendly and professional")
+- Behavioral guidelines ("always confirm before transferring")
+- Consistent phrasing or style
+- Company-specific instructions
+
+
+This is only available for Conversational Flow agents. Single Prompt agents define everything in their [main prompt](/atoms/atoms-platform/single-prompt-agents/prompt-section/writing-prompts).
+
+
+---
+
+## Knowledge Base (Conversational Flow Only)
+
+Connect a knowledge base to enhance your agent's responses with reference material.
+
+Click the dropdown to select from your existing knowledge bases, or leave as "No Knowledge Base" if not needed.
+
+
+Single Prompt agents connect knowledge bases via the [Configuration Panel](/atoms/atoms-platform/single-prompt-agents/configuration-panel/knowledge-base) instead.
+
+
+---
+
+## Related
+
+
+
+ Speech speed, pronunciation, and detection
+
+
+ Craft effective agent instructions
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/phone-number.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/phone-number.mdx
new file mode 100644
index 0000000..b496f11
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/phone-number.mdx
@@ -0,0 +1,38 @@
+---
+title: "Phone Number"
+sidebarTitle: "Phone Number"
+description: "Assign a phone number to your agent."
+---
+
+The Phone Number tab lets you connect your agent to a phone number for inbound and outbound calls. Once assigned, callers to that number will reach this agent.
+
+**Location:** Left Sidebar → Agent Settings → Phone Number tab
+
+
+ 
+
+
+---
+
+## Select Phone Numbers
+
+Click the dropdown to choose from your available phone numbers. If you haven't set up any numbers yet, you'll see "No phone numbers selected."
+
+You can assign multiple numbers to the same agent if needed.
+
+
+You need to purchase or configure phone numbers before they appear here. See [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers) to get started.
+
+
+---
+
+## Related
+
+
+
+ Get and manage phone numbers
+
+
+ Set up outbound calling
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/post-call-metrics.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/post-call-metrics.mdx
new file mode 100644
index 0000000..1e2d744
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/post-call-metrics.mdx
@@ -0,0 +1,161 @@
+---
+title: "Post-Call Metrics"
+sidebarTitle: "Post-Call Metrics"
+description: "Extract structured data from every conversation automatically."
+---
+
+Post-call metrics let you pull specific insights from conversations after they end. Define what you want to know — satisfaction scores, call outcomes, issue categories — and Atoms analyzes each call to fill in the answers.
+
+**Location:** Left Sidebar → Post Call Metrics
+
+
+ 
+
+
+---
+
+## How It Works
+
+1. **You define metrics** — What questions do you want answered about each call?
+2. **Call ends** — Conversation completes normally
+3. **AI analyzes** — Atoms reviews the transcript against your metrics
+4. **Data populated** — Your metrics get filled in automatically
+5. **Access anywhere** — View in logs, receive via webhook, export
+
+---
+
+## Creating a New Metric
+
+Click the **Add Metrics +** button to open the configuration panel. You'll see two options:
+
+
+
+
+ 
+
+
+ Build a custom metric from scratch. Fill in the Identifier, Data Type, and Prompt — see details below.
+
+ Use **Add Another +** to create multiple metrics at once.
+
+
+ Don't forget to hit **Save** in the Disposition tab once you're done.
+
+
+
+
+
+ 
+
+
+ Choose from pre-built metrics for common use cases. Just select the ones you want — no manual configuration needed.
+
+
+ Don't forget to hit **Save** in the Disposition tab once you're done.
+
+
+
+
+---
+
+## Configuring a Metric
+
+Each metric needs three things:
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Identifier** | Yes | Unique name for this metric. Lowercase, numbers, underscores only. |
+| **Data Type** | Yes | What kind of value: String, Number, or Boolean |
+| **Prompt** | Yes | The question you want answered about the call |
+
+### Identifier
+
+This is the key used to reference the metric in exports, webhooks, and the API.
+
+```
+customer_satisfaction
+call_outcome
+follow_up_needed
+```
+
+
+**Naming rules:** Lowercase letters, numbers, and underscores only. No spaces or special characters.
+
+
+### Data Type
+
+| Type | Use for | Example values |
+|------|---------|----------------|
+| **String** | Free text, categories | "resolved", "escalated", "billing issue" |
+| **Boolean** | Yes/no questions | true, false |
+| **Integer** | Whole numbers, scores | 1, 5, 10 |
+| **Enum** | Fixed set of options | One of: "low", "medium", "high" |
+| **Datetime** | Dates and times | "2024-01-15T10:30:00Z" |
+
+### Prompt
+
+This is the question the AI answers by analyzing the transcript. Be specific.
+
+**Good prompts:**
+- "Did the agent acknowledge and respond to customer concerns effectively?"
+- "Rate customer satisfaction from 1 to 5 based on tone and words used."
+- "What was the primary reason for this call? Options: billing, technical, account, other"
+
+**Vague prompts to avoid:**
+- "Was it good?"
+- "Customer happy?"
+
+
+**Start with 3-5 metrics.** Too many can slow analysis and clutter your data. Add more as you learn what insights matter most.
+
+
+---
+
+## Example Metrics
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Identifier** | `call_outcome` |
+ | **Data Type** | String |
+ | **Prompt** | "What was the outcome of this call? Options: resolved, escalated, transferred, abandoned, callback_scheduled" |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Identifier** | `satisfaction_score` |
+ | **Data Type** | Integer |
+ | **Prompt** | "Rate the customer's apparent satisfaction from 1 to 5, based on their tone and language throughout the call." |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Identifier** | `follow_up_needed` |
+ | **Data Type** | Boolean |
+ | **Prompt** | "Does this call require any follow-up action from the team?" |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Identifier** | `issue_category` |
+ | **Data Type** | Enum |
+ | **Prompt** | "What was the primary issue category? Options: billing, technical, account, product_info, complaint, other" |
+
+
+
+---
+
+## Related
+
+
+
+ View metrics for individual calls
+
+
+ See aggregated trends across calls
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/transfer-call.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/transfer-call.mdx
new file mode 100644
index 0000000..b8e06ed
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/transfer-call.mdx
@@ -0,0 +1,164 @@
+---
+title: "Transfer Call"
+sidebarTitle: "Transfer Call"
+description: "Configure call transfers to human agents."
+---
+
+Transfer Call lets your agent hand off conversations to humans when needed. You can do a cold transfer (immediate connection) or a warm transfer (AI briefs the human first).
+
+**Location:** Config Panel (right sidebar) → Transfer Call toggle
+
+---
+
+## Setup
+
+1. Toggle **Transfer Call** ON
+2. Click ⚙️ to open settings
+3. Click **+ Add Transfer Call**
+
+---
+
+## Configuration
+
+
+ 
+
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Name** | Yes | Identifier (e.g., `transfer_to_sales`) |
+| **Description** | Yes | When to trigger this transfer |
+| **Transfer Number** | Yes | Destination with country code |
+| **Type** | Yes | Cold or Warm |
+
+---
+
+## Transfer Types
+
+
+
+ Immediate handoff. The caller connects directly to the destination without any briefing.
+
+ | Pros | Cons |
+ |------|------|
+ | Fast | No context for receiving agent |
+ | Simple | Caller may repeat themselves |
+
+ **Best for:** Simple escalations, high call volume, when speed matters most.
+
+
+
+ AI briefs the human first. The receiving agent gets context before the caller joins.
+
+ | Pros | Cons |
+ |------|------|
+ | Human has context | Slightly longer |
+ | Better experience | More configuration |
+
+ **Best for:** Complex issues, VIP callers, when continuity matters.
+
+
+
+---
+
+## Warm Transfer Options
+
+When you select Warm Transfer, additional settings appear:
+
+
+ 
+
+
+### During Transfer
+
+| Setting | Purpose |
+|---------|---------|
+| **On-hold Music** | What the caller hears while waiting |
+
+### During Agent Connection
+
+| Setting | Description |
+|---------|-------------|
+| **Whisper Message** | Message the agent hears privately before connecting |
+| **Handoff Message** | What the AI says to brief the agent (can be dynamic or static) |
+
+### After Connection
+
+| Setting | Description |
+|---------|-------------|
+| **Three-way Message** | Message both parties hear when connected |
+
+---
+
+## Examples
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_sales` |
+ | **Description** | "Transfer when the caller expresses strong purchase intent and wants to speak with sales." |
+ | **Type** | Cold |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_support` |
+ | **Description** | "Transfer when the issue requires manual intervention or the caller requests a human." |
+ | **Type** | Warm |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_manager` |
+ | **Description** | "Transfer when the caller is upset and asks for a manager or supervisor." |
+ | **Type** | Warm |
+
+
+
+---
+
+## Tips
+
+
+ | Vague | Specific |
+ |-------|----------|
+ | "When they ask for help" | "When the caller requests to speak with a human or the issue requires manual intervention" |
+ | "For sales" | "When the caller expresses strong purchase intent and wants to proceed" |
+
+
+
+ Only the agent hears this — give them everything they need:
+
+ "Incoming transfer: Customer John calling about a billing dispute. He's been charged twice for order #12345. Already verified his identity."
+
+
+
+ Both parties hear this — use it for smooth handoffs:
+
+ "I've connected you with Sarah from our billing team. Sarah, John is calling about a duplicate charge on order #12345."
+
+
+
+ | Transfer | Destination | When |
+ |----------|-------------|------|
+ | `transfer_sales` | Sales team | Purchase interest |
+ | `transfer_support` | Support team | Technical issues |
+ | `transfer_billing` | Billing team | Payment questions |
+ | `transfer_manager` | Manager | Escalations |
+
+
+---
+
+## Related
+
+
+
+ Configure call termination
+
+
+ Get notified on transfers
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/variables.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/variables.mdx
new file mode 100644
index 0000000..df3bb40
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/variables.mdx
@@ -0,0 +1,154 @@
+---
+title: "Variables"
+sidebarTitle: "Variables"
+description: "Use dynamic values in your prompts and conversations."
+---
+
+Variables let you personalize conversations with dynamic data. Instead of static text, insert values that change based on the caller, API responses, or information collected during the call.
+
+**Location:** Config Panel (right sidebar) → Variables
+
+---
+
+## Variable Types
+
+
+
+
+ 
+
+
+ Variables you create with default values.
+
+ | Example | Use Case |
+ |---------|----------|
+ | `{{company_name}}` | Your company name |
+ | `{{support_hours}}` | Operating hours |
+ | `{{promo_code}}` | Current promotion |
+
+
+
+
+ 
+
+
+ Predefined variables provided by the platform. They are generated at runtime, read-only, and always available.
+
+ | Variable | Description |
+ |----------|-------------|
+ | `{{caller_phone}}` | Caller's phone number |
+ | `{{call_time}}` | When call started |
+ | `{{call_duration}}` | Elapsed seconds |
+ | `{{call_direction}}` | "inbound" or "outbound" |
+ | `{{agent_id}}` | This agent's ID |
+ | `{{call_id}}` | Unique call identifier |
+
+
+
+
+ 
+
+
+ Variables populated from API responses.
+
+ | Syntax | Source |
+ |--------|--------|
+ | `{{api.customer_name}}` | API response field |
+ | `{{api.account_tier}}` | API response field |
+
+ → See [API Calls](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls)
+
+
+
+---
+
+## Syntax
+
+Use double curly braces:
+
+```
+{{variable_name}}
+```
+
+---
+
+## Example
+
+**In your prompt:**
+
+```
+Hello {{customer_name}}! Thanks for calling {{company_name}}.
+
+I see you're a {{api.tier}} member. Your last order was
+{{api.last_order_status}}.
+
+How can I help you today?
+```
+
+**At runtime:**
+
+```
+Hello Sarah! Thanks for calling Acme Corp.
+
+I see you're a Premium member. Your last order was
+shipped on Monday.
+
+How can I help you today?
+```
+
+---
+
+## Default Values
+
+Handle missing variables gracefully:
+
+```
+Hello {{customer_name|there}}!
+```
+
+If `customer_name` is empty → "Hello there!"
+
+---
+
+## Creating User Variables
+
+1. Open the Variables panel
+2. Go to **User Defined** tab
+3. Click **+ Add Variable**
+4. Enter name and default value
+5. Use in prompts with `{{name}}` syntax
+
+---
+
+## Best Practices
+
+
+ | Good | Bad |
+ |------|-----|
+ | `{{customer_first_name}}` | `{{n}}` |
+ | `{{appointment_date}}` | `{{d1}}` |
+
+
+
+ What if the variable is empty?
+
+ - Use default values: `{{name|there}}`
+ - Handle in prompt: "If customer name is unknown, greet generically"
+
+
+
+ Verify variables replace correctly. Check Convo Logs to see actual values.
+
+
+---
+
+## Related
+
+
+
+ Fetch data from external APIs
+
+
+ Use variables in your prompts
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/voice-selection.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/voice-selection.mdx
new file mode 100644
index 0000000..193bbbe
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/voice-selection.mdx
@@ -0,0 +1,49 @@
+---
+title: "Voice Selection"
+sidebarTitle: "Voice Selection"
+description: "Choose and preview voices for your agent."
+---
+
+Your agent's voice is often the first thing callers notice. It sets the tone before a single word of your prompt matters. A voice that fits your brand builds immediate trust — one that doesn't can undermine even the best conversation design.
+
+**Location:** Prompt Section (top bar) → Voice dropdown
+
+
+The Prompt Section is only available for **Single Prompt agents**. Conversational Flow agents configure voices in [Agent Settings → Voice tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/voice-settings).
+
+
+
+ 
+
+
+---
+
+## Finding the Right Voice
+
+Click the Voice dropdown to open the picker. You'll see:
+
+| Section | What it does |
+|---------|--------------|
+| **Search** | Find voices by name or characteristic |
+| **Filters** | Narrow by language, accent, age, gender, or model type |
+| **Currently Used** | Your selected voice at the top |
+| **All Voices** | The full library to browse |
+
+Take your time here. Filter by the language you need, then explore. Every voice has a personality — some are warm and reassuring, others confident and direct.
+
+
+**Always preview.** Click the ▶️ button next to any voice to hear a sample. Listen with your prompt in mind — does this voice sound like the agent you've written?
+
+
+---
+
+## Related Settings
+
+
+
+ Speed, pronunciation & turn-taking
+
+
+ Set the primary language
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/voice-settings.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/voice-settings.mdx
new file mode 100644
index 0000000..3092f6d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/voice-settings.mdx
@@ -0,0 +1,166 @@
+---
+title: "Voice Settings"
+sidebarTitle: "Voice Settings"
+description: "Fine-tune speech behavior, pronunciation, and voice detection."
+---
+
+Voice Settings give you precise control over how your agent sounds and listens. From speech speed to background ambiance, pronunciation rules to turn-taking — this is where you shape the audio experience.
+
+**Location:** Left Sidebar → Agent Settings → Voice tab
+
+
+ 
+
+
+---
+
+## Voice
+
+Select the voice for your agent. Click the dropdown to browse available voices — you can preview each one before selecting.
+
+---
+
+## Speech Settings
+
+### Speech Speed
+
+Control how fast your agent speaks.
+
+| Control | Range | Default |
+|---------|-------|---------|
+| Slider | Slow ↔ Fast | 1 |
+
+Slide left for a more measured, deliberate pace. Slide right for quicker delivery. Find the sweet spot that matches your use case — slower often works better for complex information, faster for simple confirmations.
+
+---
+
+## Pronunciation & Background
+
+### Pronunciation Dictionaries
+
+Add custom pronunciations for words that aren't pronounced correctly by the default voice.
+
+This is especially useful for:
+- Brand names
+- Technical terms
+- Proper nouns
+- Industry-specific jargon
+
+**To add a pronunciation:** Click **Add Pronunciation** to open the modal.
+
+
+ 
+
+
+| Field | Description |
+|-------|-------------|
+| **Word** | The word as written |
+| **Pronunciation** | How it should sound |
+
+### Background Sound
+
+Add ambient audio behind your agent's voice for a more natural feel.
+
+| Option | Description |
+|--------|-------------|
+| **None** | Silent background (default) |
+| **Office** | Subtle office ambiance |
+| **Call Center** | Busy call center sounds |
+| **Static** | Light static noise |
+| **Cafe** | Coffee shop atmosphere |
+
+---
+
+## Advanced Voice Settings
+
+### Mute User Until First Bot Response
+
+When enabled, the user's audio is muted until the agent's first response is complete. Useful for preventing early interruptions during the greeting.
+
+### Voicemail Detection
+
+Detects when a call goes to voicemail instead of reaching a live person.
+
+
+Voicemail detection may not work as expected if **Release Time** is less than 0.6 seconds.
+
+
+### Personal Info Redaction (PII)
+
+Automatically redacts sensitive personal information from transcripts and logs.
+
+### Denoising
+
+Filters out background noise and improves voice clarity before processing. This helps reduce false detections caused by environmental sounds — useful when callers are in noisy environments.
+
+---
+
+## Voice Detection
+
+Fine-tune how your agent recognizes when someone is speaking.
+
+### Confidence
+
+Defines how strict the system is when deciding if detected sound is speech.
+
+- **Higher values** → Less likely to trigger on background noise
+- **Lower values** → More sensitive to quiet speech
+
+| Default | Range |
+|---------|-------|
+| 0.70 | 0 – 1 |
+
+### Min Volume
+
+The minimum volume level required to register as speech.
+
+| Default | Range |
+|---------|-------|
+| 0.60 | 0 – 1 |
+
+### Trigger Time (Seconds)
+
+How long the system waits after detecting the start of user speech (and after the bot has finished speaking) before processing. This helps avoid overlapping speech and false triggers.
+
+| Default | Range |
+|---------|-------|
+| 0.10 | 0 – 1 |
+
+### Release Time (Seconds)
+
+How long the system waits after the user stops speaking before the bot begins its response. This ensures the user has completely finished their thought.
+
+| Default | Range |
+|---------|-------|
+| 0.30 | 0 – 1+ |
+
+
+**Start with defaults.** Only adjust these if you're experiencing specific issues like missed words or premature responses.
+
+
+---
+
+## Smart Turn Detection
+
+Intelligent detection of when the caller is done speaking. When enabled, the agent uses context and speech patterns — not just silence — to determine when it's time to respond.
+
+---
+
+## Interruption Backoff Timer
+
+Time in seconds to prevent interruptions after the bot starts speaking (default: 0, disabled).
+
+This helps prevent conversation loops when the user and bot interrupt each other — the agent will wait this duration before allowing itself to be interrupted again.
+
+---
+
+## Related
+
+
+
+ Configure AI model and language behavior
+
+
+ Choose and preview voices
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/webhooks.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/webhooks.mdx
new file mode 100644
index 0000000..0530215
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/webhooks.mdx
@@ -0,0 +1,107 @@
+---
+title: "Webhooks"
+sidebarTitle: "Webhooks"
+description: "Send real-time event notifications to external systems."
+---
+
+Webhooks push data to your systems when events happen — call starts, call ends, analytics ready. Use them to trigger workflows, update CRMs, create tickets, or feed data pipelines.
+
+**Location:** Left Sidebar → Agent Settings → Webhook tab
+
+---
+
+## How It Works
+
+1. **Event occurs** (call starts, call ends, etc.)
+2. **Atoms sends HTTP POST** to your endpoint with event data
+3. **Your server processes** the data and takes action
+
+---
+
+## Configuration
+
+### Select Endpoint
+
+Choose from your configured webhook endpoints.
+
+
+**Create endpoints first.** Go to Features → Webhooks to set up endpoints before you can select them here.
+
+
+### Subscribe to Events
+
+| Event | When It Fires | What's Included |
+|-------|---------------|-----------------|
+| **Start** | Call begins | Caller info, agent info, timestamp |
+| **End** | Call ends | Full transcript, duration, outcome |
+| **Analytics Completed** | Post-call analysis done | Metrics, scores, extracted data |
+
+---
+
+## Event Payloads
+
+
+
+ ```json
+ {
+ "event": "call.start",
+ "call_id": "abc123",
+ "agent_id": "agent_xyz",
+ "caller_phone": "+15551234567",
+ "direction": "inbound",
+ "timestamp": "2024-01-15T10:30:00Z"
+ }
+ ```
+
+
+
+ ```json
+ {
+ "event": "call.end",
+ "call_id": "abc123",
+ "agent_id": "agent_xyz",
+ "duration_seconds": 180,
+ "transcript": [...],
+ "outcome": "resolved",
+ "timestamp": "2024-01-15T10:33:00Z"
+ }
+ ```
+
+
+
+ ```json
+ {
+ "event": "analytics.completed",
+ "call_id": "abc123",
+ "metrics": {
+ "sentiment": "positive",
+ "resolution": true,
+ "customer_satisfaction": 4.5
+ },
+ "timestamp": "2024-01-15T10:35:00Z"
+ }
+ ```
+
+
+
+---
+
+## Use Cases
+
+| Use Case | Description |
+|----------|-------------|
+| **CRM Updates** | Push call data to Salesforce, HubSpot |
+| **Ticket Creation** | Auto-create support tickets after calls |
+| **Notifications** | Alert teams about important calls |
+| **Analytics Pipelines** | Feed data to your analytics systems |
+
+---
+
+## Setup Steps
+
+1. Create an endpoint in **Features → Webhooks**
+2. Return here and select your endpoint
+3. Check the events you want to receive
+4. Save
+
+→ See [Creating Webhook Endpoints](/atoms/atoms-platform/features/webhooks) for endpoint setup.
diff --git a/fern/products/atoms/pages/platform/building-agents/configuring/widget.mdx b/fern/products/atoms/pages/platform/building-agents/configuring/widget.mdx
new file mode 100644
index 0000000..44b675e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/configuring/widget.mdx
@@ -0,0 +1,174 @@
+---
+title: "Widget"
+sidebarTitle: "Widget"
+description: "Embed your voice agent directly on your website."
+---
+
+The widget lets visitors talk to your agent without leaving your site — no phone call needed. They can either text or speak, right from their browser.
+
+**Location:** Left Sidebar → Widget
+
+
+ 
+
+
+---
+
+## Embed Code
+
+At the top, you'll find your embed snippet. Copy this and paste it into your website's HTML.
+
+```html
+
+
+```
+
+That's it — the widget will appear on your site. Everything else on this page customizes how it looks and behaves.
+
+---
+
+## Mode
+
+Choose how users interact with your widget:
+
+| Mode | Description |
+|------|-------------|
+| **Chat** | Users type messages. Good for quieter environments or when voice isn't practical. |
+| **Voice** | Users speak directly. The full voice agent experience in the browser. |
+
+Pick based on your audience. Voice feels more natural for most support scenarios. Chat works better for quick questions or when users might be in public.
+
+---
+
+## Allowlist
+
+By default, any website can embed your widget. That's convenient for testing, but risky for production.
+
+
+**Set up an allowlist** before going live. Without one, anyone could embed your agent on their site, potentially running up your usage or misrepresenting your brand.
+
+
+Click **+ Add host** to specify which domains can use your widget:
+
+```
+yourdomain.com
+app.yourdomain.com
+```
+
+Only these sites will be able to load the widget.
+
+---
+
+## Appearance
+
+### Variant
+
+How much screen space should the widget take?
+
+
+
+
+ 
+
+
+ Minimal footprint. Just a small button that expands when clicked. Best when you want the widget available but unobtrusive.
+
+
+
+
+ 
+
+
+ Balanced size. Visible enough to invite interaction, but doesn't dominate the page. Good default for most sites.
+
+
+
+
+ 
+
+
+ Prominent and hard to miss. Use when the widget is a primary way users should interact with your site.
+
+
+
+### Placement
+
+Where the widget button appears on screen. Currently supports **Bottom-right**.
+
+
+The preview on this page always shows bottom-right. The placement you choose applies when embedded on your actual site.
+
+
+---
+
+## Theme
+
+Make the widget match your brand.
+
+| Setting | What it affects | Default |
+|---------|-----------------|---------|
+| **Widget Background Color** | Main widget background | `#ffffff` |
+| **Brand Accent Color** | Buttons, highlights | `#2d9d9f` |
+| **Agent Message Background** | Agent response bubbles | `#f3f4f6` |
+| **Text on Accent Color** | Text on accent-colored elements | `#FFFFFF` |
+| **Primary Text Color** | Main text | `#111827` |
+| **Secondary Text Color** | Subtitles, hints | `#6b7280` |
+
+Click any color to open a picker, or paste a hex code directly.
+
+---
+
+## Avatar
+
+Upload an image to represent your agent in the widget. This appears in the chat interface and helps humanize the experience.
+
+| Spec | Value |
+|------|-------|
+| **Recommended size** | 172px × 172px |
+| **Maximum file size** | 2MB |
+| **Format** | PNG, JPG |
+
+Drag and drop or click to upload.
+
+---
+
+## Text Contents
+
+Customize the copy users see.
+
+| Field | What it controls | Default |
+|-------|------------------|---------|
+| **Start Button Text** | Button to begin conversation | "Start" |
+| **End Button Text** | Button to end conversation | "End" |
+| **Chat Placeholder** | Input field placeholder | "Type your message..." |
+| **CTA Name** (optional) | Call-to-action text on widget button | "Talk to Atoms" |
+| **Widget Name** (optional) | Name displayed in widget header | "Atoms" |
+
+Make these match your brand voice. "Chat with us" feels different than "Get help" or "Ask a question."
+
+---
+
+## Terms & Conditions
+
+If you need users to agree to terms before using the widget, enable **Require consent**.
+
+When enabled, users see a checkbox they must tick before starting. This is useful for:
+- GDPR compliance
+- Recording consent
+- Specific terms of service
+
+---
+
+## Preview
+
+As you make changes, the widget preview updates in real-time in the bottom-right corner of the page. Test different settings before deploying.
+
+---
+
+## Deploying
+
+Once configured, copy the embed code and add it to your website. For detailed installation instructions across different platforms:
+
+
+ Step-by-step deployment guide
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/ai-assisted.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/ai-assisted.mdx
new file mode 100644
index 0000000..f9b87ea
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/ai-assisted.mdx
@@ -0,0 +1,89 @@
+---
+title: "AI-Assisted Creation"
+sidebarTitle: "AI-Assisted"
+description: "Let AI design your Conversational Flow workflow."
+---
+
+Describing your ideal conversation is easier than building it node by node. Let AI generate the flow, then refine it to perfection.
+
+
+ [IMAGE: Create with AI interface with Conversational Flow selected]
+
+
+---
+
+## How It Works
+
+
+
+ Fill in four prompts explaining what your agent should do.
+
+
+ Choose voice, model, and optional knowledge base.
+
+
+ AI designs your complete flow with nodes, branches, and prompts.
+
+
+ The workflow builder opens with your generated flow.
+
+
+
+
+ [IMAGE: Workflow builder showing AI-generated flow with multiple nodes and branches]
+
+
+---
+
+## Conversational Flow AI Tips
+
+When using Create with AI for Conversational Flow agents:
+
+
+ The clearer your steps, the better the generated flow.
+
+ **Example:** "First verify the caller's identity with their phone number. Then ask why they're calling. If it's a billing issue, collect the invoice number. If it's technical support, ask what product they're using."
+
+
+
+ Tell the AI when conversations should split into different paths.
+
+ **Example:** "If the budget is over $10,000, transfer to a senior sales rep. If under $10,000, send them to self-serve resources."
+
+
+
+ Describe how each path should conclude.
+
+ **Example:** "Qualified leads should be transferred to sales. Unqualified leads should receive a follow-up email. Support issues should end with a ticket confirmation."
+
+
+
+ List what information must be gathered.
+
+ **Example:** "Must collect: name, company, budget range, timeline, and current solution before qualifying."
+
+
+---
+
+## Learn More
+
+The complete Create with AI guide covers everything:
+
+
+ Full guide to AI-assisted creation
+
+
+---
+
+## After Generation
+
+Once AI generates your flow, it opens in the workflow builder. From there:
+
+
+
+ Adjust nodes and branches
+
+
+ Understand what each node does
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/conditions.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/conditions.mdx
new file mode 100644
index 0000000..df48f15
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/conditions.mdx
@@ -0,0 +1,382 @@
+---
+title: "Conditions & Branching"
+sidebarTitle: "Conditions & Branching"
+description: "Create dynamic conversation paths based on caller responses."
+---
+
+Branching is what makes Conversational Flow powerful. Instead of a linear script, your agent can take different paths based on what callers say.
+
+
+ [IMAGE: Workflow showing one node splitting into three different paths]
+
+
+---
+
+## How Branching Works
+
+
+ [IMAGE: Diagram showing caller response → condition evaluation → path selection]
+
+
+
+
+ The current node poses a question or presents options.
+
+
+ The caller says something.
+
+
+ The AI checks each condition against the response.
+
+
+ The matching condition determines the next node.
+
+
+
+---
+
+## Condition Types
+
+
+
+
+ [IMAGE: Condition panel with text match fields]
+
+
+ Match specific words or phrases in the caller's response.
+
+ | Condition | Matches |
+ |-----------|---------|
+ | "yes" | "yes", "yeah", "yep" |
+ | "billing" | "I have a billing question" |
+ | "cancel" | "I want to cancel" |
+
+
+ The AI is smart about variations — "yes", "yeah", "sure", "absolutely" can all match a "yes" condition.
+
+
+
+
+
+ [IMAGE: Condition panel with intent selection]
+
+
+ Match the caller's intent, not exact words.
+
+ | Intent | Example Phrases |
+ |--------|-----------------|
+ | `wants_support` | "I need help", "something's broken" |
+ | `wants_sales` | "I'm interested in buying" |
+ | `is_frustrated` | "This is ridiculous", angry tone |
+
+
+ Intent detection uses AI understanding — callers don't need to say magic words.
+
+
+
+
+
+ [IMAGE: Condition panel with variable comparison]
+
+
+ Route based on variable values.
+
+ | Condition | Logic |
+ |-----------|-------|
+ | `{{budget}} > 10000` | High-value path |
+ | `{{api.tier}} == "premium"` | VIP treatment |
+ | `{{attempts}} >= 3` | Escalation path |
+
+ **Operators:**
+ - `==` equals
+ - `!=` not equals
+ - `>` greater than
+ - `<` less than
+ - `>=` greater or equal
+ - `<=` less or equal
+
+
+
+
+ [IMAGE: Condition panel with default/else option]
+
+
+ Catch-all for when no other condition matches.
+
+ **Always include a default branch.** It handles:
+ - Unexpected responses
+ - Unclear answers
+ - Edge cases you didn't anticipate
+
+ ```
+ "I didn't quite catch that. Could you tell me again —
+ are you calling about billing or technical support?"
+ ```
+
+
+
+---
+
+## Creating Branches
+
+
+
+ Open the node you want to branch from.
+
+
+ [IMAGE: Node clicked with configuration panel opening]
+
+
+
+
+ Find the Branches section and click **Add Branch**.
+
+
+ [IMAGE: Branch section with Add Branch button]
+
+
+
+
+ Set the condition type and value.
+
+
+ [IMAGE: Form showing condition type dropdown and value input]
+
+
+ | Field | What to Enter |
+ |-------|---------------|
+ | **Label** | Name shown on canvas |
+ | **Type** | Text match, intent, variable, default |
+ | **Value** | What to match |
+
+
+
+ Draw connections from each branch to its destination.
+
+
+ [IMAGE: Three branch lines going to three different nodes]
+
+
+
+
+---
+
+## Real-World Examples
+
+### Support Routing
+
+
+ [IMAGE: "How can I help?" node with branches to Billing, Technical, General, Fallback]
+
+
+```
+[Ask Issue Type]
+"I'm here to help! Are you calling about billing,
+technical support, or something else?"
+
+Branches:
+├── "billing" → [Billing Flow]
+├── "technical" / "tech" / "support" → [Technical Flow]
+├── "sales" / "buy" / "purchase" → [Sales Flow]
+└── default → [Clarify and Re-ask]
+```
+
+### Lead Qualification
+
+
+ [IMAGE: Budget question with branches based on value ranges]
+
+
+```
+[Ask Budget]
+"What's your approximate budget for this project?"
+
+→ Store response as {{budget}}
+
+Branches:
+├── {{budget}} >= 50000 → [Enterprise Path]
+├── {{budget}} >= 10000 → [Professional Path]
+├── {{budget}} >= 1000 → [Starter Path]
+└── {{budget}} < 1000 → [Self-Serve Resources]
+```
+
+### Confirmation Flow
+
+
+ [IMAGE: "Is that correct?" node with Yes/No/Unclear branches]
+
+
+```
+[Confirm Details]
+"Just to confirm — you'd like to book a consultation
+for Tuesday at 3pm. Is that correct?"
+
+Branches:
+├── yes / correct / "that's right" → [Complete Booking]
+├── no / "not quite" / wrong → [Correct Details]
+└── default → [Re-confirm]
+```
+
+---
+
+## Best Practices
+
+
+ No matter how many conditions you define, something unexpected will happen.
+
+
+ [IMAGE: Branches with default path highlighted]
+
+
+ Your fallback should:
+ - Acknowledge the response
+ - Re-ask the question differently
+ - Offer options to clarify
+
+ ```
+ "I want to make sure I understand. Are you calling about
+ billing, technical issues, or something else entirely?"
+ ```
+
+
+
+ Avoid overlapping conditions that could both match.
+
+ | Overlapping (Bad) | Exclusive (Good) |
+ |-------------------|------------------|
+ | "support" AND "technical support" | "billing" OR "technical" OR "other" |
+ | `>10` AND `>50` | `10-50` AND `>50` |
+
+ Order matters — conditions are evaluated top to bottom.
+
+
+
+ It's easy to forget a branch while testing. Be systematic:
+
+ 1. List all possible paths
+ 2. Test each one deliberately
+ 3. Try edge cases (silence, gibberish, topic changes)
+ 4. Review in Convo Logs
+
+
+
+ Too many nested branches become impossible to manage.
+
+
+ [IMAGE: Side-by-side of deeply nested vs flatter flow]
+
+
+ If your flow is getting too deep:
+ - Can you combine some branches?
+ - Should some paths be separate flows?
+ - Is Single Prompt better for this use case?
+
+
+
+ Labels appear on the canvas — make them meaningful.
+
+ | Bad Labels | Good Labels |
+ |------------|-------------|
+ | "Option 1" | "Wants Billing Help" |
+ | "Path A" | "Budget > $10k" |
+ | "Yes" | "Confirmed Appointment" |
+
+
+---
+
+## Complex Branching Patterns
+
+### Multiple Conditions (AND)
+
+
+ [IMAGE: Node checking two conditions before branching]
+
+
+Sometimes you need multiple things to be true:
+
+```
+If {{api.tier}} == "premium" AND {{budget}} > 10000
+ → VIP Sales Path
+```
+
+Combine in a single variable-based condition:
+```
+{{api.tier}} == "premium" && {{budget}} > 10000
+```
+
+### Loop Back
+
+
+ [IMAGE: Flow with arrow going back to earlier node]
+
+
+For retry scenarios:
+
+```
+[Ask Budget]
+ ↓
+[Validate Budget]
+ ├── Valid → Continue
+ └── Invalid → Loop back to [Ask Budget]
+```
+
+
+**Avoid infinite loops.** Add a counter variable and exit after N attempts.
+
+
+### Parallel Paths That Merge
+
+
+ [IMAGE: Two branches that eventually connect to the same node]
+
+
+Different paths can lead to the same destination:
+
+```
+[Qualify]
+├── High Budget → [Fast Track] → [Schedule Demo]
+└── Standard Budget → [Standard Process] → [Schedule Demo]
+```
+
+---
+
+## Debugging Branches
+
+When branches don't work as expected:
+
+
+ [IMAGE: Convo log with branch decision highlighted]
+
+
+
+
+ See exactly which conditions were evaluated and which matched.
+
+
+
+ Typos in variable names or operators will fail silently.
+
+
+
+ If fallback triggers too often, your conditions may be too specific.
+
+
+
+ Conditions are checked top to bottom — earlier matches win.
+
+
+
+→ Learn more: [Conversation Logs](/atoms/atoms-platform/analytics-logs/conversation-logs)
+
+---
+
+## Next Steps
+
+
+
+ Voice, model, and features
+
+
+ Validate every branch
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/creating.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/creating.mdx
new file mode 100644
index 0000000..1b40cbe
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/creating.mdx
@@ -0,0 +1,161 @@
+---
+title: "Creating a Conversational Flow Agent"
+sidebarTitle: "Creating Your Agent"
+description: "Step-by-step guide to building a Conversational Flow agent."
+---
+
+This guide walks you through creating a Conversational Flow agent from scratch. By the end, you'll have a working workflow ready for testing.
+
+
+ [IMAGE: Blank workflow builder showing node palette, empty canvas, and toggle tabs]
+
+
+---
+
+## Steps to Create
+
+### Step 1: Start Creation
+
+1. Click the green **"Create Agent"** button (top right of dashboard)
+2. Select **"Start from scratch"**
+3. Choose **"Conversational Flow"**
+
+The workflow builder opens.
+
+---
+
+### Step 2: Understand the Layout
+
+| Area | Location | Purpose |
+|------|----------|---------|
+| **Toggle Tabs** | Top center | Switch between "Workflow" and "Settings" |
+| **Node Palette** | Left panel | Drag-and-drop node types |
+| **Canvas** | Center | Visual flow editor |
+| **Variables** | Right panel | `{ }` Variables button |
+
+**Top Right Actions** (same as Single Prompt):
+- Convo Logs
+- Lock Agent
+- Test Agent
+
+**Header:**
+- Back arrow (←) — return to agents list
+- Agent name — click to rename
+- Agent ID — click to copy
+
+---
+
+### Step 3: Start with the Canvas
+
+The canvas shows a **Start Node** (green pill) at the top. This is where every conversation begins.
+
+Your workflow will flow down from this starting point.
+
+---
+
+### Step 4: Add Your First Node
+
+1. In the Node Palette (left), find **Default Node**
+2. Drag it onto the canvas below the Start Node
+3. A connection line appears — drop the node to connect it
+
+---
+
+### Step 5: Configure the Node
+
+1. Click the node to select it
+2. A configuration panel opens
+3. Write the node's prompt — what should the agent say here?
+
+**Example for a greeting node:**
+```
+Hi! Thanks for calling TechStore. I'm here to help you today.
+Are you calling about an existing order, or do you have a product question?
+```
+
+---
+
+### Step 6: Add Conditions and Branches
+
+From your first node, add branches for different user responses:
+
+1. In the node config, find the conditions/branches section
+2. Add conditions like:
+ - "User mentions order" → connects to Order Help node
+ - "User asks product question" → connects to Product Info node
+ - "Other" → connects to Clarification node
+
+---
+
+### Step 7: Build Out the Flow
+
+Continue adding nodes for each conversation path:
+
+1. Drag more nodes from the palette
+2. Connect branches to appropriate next nodes
+3. Configure each node's prompt
+4. Ensure all paths eventually reach an **End Call** node
+
+---
+
+### Step 8: Configure Settings
+
+Click the **"Settings"** toggle tab to access:
+
+- Voice settings (same as Single Prompt)
+- Model configuration
+- Phone number assignment
+- Webhooks
+- General settings
+
+These work identically to Single Prompt configuration.
+
+---
+
+### Step 9: Test Your Flow
+
+1. Click **"Test Agent"** (top right)
+2. Choose test mode
+3. Walk through your conversation paths
+4. Check that each branch works correctly
+
+**Important:** Test EVERY path in your flow. Untested branches may have issues.
+
+---
+
+## Canvas Controls
+
+At the bottom of the canvas:
+
+| Button | Function |
+|--------|----------|
+| 👍 | Submit feedback |
+| ↕️ | Auto-layout (organize nodes neatly) |
+| + | Zoom in |
+| - | Zoom out |
+
+**Tip:** Use auto-layout frequently to keep your flow readable.
+
+---
+
+## Your Agent is Ready
+
+You now have a working Conversational Flow agent. From here, you can:
+
+- Add more nodes and branches
+- Configure API calls for data lookup
+- Set up transfer nodes for human handoff
+- Test thoroughly before deploying
+
+---
+
+## What's Next
+
+
+
+ Master the visual editor
+
+
+ Learn all node types
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/from-template.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/from-template.mdx
new file mode 100644
index 0000000..9e1fdc6
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/from-template.mdx
@@ -0,0 +1,241 @@
+---
+title: "From Template"
+sidebarTitle: "From Template"
+description: "Start with pre-built Conversational Flow templates."
+---
+
+Templates provide complete, tested workflows for common use cases. Pick one, customize it, and deploy.
+
+
+ [IMAGE: Grid of flow template cards showing different use cases]
+
+
+---
+
+## Available Templates
+
+
+
+ Structured qualification flow with budget, timeline, and decision-maker questions. Branches to qualified/not qualified paths.
+
+
+ Complete booking flow with availability checking, confirmation, and rescheduling options.
+
+
+ Routes callers to appropriate department based on issue type. Handles common requests in-flow.
+
+
+ Policy lookup, claim intake, and new policy paths. Built for compliance.
+
+
+ Property interest collection, viewing scheduling, and buyer qualification.
+
+
+ Patient verification, appointment prep, and pre-visit questionnaire.
+
+
+
+---
+
+## How to Use a Template
+
+
+
+ From your dashboard, click the green **Create Agent** button.
+
+
+ [IMAGE: Dashboard with button highlighted]
+
+
+
+
+ Choose the second option.
+
+
+ [IMAGE: Modal with "Start with Template" highlighted]
+
+
+
+
+ Select the Conversational Flow agent type.
+
+
+ [IMAGE: Conversational Flow option selected]
+
+
+
+
+ Explore templates. Click to preview the flow.
+
+
+ [IMAGE: Template card expanded showing flow preview]
+
+
+
+
+ Click **Use Template** to load the flow.
+
+
+ [IMAGE: Workflow builder with complete template flow visible]
+
+
+
+
+---
+
+## What Templates Include
+
+
+ [IMAGE: Annotated template showing all included elements]
+
+
+Each template comes with:
+
+| Component | Description |
+|-----------|-------------|
+| **Complete Flow** | All nodes, branches, and connections |
+| **Node Prompts** | Pre-written prompts for each step |
+| **Conditions** | Branch logic already configured |
+| **Variables** | Relevant variables pre-defined |
+| **Suggested Voice** | Voice recommendation for the use case |
+| **End Nodes** | Proper endings for all paths |
+
+---
+
+## Customizing Templates
+
+Templates are starting points. Always customize for your business.
+
+
+
+ Click each node and update the prompts with your specifics.
+
+
+ [IMAGE: Node panel with prompt being edited]
+
+
+ ```diff
+ - "Thanks for calling [Company]."
+ + "Thanks for calling Acme Insurance."
+
+ - "Our offices are open [hours]."
+ + "Our offices are open 8am-6pm Pacific."
+ ```
+
+
+
+ Not every node fits your process. Adjust as needed.
+
+
+ [IMAGE: User dragging new node into existing flow]
+
+
+ - **Add nodes** for extra questions
+ - **Remove nodes** you don't need
+ - **Reorganize** to match your actual process
+
+
+
+ Adjust conditions to match your criteria.
+
+
+ [IMAGE: Branch condition editor with values being changed]
+
+
+ ```diff
+ - If budget > $5,000 → Qualified
+ + If budget > $10,000 → Qualified
+ ```
+
+
+
+ Rename or add variables for your needs.
+
+
+ [IMAGE: Variables panel with renamed variables]
+
+
+ | Template Variable | Your Variable |
+ |-------------------|---------------|
+ | `{{company}}` | `{{customer_company}}` |
+ | `{{budget}}` | `{{project_budget}}` |
+
+
+
+---
+
+## Template Example: Lead Qualification
+
+Here's what the Lead Qualification template includes:
+
+
+ [IMAGE: Full workflow showing the complete lead qualification flow]
+
+
+### Flow Structure
+
+```
+[Start]
+ ↓
+[Greeting] → "Hi! Thanks for reaching out. I'd love to
+ learn more about your needs."
+ ↓
+[Company Info] → "What company are you with?"
+ ↓
+[Current Solution] → "What are you using today?"
+ ↓
+[Budget Range] → "What's your approximate budget?"
+ ├── > $10k → [High Value Path]
+ └── < $10k → [Standard Path]
+ ↓
+[Timeline] → "When are you looking to get started?"
+ ├── < 30 days → [Urgent] → [Transfer to Sales]
+ ├── 30-90 days → [Qualified] → [Schedule Demo]
+ └── > 90 days → [Nurture] → [Add to List]
+ ↓
+[End Call] → Appropriate closing for each path
+```
+
+### Included Variables
+
+| Variable | Purpose |
+|----------|---------|
+| `{{contact_name}}` | Caller's name |
+| `{{company_name}}` | Their company |
+| `{{current_solution}}` | What they use now |
+| `{{budget_range}}` | Budget bracket |
+| `{{timeline}}` | Decision timeline |
+| `{{lead_score}}` | Calculated qualification score |
+
+---
+
+## Tips for Template Success
+
+
+ Before customizing, trace every path. Understand why each node and branch exists.
+
+
+
+ The template structure is battle-tested. Keep the logic, just update the specifics.
+
+
+
+ Run through the template as-is first. Then test again after every significant change.
+
+
+
+ It's easy to customize the main path and forget alternate branches. Test every route.
+
+
+---
+
+## Next Steps
+
+
+
+ Understand all available nodes
+
+
+ Validate every branch
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/manual-setup.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/manual-setup.mdx
new file mode 100644
index 0000000..74431f9
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/manual-setup.mdx
@@ -0,0 +1,305 @@
+---
+title: "Manual Setup"
+sidebarTitle: "Manual Setup"
+description: "Build a Conversational Flow agent from scratch with full control."
+---
+
+Starting from scratch gives you complete creative freedom. This guide walks you through creating a Conversational Flow agent step by step.
+
+
+ [IMAGE: Empty workflow builder canvas with node palette visible]
+
+
+---
+
+## Step 1: Start Creation
+
+
+
+ Find the green **Create Agent** button in the top right of your dashboard.
+
+
+ [IMAGE: Dashboard showing Create Agent button location]
+
+
+
+
+ Choose the first option in the modal.
+
+
+ [IMAGE: Modal with "Start from scratch" highlighted]
+
+
+
+
+ Select the Conversational Flow agent type.
+
+
+ [IMAGE: Conversational Flow option with connected nodes icon]
+
+
+
+
+The workflow builder opens with an empty canvas.
+
+---
+
+## Step 2: Meet the Workflow Builder
+
+
+ [IMAGE: Full builder screenshot with numbered callouts]
+
+
+### Interface Layout
+
+| Area | Location | What It Does |
+|------|----------|--------------|
+| **Toggle Tabs** | Top center | Switch between Workflow and Settings |
+| **Node Palette** | Left panel | Drag nodes from here |
+| **Canvas** | Center | Your visual workflow |
+| **Variables** | Right panel | Manage flow variables |
+| **Controls** | Bottom | Zoom, auto-layout, feedback |
+
+
+
+ [IMAGE: Left panel showing all node types]
+
+
+ | Section | Contents |
+ |---------|----------|
+ | **Nodes** | Default, Transfer, API Call, End Call, Pre-Call API, Post-Call API |
+ | **Integrations** | Salesforce (available), Google Calendar, HubSpot, Google Sheets (coming soon) |
+ | **Help** | Need Help?, Keyboard Shortcuts |
+
+
+
+
+ [IMAGE: Bottom control bar with zoom and layout buttons]
+
+
+ | Button | Function |
+ |--------|----------|
+ | 👍 | Send feedback |
+ | ↕️ | Auto-layout (organize nodes) |
+ | + | Zoom in |
+ | − | Zoom out |
+
+
+---
+
+## Step 3: Build Your First Flow
+
+Let's create a simple lead qualification flow.
+
+### Add the Start Node
+
+Every flow begins with a **Start Node** — it's added automatically.
+
+
+ [IMAGE: Canvas showing green Start node pill]
+
+
+### Add Your First Conversation Node
+
+
+
+ From the Node Palette, drag a **Default Node** onto the canvas.
+
+
+ [IMAGE: Hand cursor dragging node from palette to canvas]
+
+
+
+
+ Drag from the Start node's handle to your new node.
+
+
+ [IMAGE: Connection line being drawn between nodes]
+
+
+
+
+ Click the node to open its settings. Add your prompt:
+
+ ```
+ Hi! Thanks for calling [Company]. I'm here to help
+ you find the right solution. To get started, could
+ you tell me your name?
+ ```
+
+
+ [IMAGE: Node settings panel with prompt field]
+
+
+
+
+### Continue the Flow
+
+Add more nodes for each step in your conversation:
+
+
+ [IMAGE: Canvas showing Start → Greeting → Ask Budget → Ask Timeline]
+
+
+
+
+ ```
+ Great, {{name}}! What's your approximate budget
+ for this project?
+ ```
+
+
+
+ ```
+ And when are you looking to get started?
+ ```
+
+
+
+ Based on responses, determine if lead is qualified.
+
+
+
+### Add an End Node
+
+Every path needs an ending.
+
+
+
+ From the palette, add an **End Call** node.
+
+
+ [IMAGE: Red End Call node at end of flow]
+
+
+
+
+ Set the goodbye message:
+
+ ```
+ Thanks so much for your time! We'll be in touch
+ within 24 hours. Have a great day!
+ ```
+
+
+
+---
+
+## Step 4: Add Branches
+
+Branches let you route conversations based on caller responses.
+
+
+ [IMAGE: Node with two output branches going to different paths]
+
+
+
+
+ Open the node you want to branch from.
+
+
+
+ Define what triggers each branch.
+
+
+ [IMAGE: Node settings showing condition inputs]
+
+
+ | Condition Type | Example |
+ |----------------|---------|
+ | **Text Match** | User says "not interested" |
+ | **Intent** | User expresses budget concern |
+ | **Variable** | `{{budget}}` > 10000 |
+
+
+
+ Draw connections from each condition to its destination node.
+
+
+ [IMAGE: One node with three output branches to different paths]
+
+
+
+
+
+**Always add a default/fallback branch.** Handle unexpected responses gracefully.
+
+
+---
+
+## Step 5: Configure Settings
+
+Click the **Settings** tab to access agent configuration.
+
+
+ [IMAGE: Top toggle showing Settings tab active]
+
+
+The Settings tab contains the same options as Single Prompt agents:
+
+| Setting Area | What to Configure |
+|--------------|-------------------|
+| **Voice** | Speech settings, pronunciation, detection |
+| **Model** | LLM selection, language switching |
+| **Phone Number** | Assign a number |
+| **Webhook** | Event notifications |
+| **General** | Timeouts |
+
+→ See: [Configuring Your Agent](/atoms/atoms-platform/single-prompt-agents/overview)
+
+---
+
+## Step 6: Test Your Flow
+
+
+ [IMAGE: Modal showing Telephony, Web Call, and Chat options]
+
+
+
+
+ Top right corner of the builder.
+
+
+
+ - **Web Call** — Quick browser test
+ - **Telephony** — Real phone experience
+ - **Chat** — Text-only for logic testing
+
+
+
+ Test every branch. Try edge cases.
+
+
+
+ Check Convo Logs to see exactly which nodes were hit.
+
+
+
+
+**Test every branch.** It's easy to miss an edge case that breaks the flow.
+
+
+---
+
+## Your Flow is Ready!
+
+
+ [IMAGE: Polished workflow with all nodes connected and organized]
+
+
+From here you can:
+
+
+
+ Master all available nodes
+
+
+ Complex condition logic
+
+
+ Voice, model, webhooks & more
+
+
+ Assign a real number
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/node-types.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/node-types.mdx
new file mode 100644
index 0000000..f59a587
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/node-types.mdx
@@ -0,0 +1,382 @@
+---
+title: "Node Types Reference"
+sidebarTitle: "Node Types"
+description: "Complete guide to every node type in Conversational Flow."
+---
+
+Nodes are the building blocks of your conversation flow. Each type serves a specific purpose in guiding the conversation.
+
+
+ [IMAGE: Node palette showing all six node types with icons]
+
+
+---
+
+## Node Types at a Glance
+
+| Node | Icon | Purpose | When to Use |
+|------|------|---------|-------------|
+| [Default](#default-node) | 🔷 | Conversation step | Each conversation point |
+| [Transfer Call](#transfer-call-node) | 📞 | Handoff to human | Connect to live agent |
+| [API Call](#api-call-node) | ⬆️ | External data | Fetch/send mid-conversation |
+| [End Call](#end-call-node) | ✂️ | Terminate call | Natural endings |
+| [Pre-Call API](#pre-call-api-node) | 🔵🟠 | Load context | Get data before call starts |
+| [Post-Call API](#post-call-api-node) | 🟠🔵 | Save data | Send data after call ends |
+
+---
+
+## Default Node
+
+The workhorse of your flow. Each Default node represents one step in the conversation.
+
+
+ [IMAGE: Default node card showing title and connection points]
+
+
+### Configuration
+
+
+ [IMAGE: Panel showing all Default node settings]
+
+
+| Field | Purpose |
+|-------|---------|
+| **Name** | Identifier shown on canvas |
+| **Prompt** | What the agent says at this step |
+| **Branches** | Output paths based on caller response |
+
+### Example Prompts
+
+
+
+ ```
+ Hi! Thanks for calling Acme Support. My name is Alex.
+ How can I help you today?
+ ```
+
+
+
+ ```
+ I'd be happy to help with that. First, could you tell
+ me your account number or the email on file?
+ ```
+
+
+
+ ```
+ Just to confirm — you'd like to schedule a demo for
+ next Tuesday at 2pm. Is that correct?
+ ```
+
+
+
+### Branching
+
+Default nodes can have multiple output branches:
+
+
+ [IMAGE: Node showing three output connections with condition labels]
+
+
+→ See: [Conditions & Branching](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/conditions)
+
+---
+
+## Transfer Call Node
+
+Hands the conversation to a human agent via phone transfer.
+
+
+ [IMAGE: Transfer Call node card with phone icon]
+
+
+### Configuration
+
+
+ [IMAGE: Transfer settings panel showing all options]
+
+
+| Field | Purpose |
+|-------|---------|
+| **Name** | Identifier |
+| **Description** | When this transfer should trigger |
+| **Phone Number** | Transfer destination (with country code) |
+| **Transfer Type** | Cold or Warm |
+
+### Transfer Types
+
+
+
+
+ [IMAGE: Diagram showing immediate handoff]
+
+
+ **Immediate handoff.** The caller is connected directly without any briefing to the receiving agent.
+
+ **Best for:**
+ - Simple escalations
+ - When context isn't needed
+ - Time-sensitive transfers
+
+
+
+
+ [IMAGE: Diagram showing AI briefing the human, then connecting caller]
+
+
+ **AI briefs the agent first.** The receiving agent gets context before the caller joins.
+
+ **Additional Options:**
+
+ | Option | Description |
+ |--------|-------------|
+ | On-hold Music | What caller hears while waiting |
+ | Transfer if Human | Skip if voicemail (coming soon) |
+ | Whisper Message | Private message to agent only |
+ | Handoff Message | What the agent hears |
+ | Three-way Message | What both parties hear |
+
+ **Best for:**
+ - Complex issues needing context
+ - VIP callers
+ - When continuity matters
+
+
+
+---
+
+## API Call Node
+
+Makes external API requests during the conversation.
+
+
+ [IMAGE: API Call node card with arrow icon]
+
+
+### Configuration
+
+
+ [IMAGE: API settings panel with all fields]
+
+
+| Field | Purpose |
+|-------|---------|
+| **Name** | Identifier |
+| **URL** | Endpoint to call |
+| **Method** | GET, POST, PUT, DELETE |
+| **Headers** | Request headers |
+| **Body** | Request payload |
+| **Response Mapping** | Map response to variables |
+
+### Example: Customer Lookup
+
+
+ [IMAGE: API node configured for customer lookup]
+
+
+```
+URL: https://api.example.com/customers
+Method: GET
+Query: ?phone={{caller_phone}}
+
+Response Mapping:
+ data.name → {{api.customer_name}}
+ data.tier → {{api.account_tier}}
+```
+
+Then use in a later node:
+
+```
+"Hello {{api.customer_name}}! I see you're a {{api.account_tier}}
+member. How can I help you today?"
+```
+
+→ Learn more: [API Calls](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls)
+
+---
+
+## End Call Node
+
+Terminates the conversation.
+
+
+ [IMAGE: End Call node card with scissors icon]
+
+
+### Configuration
+
+
+ [IMAGE: End Call settings panel]
+
+
+| Field | Purpose |
+|-------|---------|
+| **Name** | Identifier |
+| **Closing Message** | Final words before hanging up |
+
+### Example Closings
+
+
+
+ ```
+ Great! You're all set. Is there anything else I can
+ help you with today? ... Perfect, thank you for calling
+ Acme. Have a wonderful day!
+ ```
+
+
+
+ ```
+ I'm connecting you now. Thanks for calling Acme, and
+ have a great day!
+ ```
+
+
+
+ ```
+ Thanks so much for your interest. I'll have someone
+ send over some resources that might be helpful. Take care!
+ ```
+
+
+
+
+**Every path must end.** Make sure all branches eventually reach an End Call or Transfer node.
+
+
+---
+
+## Pre-Call API Node
+
+Fetches data before the conversation begins.
+
+
+ [IMAGE: Pre-Call API node with distinctive coloring]
+
+
+### When It Runs
+
+
+ [IMAGE: Timeline showing API call happening before Start node]
+
+
+The Pre-Call API runs:
+1. Phone rings
+2. **Pre-Call API executes** ← Here
+3. Data available
+4. Conversation starts
+
+### Use Cases
+
+| Scenario | API Call |
+|----------|----------|
+| **CRM Lookup** | Get caller history before greeting |
+| **Account Status** | Check if caller has issues |
+| **Personalization** | Load name, preferences |
+| **Routing** | Determine which flow to use |
+
+### Example
+
+
+ [IMAGE: Pre-Call API configured for customer lookup]
+
+
+```
+URL: https://crm.example.com/lookup?phone={{caller_phone}}
+
+Response:
+ customer_name → {{api.name}}
+ last_issue → {{api.last_ticket}}
+ tier → {{api.tier}}
+```
+
+First node can now say:
+
+```
+"Hi {{api.name}}! Thanks for calling back. Are you still
+having trouble with {{api.last_ticket}}?"
+```
+
+---
+
+## Post-Call API Node
+
+Sends data after the conversation ends.
+
+
+ [IMAGE: Post-Call API node with distinctive coloring]
+
+
+### When It Runs
+
+
+ [IMAGE: Timeline showing API call happening after End Call]
+
+
+The Post-Call API runs:
+1. Conversation ends
+2. Call terminates
+3. **Post-Call API executes** ← Here
+4. Data saved externally
+
+### Use Cases
+
+| Scenario | What to Send |
+|----------|--------------|
+| **CRM Update** | Call summary, outcome |
+| **Ticket Creation** | Issue details, priority |
+| **Lead Capture** | Collected qualification data |
+| **Analytics** | Custom metrics, disposition |
+
+### Example
+
+
+ [IMAGE: Post-Call API configured to update CRM]
+
+
+```
+URL: https://crm.example.com/calls
+Method: POST
+Body:
+{
+ "phone": "{{caller_phone}}",
+ "duration": "{{call_duration}}",
+ "outcome": "{{disposition}}",
+ "notes": "{{call_summary}}",
+ "collected": {
+ "name": "{{collected.name}}",
+ "budget": "{{collected.budget}}",
+ "timeline": "{{collected.timeline}}"
+ }
+}
+```
+
+---
+
+## Choosing the Right Node
+
+
+ [IMAGE: Flowchart: "What do you need?" → branches to different nodes]
+
+
+| If you need to... | Use |
+|-------------------|-----|
+| Ask a question or give info | Default Node |
+| Transfer to a human | Transfer Call Node |
+| Get external data mid-conversation | API Call Node |
+| End the conversation | End Call Node |
+| Load data before call starts | Pre-Call API Node |
+| Save data after call ends | Post-Call API Node |
+
+---
+
+## Next Steps
+
+
+
+ Create complex conversation paths
+
+
+ Voice, model, and more settings
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/nodes.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/nodes.mdx
new file mode 100644
index 0000000..b79e91f
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/nodes.mdx
@@ -0,0 +1,360 @@
+---
+title: "Working with Nodes"
+sidebarTitle: "Nodes"
+description: "Master the building blocks of Convo Flow agents."
+---
+
+Nodes are the building blocks of every Convo Flow agent. Each node represents a step in your conversation — a greeting, a question, an API call, or a handoff to a human.
+
+Think of nodes like stations on a train line. Your conversation travels from one station to the next, with branches determining which route to take based on what the caller says.
+
+---
+
+## Node Types
+
+
+
+
+
+| Node | Purpose | When to Use |
+|------|---------|-------------|
+| **Default** | Speak and listen | Greetings, questions, information delivery |
+| **API Call** | Connect to external services | Fetch data, book appointments, update CRMs |
+| **Transfer Call** | Hand off to a human | Escalations, complex issues, sales closes |
+| **End Call** | Conclude the conversation | Successful completion, dead ends |
+| **Pre-Call API** | Actions before the call | Load customer data, set variables |
+| **Post-Call API** | Actions after the call | Log outcomes, trigger follow-ups |
+
+---
+
+## Default Node
+
+The workhorse of Convo Flow. Use it for any conversational turn where your agent speaks and expects a response.
+
+
+
+
+
+### How to Use
+
+1. Drag **Default Node** from the left panel onto your canvas
+2. Click the node to select it
+3. In the right panel, write your prompt:
+
+```
+Hi {{customer_name}}! Thanks for calling Acme Support.
+How can I help you today?
+```
+
+The prompt is what your agent says. Variables like `{{customer_name}}` get replaced with actual data.
+
+### Setting Up Branches
+
+Branches determine what happens next based on the caller's response. Click **+ Add Branch** and configure:
+
+| Field | What It Does | Example |
+|-------|--------------|---------|
+| **Branch Name** | Internal label for the branch | "Billing Question" |
+| **Condition** | When to take this path | "User asks about billing" |
+| **Next Node** | Where to go next | → Billing Help node |
+
+Write conditions in natural language. The AI interprets them:
+- "User confirms"
+- "User says no or declines"
+- "User asks about pricing"
+- "User wants to speak to a person"
+- "Anything else" (fallback)
+
+
+**Always add a fallback.** Create a branch with condition "Anything else" that handles unexpected responses. Route it back to the same node with a clarification prompt or to a help node.
+
+**Order matters.** Branches are evaluated top to bottom. Put specific conditions first, fallback last.
+
+**Keep conditions clear.** "User wants to reschedule" is better than "User mentions changing times or dates or rescheduling or..."
+
+
+---
+
+## API Call Node
+
+Connect your agent to external systems — fetch data, book appointments, update records mid-conversation.
+
+### How to Use
+
+1. Drag **API Call** node onto the canvas
+2. Configure the request in the right panel:
+
+| Field | What to Enter |
+|-------|---------------|
+| **URL** | Your API endpoint (e.g., `https://api.example.com/appointments`) |
+| **Method** | GET, POST, PUT, or DELETE |
+| **Headers** | Authentication tokens, content-type |
+| **Body** | Data to send (supports variables like `{{customer_phone}}`) |
+
+### Handling Responses
+
+Map API response fields to variables:
+
+```json
+// API returns:
+{
+ "available_slots": ["9:00 AM", "2:00 PM", "4:30 PM"],
+ "next_available": "9:00 AM"
+}
+
+// Map to variables:
+{{available_times}} → available_slots
+{{suggested_time}} → next_available
+```
+
+Your agent can now say: *"I have {{suggested_time}} available. Does that work?"*
+
+### Branching on Results
+
+Set up branches for different API outcomes:
+- **Success** — Continue to confirmation
+- **No availability** — Offer waitlist or callback
+- **API error** — Apologize and offer to transfer
+
+
+**Calendar Booking**
+- Google Calendar API
+- Calendly webhooks
+- Microsoft Graph
+
+**CRM Updates**
+- Salesforce REST API
+- HubSpot API
+- Custom CRM endpoints
+
+**Data Lookup**
+- Customer databases
+- Order management systems
+- Inventory systems
+
+
+---
+
+## Transfer Call Node
+
+Hand the conversation to a human when needed — for escalations, complex issues, or high-value opportunities.
+
+### How to Use
+
+1. Drag **Transfer Call** node to your canvas
+2. Configure the transfer:
+
+| Field | What It Does |
+|-------|--------------|
+| **Transfer To** | Phone number or SIP address of the destination |
+| **Whisper Message** | What the human agent hears before connecting (caller doesn't hear this) |
+| **Hold Message** | What the caller hears while waiting |
+
+### Whisper Messages
+
+Give your human agents context before they pick up:
+
+```
+Incoming transfer from AI agent.
+Customer: {{customer_name}}
+Issue: {{issue_type}}
+Account: {{account_number}}
+```
+
+The human knows what's happening before saying hello.
+
+
+**Set expectations.** Before transferring, tell the caller what's happening and roughly how long they'll wait.
+
+**Pass context.** Use whisper messages so humans don't make callers repeat everything.
+
+**Have a backup.** Configure what happens if the transfer fails — voicemail, callback offer, or alternate number.
+
+
+---
+
+## End Call Node
+
+Gracefully conclude the conversation.
+
+
+
+
+
+### How to Use
+
+1. Drag **End Call** node to mark conversation endpoints
+2. Write a closing message:
+
+```
+Great, you're all set! Your appointment is confirmed for
+{{appointment_date}} at {{appointment_time}}.
+Have a wonderful day!
+```
+
+### Dispositions
+
+Tag the outcome for analytics:
+
+| Disposition | When to Use |
+|-------------|-------------|
+| **Successful** | Goal achieved (booking made, issue resolved) |
+| **Unsuccessful** | Goal not achieved (not interested, wrong number) |
+| **Transferred** | Handed to human |
+| **Callback Requested** | Customer asked for follow-up |
+
+Dispositions help you track how conversations end and measure agent performance.
+
+---
+
+## Pre-Call API Node
+
+Execute actions *before* your agent says hello. Perfect for loading personalized data.
+
+
+
+
+
+### How to Use
+
+This special node runs immediately when the call connects, before any conversation happens.
+
+### Common Use Cases
+
+| Use Case | What to Fetch |
+|----------|---------------|
+| **Personalization** | Customer name, account status, preferences |
+| **Context loading** | Open tickets, recent orders, appointment history |
+| **Routing logic** | VIP status, language preference, time zone |
+
+### Example
+
+```
+GET https://api.example.com/customers/{{caller_phone}}
+
+Response → Variables:
+{{customer_name}}
+{{account_type}}
+{{last_order_date}}
+```
+
+Now your greeting can be: *"Hi {{customer_name}}! I see you placed an order on {{last_order_date}}. How can I help?"*
+
+---
+
+## Post-Call API Node
+
+Trigger actions *after* the call ends. Great for logging and follow-ups.
+
+
+
+
+
+### How to Use
+
+This node runs automatically after every call, regardless of how it ended.
+
+### Common Use Cases
+
+| Use Case | What to Send |
+|----------|--------------|
+| **CRM logging** | Call summary, outcome, duration |
+| **Ticket creation** | Create tickets for unresolved issues |
+| **Follow-up triggers** | Send email confirmations, SMS receipts |
+| **Analytics** | Custom metrics, conversion tracking |
+
+### Example
+
+```
+POST https://crm.example.com/activities
+
+Body:
+{
+ "contact_phone": "{{caller_phone}}",
+ "call_duration": "{{call_duration}}",
+ "outcome": "{{disposition}}",
+ "summary": "{{call_summary}}",
+ "agent_id": "voice-bot-001"
+}
+```
+
+---
+
+## Connecting Nodes
+
+Branches are the arrows between nodes — they define your conversation's flow.
+
+### Creating Connections
+
+1. Click on a node to select it
+2. Scroll to **Branches** in the right panel
+3. Click **+ Add Branch**
+4. Set the condition and target node
+5. Drag from the branch's output handle to the target node
+
+### Branch Types
+
+| Type | How It Works |
+|------|--------------|
+| **Intent-based** | AI interprets caller's meaning — "User wants to reschedule" |
+| **Keyword-based** | Matches specific words — "User says 'yes'" |
+| **Variable-based** | Checks variable values — `{{account_type}} == 'premium'` |
+| **Default** | Catch-all fallback — "Anything else" |
+
+
+Every branch should lead somewhere. Use the **Validation** feature (top right) to find:
+- Nodes with no outgoing branches
+- Branches pointing to deleted nodes
+- Disconnected node clusters
+
+Fix all validation errors before deploying.
+
+
+
+It's fine to loop back (e.g., fallback → same node for clarification), but:
+- Set a maximum retry count
+- After 2-3 failures, offer transfer or end gracefully
+- Don't let callers get stuck in infinite loops
+
+
+---
+
+## Variables in Nodes
+
+Variables make your conversations dynamic. Use them anywhere in prompts.
+
+### Syntax
+
+```
+{{variable_name}}
+```
+
+### System Variables
+
+| Variable | Contains |
+|----------|----------|
+| `{{caller_phone}}` | Caller's phone number |
+| `{{call_duration}}` | Time elapsed |
+| `{{current_date}}` | Today's date |
+| `{{current_time}}` | Current time |
+
+### Custom Variables
+
+Create your own from:
+- **Pre-Call API** responses
+- **Contact list** imports (for outbound campaigns)
+- **API Call** responses during conversation
+- **Collected** from caller responses
+
+---
+
+## Next Steps
+
+
+
+ Choose how your agent sounds
+
+
+ Validate before going live
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/overview.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/overview.mdx
new file mode 100644
index 0000000..86576e4
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/overview.mdx
@@ -0,0 +1,164 @@
+---
+title: "Conversational Flow Agents"
+sidebarTitle: "Overview"
+description: "Build structured, goal-oriented agents with visual workflows."
+---
+
+Conversational Flow agents give you complete control over conversation paths. Design visual workflows with nodes and branches, ensuring callers get exactly the experience you intend.
+
+
+ [IMAGE: Visual workflow showing nodes connected with branches, caller moving through]
+
+
+---
+
+## How It Works
+
+
+
+ Create nodes for each conversation step. Connect them to define paths.
+
+
+ Define conditions that route callers down different paths based on their responses.
+
+
+ As callers speak, the AI guides them through your designed flow.
+
+
+ Each path leads to a defined outcome — transfer, booking, qualification, etc.
+
+
+
+
+ [IMAGE: Clean screenshot of workflow builder with node palette, canvas, and example flow]
+
+
+---
+
+## When to Use Conversational Flow
+
+
+
+ - Lead qualification
+ - Appointment scheduling
+ - Multi-step intake forms
+ - Compliance-required conversations
+ - Processes with clear stages
+ - When you need specific data collected
+
+
+ - Completely open-ended conversations
+ - Simple FAQ (overkill)
+ - When flexibility matters more than structure
+ - Very short interactions
+
+
+
+---
+
+## Real-World Examples
+
+
+
+
+ [IMAGE: Flow diagram: Greeting → Company Info → Budget → Timeline → Qualify/Disqualify → Transfer]
+
+
+ **The flow:**
+ ```
+ [Greeting] → [Company Size?] → [Current Solution?]
+ → [Budget Range?] → [Timeline?]
+ → Qualified? → [Transfer to Sales]
+ → Not Qualified? → [Send Resources]
+ ```
+
+ **Why Conversational Flow works:** You need specific information in a specific order. Every lead gets the same thorough qualification.
+
+
+
+
+ [IMAGE: Flow diagram: Verify → Service Type → Date/Time → Confirm → End]
+
+
+ **The flow:**
+ ```
+ [Verify Caller] → [What Service?] → [Preferred Date?]
+ → Check Availability
+ → Available? → [Confirm Booking]
+ → Not Available? → [Offer Alternatives]
+ ```
+
+ **Why Conversational Flow works:** Booking requires checking availability and confirming multiple details. Branches handle the "what if not available" scenario gracefully.
+
+
+
+
+ [IMAGE: Flow diagram with multiple branches for different coverage types]
+
+
+ **The flow:**
+ ```
+ [Verify Identity] → [Reason for Call?]
+ → New Policy? → [Coverage Type] → [Quote Details]
+ → Existing Policy? → [Policy Lookup] → [Handle Request]
+ → File Claim? → [Claim Intake]
+ ```
+
+ **Why Conversational Flow works:** Different intents require completely different paths. The visual workflow makes this complexity manageable.
+
+
+
+---
+
+## Key Concepts
+
+
+ [IMAGE: Visual showing nodes, branches, and paths annotated]
+
+
+| Concept | What It Is | Example |
+|---------|------------|---------|
+| **Node** | A step in the conversation | "Ask about budget" |
+| **Branch** | A conditional path | "If budget > $10k, go to Premium Path" |
+| **Path** | A route through nodes | Start → Qualify → Transfer |
+| **Prompt** | Text in each node | "What's your approximate budget?" |
+
+---
+
+## Pros & Cons
+
+| Pros | Cons |
+|------|------|
+| Complete control over conversation | More setup time |
+| Predictable, consistent outcomes | Can feel scripted if not done well |
+| Easy to ensure data collection | Harder to handle unexpected topics |
+| Visual — easy to understand | Requires more maintenance |
+| Great for compliance | Branches can get complex |
+
+---
+
+## Get Started
+
+
+ | Method | Description |
+ |--------|-------------|
+ | **Start from scratch** | Blank canvas. Full control over your workflow design. |
+ | **Start with Template** | Pre-built flows for common use cases. Customize from there. |
+ | **Create with AI** | Describe your conversation, and AI generates the flow for you. |
+
+
+
+
+ Build flows from scratch
+
+
+ Start with pre-built flows
+
+
+ Let AI design your flow
+
+
+
+
+ Master the visual workflow editor
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/quick-start.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/quick-start.mdx
new file mode 100644
index 0000000..3218678
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/quick-start.mdx
@@ -0,0 +1,210 @@
+---
+title: "Quick Start"
+sidebarTitle: "Quick Start"
+description: "Create your first Convo Flow agent in under 15 minutes."
+---
+
+This guide walks you through creating a working Convo Flow agent. By the end, you'll have a multi-step conversation flow you can actually call and test.
+
+---
+
+## Step 1: Create Your Agent
+
+From your dashboard, click **Create Agent** in the top-right corner.
+
+
+
+
+
+---
+
+## Step 2: Fill In Basic Details
+
+A modal appears asking for basic information:
+
+
+
+
+
+| Field | What to Enter |
+|-------|---------------|
+| **Agent Name** | Something descriptive — "Appointment Reminder", "Lead Qualifier", etc. |
+| **Call Type** | **Outbound** (agent makes calls) or **Inbound** (customers call in) |
+| **Voice** | Click to preview voices, pick one that matches your brand |
+| **Language** | Primary language for the conversation |
+
+---
+
+## Step 3: Select Conversational Flow
+
+Choose **Conversational flow agent** — it's labeled "For stronger guardrails".
+
+
+
+
+
+This gives you access to the visual workflow builder.
+
+---
+
+## Step 4: Choose a Starting Point
+
+**Start from Scratch**
+Opens a blank canvas with just a Start node. Best when you have a specific flow in mind.
+
+**Use a Template**
+Pick a pre-built flow for your industry — Healthcare, E-commerce, Real Estate, Banking, Sales. Templates come with nodes and branches already configured that you can customize.
+
+
+Even if your use case is unique, starting from a template is often faster. Delete what you don't need, keep what works.
+
+
+---
+
+## Step 5: Create the Agent
+
+Click **Create agent**.
+
+Atoms processes your configuration (about 30 seconds), then drops you into the **Workflow Canvas**.
+
+---
+
+## Step 6: Explore the Canvas
+
+
+
+
+
+Take a moment to orient yourself:
+
+**Left Panel** — Node palette. This is where you drag nodes from.
+
+**Center** — Your workflow canvas. You'll see a Start node (or a template flow if you picked one).
+
+**Right Panel** — Node configuration. Click any node to see its settings here.
+
+**Top Bar** — Test Agent button, Conversation Logs, Lock Agent toggle.
+
+---
+
+## Step 7: Add Your First Node
+
+Let's build a simple greeting:
+
+1. From the left panel, drag a **Default Node** onto the canvas
+2. Click the node to select it
+3. In the right panel, find the **Prompt** field
+4. Write your greeting:
+
+```
+Hi, this is an automated call from Dr. Smith's office.
+Am I speaking with {{customer_name}}?
+```
+
+The `{{customer_name}}` is a variable that gets replaced with actual data during the call.
+
+---
+
+## Step 8: Connect the Nodes
+
+Draw a line from your Start node to your greeting node:
+
+1. Hover over the Start node's output handle (small circle on the right)
+2. Click and drag to your greeting node's input handle (circle on the left)
+3. Release to create the connection
+
+Your flow now has a path: Start → Greeting.
+
+---
+
+## Step 9: Add Branches
+
+The caller will respond to your greeting. You need to handle different responses:
+
+1. With your greeting node selected, find **Branches** in the right panel
+2. Click **+ Add Branch**
+3. Configure the first branch:
+ - **Name:** "Confirmed"
+ - **Condition:** "User confirms their identity"
+ - **Next Node:** (we'll create this next)
+
+4. Add another branch:
+ - **Name:** "Wrong Person"
+ - **Condition:** "User says it's the wrong number"
+
+5. Add a fallback:
+ - **Name:** "Unclear"
+ - **Condition:** "Anything else"
+
+---
+
+## Step 10: Build Out the Flow
+
+Now add nodes for each branch:
+
+**For "Confirmed"** — Add a Default Node with the appointment details:
+```
+Great! I'm calling to remind you about your appointment on
+{{appointment_date}} at {{appointment_time}}.
+Would you like to confirm or reschedule?
+```
+
+**For "Wrong Person"** — Add an End Call Node with an apology:
+```
+I apologize for the confusion. I must have the wrong number.
+Have a great day!
+```
+
+**For "Unclear"** — Loop back to the greeting with a clarification:
+```
+I'm sorry, I didn't quite catch that.
+Am I speaking with {{customer_name}}?
+```
+
+Connect each branch to its corresponding node.
+
+---
+
+## Step 11: Add an End Point
+
+Every path needs to end somewhere. Drag an **End Call** node and connect it to successful conversation completions:
+
+```
+Perfect! Your appointment is confirmed for {{appointment_date}}
+at {{appointment_time}}. We'll see you then. Have a wonderful day!
+```
+
+Set the **Disposition** to "Successful" so you can track outcomes.
+
+---
+
+## Step 12: Test Your Flow
+
+Click **Test Agent** in the top bar.
+
+1. Choose your testing method (web call or phone)
+2. Walk through the conversation as a customer would
+3. Try different paths — confirm identity, say wrong number, give unclear responses
+
+After testing, check **Conversation Logs** to see exactly how the AI interpreted responses and which paths it took.
+
+---
+
+## You're Live!
+
+Your Convo Flow agent is ready. From here, you can:
+
+
+
+ Deep dive into each node type
+
+
+ Connect to external systems
+
+
+ Make your agent live
+
+
+ Run outbound calls at scale
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/when-to-use.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/when-to-use.mdx
new file mode 100644
index 0000000..18dac8e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/when-to-use.mdx
@@ -0,0 +1,123 @@
+---
+title: "When to Use Conversational Flow"
+sidebarTitle: "When to Use"
+description: "Determine if Conversational Flow agents are right for your use case."
+---
+
+Conversational Flow agents give you precise control over every step of a conversation through a visual workflow builder. They're powerful but require more setup than Single Prompt agents.
+
+---
+
+## Ideal Use Cases
+
+Conversational Flow agents excel when you need **structure and control**:
+
+### Lead Qualification Workflows
+
+When you need to ask specific qualifying questions, score responses, and route leads based on criteria, Conversational Flow makes this logic visual and clear.
+
+### Appointment Booking
+
+Scheduling with multiple conditions — available times, service types, locations, staff preferences — benefits from defined decision paths.
+
+### Multi-Step Data Collection
+
+Insurance intake, loan applications, or any process collecting specific information in a specific order works well with structured flows.
+
+### Compliance-Required Conversations
+
+When regulations require specific disclosures, verifications, or sequences, Conversational Flow ensures nothing is skipped.
+
+### Support Ticket Routing
+
+Triage calls into specific categories and route to the right team based on a defined decision tree.
+
+### Surveys and Feedback Collection
+
+Structured questionnaires with branching logic based on responses.
+
+---
+
+## Not Ideal For
+
+Conversational Flow is overkill when you need **flexibility over structure**:
+
+### Completely Open-Ended Conversations
+
+If callers might discuss anything and you want natural flow, Single Prompt is simpler.
+
+### Simple FAQ Bots
+
+For basic Q&A without specific paths, Single Prompt handles variety better.
+
+### When Flexibility Matters More
+
+If conversations should feel natural rather than guided, Single Prompt is more appropriate.
+
+### Quick Prototypes
+
+Single Prompt is faster to set up when testing ideas.
+
+---
+
+## Decision Checklist
+
+| Question | If Yes → |
+|----------|----------|
+| Must steps happen in exact order? | Conversational Flow ✓ |
+| Do you need branching based on answers? | Conversational Flow ✓ |
+| Are there compliance requirements? | Conversational Flow ✓ |
+| Do you need to score or qualify? | Conversational Flow ✓ |
+| Is the conversation unpredictable? | Single Prompt |
+| Do you want quick setup? | Single Prompt |
+
+---
+
+## What You'll Build
+
+With Conversational Flow, you create a visual workflow:
+
+```
+[Start] → [Greeting] → [Ask Question 1]
+ ↓
+ ┌───────────────┼───────────────┐
+ ↓ ↓ ↓
+ [Option A] [Option B] [Other]
+ ↓ ↓ ↓
+ [Next Step] [Different Path] [Clarify]
+ ↓ ↓ ↓
+ ... ... ...
+ └───────────────┼───────────────┘
+ ↓
+ [End Call]
+```
+
+Each box is a **node**. Lines between them are **branches** with conditions.
+
+---
+
+## Example Scenarios
+
+**Good for Conversational Flow:**
+- "Let me qualify you for our service"
+- "I need to verify your identity"
+- "Let's schedule your appointment"
+- "I have a few questions for our survey"
+
+**Better for Single Prompt:**
+- "I have a random question"
+- "Tell me about your company"
+- "I'm not sure what I need"
+
+---
+
+## What's Next
+
+
+
+ Start building a Conversational Flow agent
+
+
+ Compare with Single Prompt
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/convo-flow/workflow-builder.mdx b/fern/products/atoms/pages/platform/building-agents/convo-flow/workflow-builder.mdx
new file mode 100644
index 0000000..58cd714
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/convo-flow/workflow-builder.mdx
@@ -0,0 +1,301 @@
+---
+title: "Workflow Builder"
+sidebarTitle: "Workflow Builder"
+description: "Master the visual canvas for designing conversation flows."
+---
+
+The workflow builder is your visual studio for creating conversation flows. Drag, drop, connect, and design exactly how your agent should guide callers.
+
+
+ [IMAGE: Full workflow builder with an example flow, all areas visible]
+
+
+---
+
+## Interface Overview
+
+
+
+
+ [IMAGE: Left panel showing all node types and sections]
+
+
+ The left panel contains everything you can add to your flow:
+
+ **Nodes Section**
+ | Node | Icon | Quick Description |
+ |------|------|-------------------|
+ | Default | 🔷 | Conversation step |
+ | Transfer Call | 📞 | Handoff to human |
+ | API Call | ⬆️ | External data request |
+ | End Call | ✂️ | Terminate conversation |
+ | Pre-Call API | 🔵🟠 | Load data before call |
+ | Post-Call API | 🟠🔵 | Send data after call |
+
+ **Integrations Section**
+ | Integration | Status |
+ |-------------|--------|
+ | Salesforce | Available |
+ | Google Calendar | Coming Soon |
+ | HubSpot | Coming Soon |
+ | Google Sheets | Coming Soon |
+
+ **Help Section**
+ - Need Help? (expandable)
+ - Keyboard Shortcuts (expandable)
+
+
+
+
+ [IMAGE: Center canvas area with nodes and connections]
+
+
+ The center area is your visual workspace:
+
+ - **Nodes** appear as cards you can move around
+ - **Connections** are lines between nodes
+ - **Start node** (green pill) is where every call begins
+ - **Drag** to pan around the canvas
+ - **Scroll** to zoom in/out
+
+
+ | Action | How |
+ |--------|-----|
+ | Pan | Click and drag on empty space |
+ | Zoom | Scroll wheel or +/- buttons |
+ | Select node | Click on it |
+ | Multi-select | Shift + click |
+ | Delete | Select + Delete/Backspace |
+
+
+
+
+
+ [IMAGE: Bottom control bar with all buttons]
+
+
+ The bottom bar provides quick actions:
+
+ | Button | Icon | Function |
+ |--------|------|----------|
+ | Feedback | 👍 | Send feedback to Atoms |
+ | Auto-layout | ↕️ | Automatically organize nodes |
+ | Zoom in | + | Closer view |
+ | Zoom out | − | Wider view |
+
+
+ **Use Auto-layout often.** It keeps your flow readable as it grows.
+
+
+
+
+
+ [IMAGE: Right panel showing variables button and panel]
+
+
+ Click **{ } Variables** to manage flow-level variables:
+
+ | Tab | Contents |
+ |-----|----------|
+ | User Defined | Variables you create |
+ | System | Platform-provided variables |
+ | API | Variables from API responses |
+
+ → Learn more: [Variables](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables)
+
+
+
+---
+
+## Working with Nodes
+
+### Adding Nodes
+
+
+ [IMAGE: Animation-style showing node being dragged from palette]
+
+
+
+
+ Locate the node type in the left palette.
+
+
+ Click, hold, and drag onto the canvas.
+
+
+ Let go where you want the node.
+
+
+
+### Connecting Nodes
+
+
+ [IMAGE: Line being drawn from one node to another]
+
+
+
+
+ Each node has connection handles (small circles on edges).
+
+
+ Click and drag from an output handle.
+
+
+ Release on another node's input handle.
+
+
+
+
+Connections flow **top to bottom** and **left to right** by convention. Auto-layout helps maintain this.
+
+
+### Configuring Nodes
+
+
+ [IMAGE: Selected node with configuration panel visible]
+
+
+Click any node to open its settings. Each type has different options:
+
+| Node Type | Configuration Options |
+|-----------|----------------------|
+| **Default** | Prompt text, output branches, conditions |
+| **Transfer** | Phone number, transfer type, messages |
+| **API Call** | Endpoint, headers, body, response mapping |
+| **End Call** | Closing message |
+
+### Deleting Nodes
+
+
+ [IMAGE: Node selected with delete indication]
+
+
+1. **Select** the node (click on it)
+2. Press **Delete** or **Backspace**
+3. Confirm if prompted
+
+
+Deleting a node also removes all its connections. Make sure to reconnect orphaned nodes.
+
+
+### Moving Nodes
+
+Simply drag any node to reposition it on the canvas.
+
+
+ [IMAGE: Node being dragged to new position]
+
+
+
+After moving nodes manually, click **Auto-layout** to clean up the arrangement.
+
+
+---
+
+## Working with Connections
+
+### Understanding Connections
+
+
+ [IMAGE: Close-up of a connection line with labels]
+
+
+Connections define the conversation path:
+- **Lines** show flow direction
+- **Arrows** indicate where the conversation goes next
+- **Labels** can show condition names
+
+### Editing Connections
+
+
+ [IMAGE: Connection line being redirected]
+
+
+| Action | How |
+|--------|-----|
+| Remove | Click connection → Delete |
+| Redirect | Delete and create new |
+| Add label | Configure in source node's branch settings |
+
+### Branch Connections
+
+A single node can have multiple output connections for branching:
+
+
+ [IMAGE: One node with three outgoing connections to different targets]
+
+
+→ Learn more: [Conditions & Branching](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/conditions)
+
+---
+
+## Best Practices
+
+
+
+ [IMAGE: Side-by-side of organized flow vs tangled flow]
+
+
+ - Use **Auto-layout** regularly
+ - Flow top-to-bottom, left-to-right
+ - Group related nodes visually
+ - Don't cross lines if avoidable
+
+
+
+
+ [IMAGE: Nodes with clear names like "Ask Budget" vs generic "Step 3"]
+
+
+ | Good Names | Bad Names |
+ |------------|-----------|
+ | "Verify Identity" | "Step 1" |
+ | "Budget Question" | "Node 5" |
+ | "Transfer to Sales" | "Transfer" |
+
+
+
+ Don't wait until the flow is complete to test. Validate each section:
+
+ 1. Build a few nodes
+ 2. Test that section
+ 3. Continue building
+ 4. Test the new section
+ 5. Repeat
+
+
+
+ Before building, sketch out:
+ - What questions lead to branches?
+ - What are all possible answers?
+ - Where does each path end?
+
+
+---
+
+## Keyboard Shortcuts
+
+
+ [IMAGE: Shortcuts help panel expanded]
+
+
+| Shortcut | Action |
+|----------|--------|
+| `Delete` / `Backspace` | Delete selected |
+| `Cmd/Ctrl + Z` | Undo |
+| `Cmd/Ctrl + Shift + Z` | Redo |
+| `Cmd/Ctrl + A` | Select all |
+| `Escape` | Deselect |
+
+---
+
+## Next Steps
+
+
+
+ Understand every node type
+
+
+ Create complex conversation paths
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/create-with-ai.mdx b/fern/products/atoms/pages/platform/building-agents/create-with-ai.mdx
new file mode 100644
index 0000000..f83bdf5
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/create-with-ai.mdx
@@ -0,0 +1,454 @@
+---
+title: "Create with AI"
+sidebarTitle: "Create with AI"
+description: "Let AI generate your agent from natural language descriptions."
+---
+
+Don't want to start from scratch? Describe what you need in plain English, and our AI will generate a complete agent — whether Single Prompt or Conversational Flow.
+
+
+ [IMAGE: Full Create with AI page showing configuration panel on left and prompts on right]
+
+
+---
+
+## How It Works
+
+
+
+ Select whether you want a Single Prompt or Conversational Flow agent.
+
+
+
+ Set voice, model, call direction, and optional knowledge base.
+
+
+
+ Describe your agent's role, conversation flow, behaviors, and end conditions.
+
+
+
+ AI generates your complete agent.
+
+
+ [IMAGE: Loading modal showing "Analyzing requirements → Designing prompt → Creating your agent"]
+
+
+
+
+ The editor opens with your generated agent. Customize as needed.
+
+
+
+
+**Pro tip from the platform:** "Use caller context (like past tickets) to greet by name. Even a small touch of personalization boosts trust."
+
+
+---
+
+## Configuration Options
+
+
+ [IMAGE: Left panel showing all dropdowns and toggles]
+
+
+The left panel controls your agent's foundation:
+
+### Agent Type
+
+
+ [IMAGE: Dropdown showing Single Prompt and Conversational Flow options]
+
+
+| Type | What AI Generates |
+|------|-------------------|
+| **Single Prompt** | One comprehensive prompt |
+| **Conversational Flow** | Complete workflow with nodes and branches |
+
+### Call Direction
+
+
+ [IMAGE: Dropdown showing Inbound and Outbound options]
+
+
+| Direction | Use Case |
+|-----------|----------|
+| **Inbound** | Agent receives calls (support, inquiries) |
+| **Outbound** | Agent makes calls (campaigns, reminders) |
+
+### Emotive Model
+
+
+ [IMAGE: Toggle switch for emotive model]
+
+
+
+**Beta Feature:** Emotive models use speech-to-speech technology for more natural, emotionally-aware responses. Experimental but impressive.
+
+
+### Voice Selection
+
+
+ [IMAGE: Voice selection dropdown with preview button]
+
+
+Choose the voice your agent will use. Click ▶️ to preview before selecting.
+
+### Knowledge Base
+
+
+ [IMAGE: KB dropdown showing None and available KBs]
+
+
+Optionally attach an existing knowledge base for the agent to reference.
+
+---
+
+## The Four Prompts
+
+
+ [IMAGE: Right side with four text areas stacked]
+
+
+Each prompt shapes a different aspect of your agent. All require **minimum 50 characters**.
+
+
+
+
+ [IMAGE: First prompt field highlighted]
+
+
+ **What it defines:** Who the agent is and what it's trying to accomplish.
+
+ **Label:** "Provide the role & objective of your agent"
+
+ **Good example:**
+ ```
+ You are a friendly and confident customer support agent for
+ a fintech platform. Your goal is to quickly understand the
+ user's issue, respond with empathy, and provide clear,
+ step-by-step solutions that make them feel heard and supported.
+
+ Maintain a calm and reassuring tone throughout the conversation,
+ ensuring that the user feels confident in your assistance. Only
+ mark the issue as resolved once the user has confirmed they are
+ fully satisfied with the outcome.
+ ```
+
+ **Tips:**
+ - Be specific about personality (friendly, professional, casual)
+ - State the primary goal clearly
+ - Mention the industry/context
+
+
+
+
+ [IMAGE: Second prompt field highlighted]
+
+
+ **What it defines:** The step-by-step conversation structure.
+
+ **Label:** "Provide conversational flow that the agent should follow"
+
+ **Good example:**
+ ```
+ As a NorthLoop Support agent, greet customers warmly and
+ confirm they are NorthLoop customers. Ask one focused question
+ to identify if the issue is billing or connectivity.
+
+ For connectivity, get the service address; for billing, collect
+ the email or phone number. Verify the account and, if needed,
+ try an alternate identifier.
+
+ Diagnose the issue: check for outages first, then guide through
+ reboot or cabling steps. If the outage lasted over four hours,
+ issue a refund. If local fixes fail, schedule a technician.
+
+ Confirm resolution and next steps, invite questions, and close
+ politely.
+ ```
+
+ **Tips:**
+ - Describe the conversation as a journey
+ - Include decision points (if X, then Y)
+ - Cover the main paths callers will take
+
+
+
+
+ [IMAGE: Third prompt field highlighted]
+
+
+ **What it defines:** Behavioral guardrails and edge case handling.
+
+ **Label:** "Set your agent's dos, don'ts, and fallback behaviors — especially for edge cases or sensitive situations"
+
+ **Good example:**
+ ```
+ Your agent should always remain calm, polite, and solution-oriented.
+
+ DO:
+ - Listen actively and show empathy
+ - Provide clear next steps at every stage
+ - Confirm understanding before proceeding
+ - Escalate politely when needed
+
+ DON'T:
+ - Make assumptions about the issue
+ - Overpromise on timelines or resolutions
+ - Share unverified information
+ - Rush the customer
+
+ FALLBACKS:
+ - Account lookup failures → Offer alternate verification methods
+ - Incomplete verification → Politely re-request information
+ - Unclear issues → Ask clarifying questions, don't guess
+ - System limitations → Acknowledge honestly and offer alternatives
+
+ Always prioritize accuracy, empathy, and clarity over speed.
+ ```
+
+ **Tips:**
+ - List specific behaviors, not vague goals
+ - Cover sensitive scenarios (angry callers, edge cases)
+ - Define what to do when things go wrong
+
+
+
+
+ [IMAGE: Fourth prompt field highlighted]
+
+
+ **What it defines:** When and how the conversation should end.
+
+ **Label:** "Specify the conditions under which the call should end"
+
+ **Good example:**
+ ```
+ End the call when:
+
+ 1. Issue fully resolved and customer confirms satisfaction
+ - Thank them for calling
+ - Offer additional help before closing
+
+ 2. Customer requests to end the call
+ - Acknowledge and close gracefully
+ - Offer callback if issue unresolved
+
+ 3. Successful transfer to human agent
+ - Confirm transfer is happening
+ - Brief goodbye
+
+ 4. Customer becomes unresponsive
+ - After 3 attempts to re-engage
+ - Leave callback information
+
+ 5. Issue outside scope
+ - Acknowledge limitation
+ - Provide alternative resources
+ - End with helpful next steps
+ ```
+
+ **Tips:**
+ - Cover all the ways a call might end
+ - Include what to say in each scenario
+ - Don't forget edge cases (no response, wrong department)
+
+
+
+---
+
+## Using Templates
+
+
+ [IMAGE: Row of template tabs: Real Estate, Credit Card, Customer Support, etc.]
+
+
+Templates pre-fill all four prompts with tested content for common use cases.
+
+### Available Templates
+
+| Template | Best For |
+|----------|----------|
+| **Real Estate** | Property inquiries, viewing scheduling |
+| **Credit Card** | Card services, payment questions |
+| **Customer Support Electronics** | Tech support, troubleshooting |
+| **General Sales** | Lead qualification, product info |
+| **Onboarding Assist** | New user guidance, setup help |
+
+### How to Use
+
+
+
+
+ [IMAGE: Template tab being selected]
+
+
+
+
+ All four prompt fields populate with template content.
+
+
+ [IMAGE: All four fields now containing text]
+
+
+
+
+ Update company names, policies, and specifics for your business.
+
+
+
+ Click **Create agent** to generate.
+
+
+
+### Clear All
+
+
+ [IMAGE: Clear All button location]
+
+
+Click **Clear All** to reset all prompts and start fresh.
+
+---
+
+## Tips for Single Prompt Agents
+
+When generating Single Prompt agents:
+
+
+ Since there's no visual flow, the prompt needs to cover everything the agent should know and how it should behave.
+
+ Include:
+ - Detailed role description
+ - All topics it should handle
+ - Communication style
+ - Edge case handling
+
+
+
+ Even without visual nodes, describe the typical conversation arc:
+
+ ```
+ Start with a warm greeting. Ask how you can help.
+ Listen to the issue. Acknowledge and confirm understanding.
+ Provide the solution or collect needed information.
+ Confirm resolution. Offer additional help. Close warmly.
+ ```
+
+
+
+ Single Prompt agents should handle topic jumps gracefully:
+
+ ```
+ If the customer changes topics, acknowledge the shift and
+ adapt. Don't force them back to previous subjects.
+ ```
+
+
+---
+
+## Tips for Conversational Flow Agents
+
+When generating Conversational Flow agents:
+
+
+ Tell the AI exactly when paths should split:
+
+ ```
+ After greeting, ask if calling about billing or technical.
+
+ BILLING PATH:
+ - Verify account
+ - Ask about specific charge
+ - Explain or process refund
+
+ TECHNICAL PATH:
+ - Identify product
+ - Troubleshoot steps
+ - Schedule technician if needed
+ ```
+
+
+
+ List what information must be gathered and when:
+
+ ```
+ Must collect before qualifying:
+ 1. Company name
+ 2. Company size (employees)
+ 3. Current solution
+ 4. Budget range
+ 5. Decision timeline
+ ```
+
+
+
+ Every path needs a conclusion:
+
+ ```
+ End points:
+ - Qualified lead → Transfer to sales with context
+ - Not qualified → Send resources, end call
+ - Requested callback → Schedule and confirm
+ - Angry customer → Escalate to manager
+ ```
+
+
+---
+
+## After Generation
+
+Once AI creates your agent:
+
+
+ [IMAGE: Editor with AI-generated content loaded]
+
+
+
+
+ Read through the generated prompt (Single Prompt) or walk through the flow (Conversational Flow).
+
+
+
+ Click **Test Agent** to try a conversation before making changes.
+
+
+
+ Adjust anything that doesn't match your vision:
+ - Edit prompts
+ - Rearrange nodes
+ - Add missing branches
+ - Update conditions
+
+
+
+ Add features from the Configuration Panel:
+ - End Call triggers
+ - Transfer numbers
+ - Knowledge Base
+ - Variables
+ - API Calls
+
+
+
+---
+
+## Next Steps
+
+
+
+ Refine your Single Prompt agent
+
+
+ Deprecated
+
+ Master workflow building
+
+
+ Voice, model, and features
+
+
+ Validate before deploying
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/create-with-ai/configuration.mdx b/fern/products/atoms/pages/platform/building-agents/create-with-ai/configuration.mdx
new file mode 100644
index 0000000..8166c35
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/create-with-ai/configuration.mdx
@@ -0,0 +1,135 @@
+---
+title: "Configuration Options"
+sidebarTitle: "Configuration Options"
+description: "Settings available when using Create with AI."
+---
+
+When using Create with AI, the left panel contains configuration options that shape your generated agent. This page explains each setting.
+
+
+ [IMAGE: Left panel of Create with AI with all fields visible]
+
+
+---
+
+## Configuration Fields
+
+| Field | Type | Required | Description |
+|-------|------|----------|-------------|
+| Select agent type | Dropdown | Yes | Single prompt or Conversational flow |
+| Select agent call direction | Dropdown | Yes | Inbound or Outbound |
+| Use Emotive Model | Toggle | No | Enable speech-to-speech with emotion |
+| Select a voice | Dropdown | Yes | Choose from voice library |
+| Select knowledge base | Dropdown | No | Attach existing KB |
+
+---
+
+## Agent Type
+
+Choose what type of agent the AI will generate:
+
+| Option | Description |
+|--------|-------------|
+| **Single prompt** | AI generates one comprehensive prompt for flexible conversations |
+| **Conversational flow** | AI creates a visual workflow with nodes and branches |
+
+**How to choose:**
+- Single prompt → Open-ended, flexible conversations
+- Conversational flow → Structured, goal-oriented conversations
+
+---
+
+## Call Direction
+
+Define whether this agent receives or makes calls:
+
+| Direction | Description | Use Cases |
+|-----------|-------------|-----------|
+| **Inbound** | Agent receives calls from customers | Support, FAQ, orders |
+| **Outbound** | Agent makes calls to customers | Reminders, campaigns, follow-ups |
+
+This affects how the AI generates the opening of conversations:
+- Inbound: Agent answers and greets caller
+- Outbound: Agent initiates and introduces purpose
+
+---
+
+## Emotive Model (Beta)
+
+Toggle to enable speech-to-speech AI with emotional expression.
+
+| State | Behavior |
+|-------|----------|
+| **OFF** | Standard text-to-speech, consistent tone |
+| **ON** | Emotive model with natural emotional variation |
+
+**When to use Emotive Model:**
+- Conversations requiring warmth and empathy
+- Sales calls needing enthusiasm
+- Support calls needing patience
+
+**Considerations:**
+- Beta feature — may have quirks
+- More natural sounding
+- Slightly higher latency possible
+
+---
+
+## Voice Selection
+
+Choose the voice your agent will use.
+
+Clicking the dropdown opens the voice picker:
+- Search by language, accent
+- Filter by gender, age, model
+- Preview voices before selecting
+
+**Tip:** Choose a voice that matches your brand personality:
+- Professional service → Clear, neutral voice
+- Friendly support → Warm, approachable voice
+- Sales → Energetic, confident voice
+
+---
+
+## Knowledge Base
+
+Optionally attach a knowledge base for the agent to reference.
+
+| Option | Description |
+|--------|-------------|
+| **None** | Agent relies only on prompt |
+| **[Your KB]** | Agent can reference KB content |
+
+**When to attach:**
+- Agent needs to answer detailed questions
+- You have FAQs, docs, or product info
+- Accuracy from specific sources matters
+
+**Note:** You must create a Knowledge Base first before it appears here. See [Knowledge Base](/atoms/atoms-platform/features/knowledge-base) for setup.
+
+---
+
+## Field Requirements
+
+| Field | Validation |
+|-------|------------|
+| Agent type | Must select one |
+| Call direction | Must select one |
+| Voice | Must select one |
+| Emotive Model | Optional toggle |
+| Knowledge base | Optional selection |
+
+You cannot proceed without completing required fields.
+
+---
+
+## What's Next
+
+
+
+ Master each required prompt
+
+
+ Start from pre-built examples
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/create-with-ai/four-prompts.mdx b/fern/products/atoms/pages/platform/building-agents/create-with-ai/four-prompts.mdx
new file mode 100644
index 0000000..7c32689
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/create-with-ai/four-prompts.mdx
@@ -0,0 +1,189 @@
+---
+title: "Writing the Four Prompts"
+sidebarTitle: "Writing the Four Prompts"
+description: "Master each required prompt section in Create with AI."
+---
+
+Create with AI requires four prompts that define your agent's behavior. Each prompt focuses on a specific aspect, and together they create a complete picture for the AI to work from.
+
+
+ [IMAGE: Right panel showing all four prompt input fields]
+
+
+
+All prompts require a minimum of 50 characters.
+
+
+---
+
+## Prompt 1: Role & Objective
+
+**Label:** "Provide the role & objective of your agent*"
+
+**Purpose:** Define who the agent is and what it's trying to achieve.
+
+### What to Include
+
+- Agent's identity/persona
+- Company they represent
+- Primary goal of conversations
+- Tone and personality
+- Key responsibilities
+
+### Example
+
+```
+You are a friendly and confident customer support agent for a
+fintech platform. Your goal is to quickly understand the user's
+issue, respond with empathy, and provide clear, step-by-step
+solutions that make them feel heard and supported. Maintain a
+calm and reassuring tone throughout the conversation, ensuring
+that the user feels confident in your assistance. Only mark the
+issue as resolved once the user has confirmed they are fully
+satisfied with the outcome.
+```
+
+### Tips
+
+- Be specific about personality ("friendly and confident" not just "helpful")
+- State the goal clearly
+- Include tone guidance
+
+---
+
+## Prompt 2: Conversational Flow
+
+**Label:** "Provide conversational flow that the agent should follow*"
+
+**Purpose:** Define the step-by-step structure of conversations.
+
+### What to Include
+
+- How to open conversations
+- Key questions to ask
+- Order of information gathering
+- How to handle different scenarios
+- When to provide what information
+
+### Example
+
+```
+As a NorthLoop Support agent, greet customers warmly and confirm
+they are NorthLoop customers. Ask one focused question to identify
+if the issue is billing or connectivity. For connectivity, get the
+service address; for billing, collect the email or phone number.
+Verify the account and, if needed, try an alternate identifier.
+Diagnose the issue: check for outages first, then guide through
+reboot or cabling steps. If the outage lasted over four hours,
+issue a refund. If local fixes fail, schedule a technician.
+Confirm resolution and next steps, invite questions, and close
+politely.
+```
+
+### Tips
+
+- Think step-by-step
+- Cover different paths (billing vs. technical)
+- Include resolution confirmation
+
+---
+
+## Prompt 3: Dos, Don'ts & Fallbacks
+
+**Label:** "Set your agent's dos, don'ts, and fallback behaviors -- especially for edge cases or sensitive situations*"
+
+**Purpose:** Define behavioral guardrails and edge case handling.
+
+### What to Include
+
+- Things the agent should always do
+- Things the agent should never do
+- How to handle difficult situations
+- Escalation triggers
+- Fallback responses
+
+### Example
+
+```
+Your agent should always remain calm, polite, and solution-oriented.
+Do listen actively, show empathy, and provide clear next steps at
+every stage. Don't make assumptions, overpromise, or share
+unverified information. In edge cases like account lookup failures,
+incomplete verification, or unclear issues, fall back to offering
+general guidance, escalate politely when needed, and reassure the
+customer that their concern will be handled promptly. Always
+prioritize accuracy, empathy, and clarity over speed.
+```
+
+### Tips
+
+- Be explicit about what NOT to do
+- Include fallback behaviors
+- Cover sensitive situations (angry customers, privacy)
+
+---
+
+## Prompt 4: End Conditions
+
+**Label:** "Specify the conditions under which the call should end*"
+
+**Purpose:** Define when and how conversations should conclude.
+
+### What to Include
+
+- Successful resolution triggers
+- Customer-initiated endings
+- Transfer completions
+- Timeout/unresponsive handling
+- Failed conversation handling
+
+### Examples
+
+```
+Issue fully resolved and customer confirms satisfaction
+```
+
+```
+Customer requests to end the call
+```
+
+```
+Successful transfer to human agent completed
+```
+
+```
+Customer becomes unresponsive after 3 attempts to re-engage
+```
+
+### Tips
+
+- Cover positive endings (resolved)
+- Cover neutral endings (customer done)
+- Cover negative endings (can't help)
+- Include unresponsive scenarios
+
+---
+
+## Complete Example
+
+Here's how all four prompts work together:
+
+| Prompt | Summary |
+|--------|---------|
+| **1. Role & Objective** | "You are Alex, a support agent for TechCorp. Help with orders and returns. Be friendly and patient." |
+| **2. Conversational Flow** | "Greet warmly. Ask if calling about existing order or new question. For orders, get order number. Verify. Help resolve. Confirm satisfaction." |
+| **3. Dos, Don'ts & Fallbacks** | "Do: verify before changes. Don't: promise refunds over $100. Fallback: transfer to supervisor for complex issues." |
+| **4. End Conditions** | "End when: issue resolved and confirmed, customer says goodbye, successful transfer, or no response after 3 tries." |
+
+---
+
+## What's Next
+
+
+
+ Start from pre-built examples
+
+
+ Review the full process
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/create-with-ai/how-it-works.mdx b/fern/products/atoms/pages/platform/building-agents/create-with-ai/how-it-works.mdx
new file mode 100644
index 0000000..de3b624
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/create-with-ai/how-it-works.mdx
@@ -0,0 +1,149 @@
+---
+title: "How Create with AI Works"
+sidebarTitle: "How It Works"
+description: "AI-assisted agent creation for faster setup."
+---
+
+Create with AI accelerates agent building by generating prompts from your descriptions. Instead of writing everything from scratch, you describe what you want, and AI helps create it.
+
+
+ [IMAGE: Create with AI full page showing left config panel and right prompts panel]
+
+
+---
+
+## Overview
+
+Create with AI is a guided process that:
+
+1. Takes your configuration choices (agent type, voice, etc.)
+2. Accepts your descriptions of what the agent should do
+3. Generates a complete agent based on your input
+4. Delivers a fully customizable agent in the standard editor
+
+Think of it as a smart starting point. You provide the requirements, AI does the heavy lifting, and you refine the result.
+
+---
+
+## The Process
+
+### Step 1: Select Create with AI
+
+From the "Create Agent" modal, click **"Create with AI"**.
+
+### Step 2: Configure Left Panel
+
+Set basic agent settings:
+- Agent type (Single Prompt or Conversational Flow)
+- Call direction (Inbound or Outbound)
+- Voice selection
+- Knowledge Base (optional)
+- Emotive Model toggle (optional)
+
+### Step 3: Fill Four Prompts (Right Panel)
+
+Describe your agent across four sections:
+1. **Role & Objective** — Who is the agent and what's the goal?
+2. **Conversational Flow** — How should conversations progress?
+3. **Dos, Don'ts & Fallbacks** — Behavioral guidelines
+4. **End Conditions** — When should calls end?
+
+Each prompt requires at least 50 characters.
+
+### Step 4: Click Create
+
+Click **"Create agent"** button.
+
+### Step 5: Wait for Generation
+
+A loading modal appears:
+
+
+ [IMAGE: Loading modal with progress steps]
+
+
+```
+Hold up, your agent is getting ready
+
+✅ Analyzing requirements
+✅ Designing prompt
+⏳ Creating your agent
+```
+
+Generation takes about 30-60 seconds.
+
+### Step 6: Review and Customize
+
+After generation, you land in the standard agent editor. Everything is fully editable:
+- Modify the generated prompt
+- Adjust voice settings
+- Add knowledge base
+- Configure all options
+
+---
+
+## What Gets Generated
+
+Depending on your agent type:
+
+**Single Prompt Agent:**
+- Complete prompt covering all four sections
+- Voice and model configuration
+- Ready for testing
+
+**Conversational Flow Agent:**
+- Visual workflow with nodes
+- Prompts for each node
+- Basic branching structure
+- Ready for refinement
+
+---
+
+## Pro Tips
+
+
+**Use caller context (like past tickets) to greet by name. Even a small touch of personalization boosts trust.**
+
+
+### Be Specific in Descriptions
+
+The more detail you provide, the better the output:
+
+**Vague:** "Help customers with orders"
+
+**Specific:** "Help customers track existing orders, process returns within 30 days, and answer questions about shipping times. Always verify the order number before providing details."
+
+### Use Templates as Starting Points
+
+If your use case is similar to a template, start there. Templates provide well-structured examples that AI can build on.
+
+### Plan to Refine
+
+AI generation is a starting point, not a final product. Expect to:
+- Review and adjust prompts
+- Test thoroughly
+- Iterate based on conversations
+
+---
+
+## After Generation
+
+Your agent is ready but not deployed. Next steps:
+
+1. **Test** — Use Test Agent to verify behavior
+2. **Refine** — Adjust prompts based on testing
+3. **Configure** — Set up end call, transfers, webhooks
+4. **Deploy** — Assign phone number or embed widget
+
+---
+
+## What's Next
+
+
+
+ Understand all settings
+
+
+ Master each prompt section
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/create-with-ai/templates.mdx b/fern/products/atoms/pages/platform/building-agents/create-with-ai/templates.mdx
new file mode 100644
index 0000000..252606d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/create-with-ai/templates.mdx
@@ -0,0 +1,165 @@
+---
+title: "Using Templates"
+sidebarTitle: "Using Templates"
+description: "Start from pre-built examples to accelerate agent creation."
+---
+
+Templates provide pre-written prompts for common use cases. Instead of starting from scratch, you can use a template as a foundation and customize it for your needs.
+
+
+ [IMAGE: Template tabs showing Real Estate, Credit Card, Customer Support, General Sales, Onboarding Assist]
+
+
+---
+
+## Available Templates
+
+| Template | Use Case |
+|----------|----------|
+| **Real Estate** | Property inquiries, scheduling viewings, buyer/seller support |
+| **Credit Card** | Card services, payment inquiries, account management |
+| **Customer Support Electronics** | Tech support, troubleshooting, warranty questions |
+| **General Sales** | Lead qualification, product information, demo scheduling |
+| **Onboarding Assist** | New user guidance, setup help, feature introduction |
+
+---
+
+## How to Use Templates
+
+### Step 1: Open Create with AI
+
+From the "Create Agent" modal, select **"Create with AI"**.
+
+### Step 2: Click a Template Tab
+
+At the top of the right panel, you'll see template tabs. Click the one closest to your use case.
+
+### Step 3: Review Pre-Filled Content
+
+The template fills all four prompt sections with example content tailored to that use case.
+
+### Step 4: Customize
+
+Edit each prompt to match your specific needs:
+- Change company names
+- Adjust products/services mentioned
+- Modify procedures to match your process
+- Update escalation paths
+
+### Step 5: Create
+
+Click **"Create agent"** to generate.
+
+---
+
+## Template Details
+
+### Real Estate
+
+Pre-filled for property-focused conversations:
+- Greeting potential buyers/sellers
+- Qualifying interest level
+- Scheduling property viewings
+- Answering property questions
+- Capturing contact information
+
+### Credit Card
+
+Pre-filled for card service support:
+- Account verification
+- Balance and payment inquiries
+- Card activation
+- Dispute handling
+- Security concerns
+
+### Customer Support Electronics
+
+Pre-filled for tech support:
+- Troubleshooting common issues
+- Warranty verification
+- Return/exchange process
+- Technical guidance
+- Escalation to specialists
+
+### General Sales
+
+Pre-filled for lead engagement:
+- Initial qualification
+- Understanding needs
+- Product/service matching
+- Demo scheduling
+- Follow-up coordination
+
+### Onboarding Assist
+
+Pre-filled for new user support:
+- Welcome and orientation
+- Feature walkthroughs
+- Setup assistance
+- Best practices
+- Resource direction
+
+---
+
+## Customizing Templates
+
+Templates are starting points. Always customize:
+
+### Replace Placeholder Content
+
+Templates use generic names like "[Company Name]" or "[Product]". Replace these with your actual information.
+
+### Adjust Procedures
+
+Your processes may differ from the template. Update steps to match how your team actually works.
+
+### Add Specifics
+
+Templates are generic by design. Add:
+- Your specific products/services
+- Your pricing (if applicable)
+- Your escalation procedures
+- Your verification requirements
+
+### Remove Irrelevant Sections
+
+If a template includes something you don't need, remove it. Simpler is often better.
+
+---
+
+## Clear All Button
+
+If you've selected a template but want to start fresh:
+
+1. Find the **"Clear All"** button
+2. Click to reset all four prompts to blank
+3. Start writing from scratch or choose a different template
+
+---
+
+## Best Practices
+
+### Choose the Closest Match
+
+If no template is perfect, choose the closest one. It's easier to modify existing content than start from nothing.
+
+### Test Before Deploying
+
+Template-based agents still need testing. Run through conversations to verify the generated agent works for your use case.
+
+### Iterate
+
+Your first version won't be perfect. Use conversation logs to identify issues and refine the prompts.
+
+---
+
+## What's Next
+
+
+
+ Master writing effective prompts
+
+
+ Explore full configuration options
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/images/README.md b/fern/products/atoms/pages/platform/building-agents/images/README.md
new file mode 100644
index 0000000..bac4bf9
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/images/README.md
@@ -0,0 +1,178 @@
+# Building Agents — Image Guide
+
+Drop screenshots and diagrams here. Name them exactly as listed below.
+
+---
+
+## Overview Page
+
+| Filename | What to capture |
+|----------|-----------------|
+| `create-agent-modal.png` | The "Create a new agent" modal showing all 3 options (Start from scratch, Start with Template, Create with AI) |
+
+---
+
+## Single Prompt Section
+
+| Filename | What to capture |
+|----------|-----------------|
+| `sp-editor-full.png` | Full Single Prompt editor with a sample prompt filled in. Show top bar, prompt area, right sidebar. |
+| `sp-editor-blank.png` | Blank Single Prompt editor (fresh agent) |
+| `sp-test-modal.png` | "Test Agent" modal showing the 3 test modes |
+| `sp-voice-picker.png` | Voice picker panel with filters visible |
+| `sp-config-panel.png` | Right sidebar configuration panel with toggles visible |
+
+---
+
+## Conversational Flow Section
+
+| Filename | What to capture |
+|----------|-----------------|
+| `cf-builder-full.png` | Workflow builder with a sample flow (5-7 nodes connected) |
+| `cf-builder-blank.png` | Empty workflow builder canvas |
+| `cf-node-palette.png` | Left panel node palette showing all node types |
+| `cf-node-config.png` | A node selected with its configuration panel open |
+| `cf-branch-example.png` | A node with multiple branches/conditions visible |
+
+---
+
+## Create with AI
+
+| Filename | What to capture |
+|----------|-----------------|
+| `ai-create-full.png` | Full Create with AI page (left config panel + right prompts) |
+| `ai-create-loading.png` | The loading modal ("Hold up, your agent is getting ready") |
+| `ai-templates.png` | Template tabs visible (Real Estate, Credit Card, etc.) |
+
+---
+
+## Configuring Section
+
+| Filename | What to capture |
+|----------|-----------------|
+| `config-editor-overview.png` | Full editor with all areas labeled/annotated |
+| `config-model-dropdown.png` | Model selection dropdown expanded |
+| `config-voice-picker.png` | Voice picker panel open |
+| `end-call-modal.png` | Add End Call modal (Name + Description fields) |
+| `transfer-call-modal.png` | Transfer Call configuration modal |
+| `transfer-call-warm.png` | Warm transfer options (expanded modal) |
+| `variables-user.png` | User Defined variables tab |
+| `variables-system.png` | System variables tab |
+| `variables-api.png` | API variables tab |
+| `api-call-basic.png` | API Call modal - top section (Name, Description, LLM Params, URL, Method, Timeout) |
+| `api-call-advanced.png` | API Call modal - bottom section (Headers, Query Params, Response Variable Extraction) |
+| `config-webhook-modal.png` | Webhook configuration modal |
+
+### Voice Settings
+
+| Filename | What to capture |
+|----------|-----------------|
+| `voice-settings.png` | Full Voice tab with all sections visible |
+| `add-pronunciation.png` | Add Pronunciation modal (Word + Pronunciation fields) |
+
+### Model Settings
+
+| Filename | What to capture |
+|----------|-----------------|
+| `model-settings-sp.png` | Model tab for Single Prompt agent |
+| `model-settings-cf.png` | Model tab for Conversational Flow agent (shows Global Prompt + KB) |
+
+### Phone Number
+
+| Filename | What to capture |
+|----------|-----------------|
+| `phone-number-settings.png` | Phone Number tab showing dropdown |
+
+### General Settings
+
+| Filename | What to capture |
+|----------|-----------------|
+| `general-settings.png` | General tab showing 3 timeout fields |
+
+### Widget
+
+| Filename | What to capture |
+|----------|-----------------|
+| `widget-embed.png` | Embed code section |
+| `widget-mode.png` | Mode selection (Chat/Voice) |
+| `widget-allowlist.png` | Allowlist configuration |
+| `widget-tiny.png` | Widget in Tiny variant |
+| `widget-compact.png` | Widget in Compact variant |
+| `widget-full.png` | Widget in Full variant |
+
+### Post-Call Metrics
+
+| Filename | What to capture |
+|----------|-----------------|
+| `post-call-metrics-list.png` | Landing page showing list of configured metrics |
+| `post-call-disposition.png` | Disposition Metrics form (creating from scratch) |
+| `post-call-templates.png` | Templates selection panel |
+
+---
+
+## Testing & Launch
+
+| Filename | What to capture |
+|----------|-----------------|
+| `test-webcall.png` | Web Call test interface |
+| `test-telephony.png` | Telephony test interface |
+| `test-chat.png` | Chat test interface |
+| `lock-agent.png` | Lock Agent toggle |
+| `convo-logs-list.png` | Call Logs landing page with list of calls |
+| `convo-logs-overview.png` | Call details - Overview tab |
+| `convo-logs-transcript.png` | Call details - Transcript tab |
+| `convo-logs-events.png` | Call details - Events tab |
+| `convo-logs-metrics.png` | Call details - Metrics tab |
+
+---
+
+## Deployment — Phone Numbers
+
+| Filename | What to capture |
+|----------|-----------------|
+| `phone-numbers.png` | Main Phone Numbers page with list |
+| `rent-number.png` | Rent Number modal |
+| `import-sip.png` | Import SIP Number modal |
+
+---
+
+## Deployment — Audiences
+
+| Filename | What to capture |
+|----------|-----------------|
+| `audiences.png` | Main Audiences list page |
+| `upload-csv.png` | Step 1: Upload CSV with consent warning |
+| `map-phone.png` | Step 2: Map Phone Number with dropdown + CSV preview |
+| `add-contacts.png` | Step 3: Audience Name and Description fields |
+| `audience-members.png` | Individual audience view with members table |
+| `add-manually.png` | Add members modal — "Add Manually" tab |
+| `import-csv.png` | Add members modal — "Import CSV" tab |
+
+---
+
+## Deployment — Campaigns
+
+| Filename | What to capture |
+|----------|-----------------|
+| `campaigns.png` | Main Campaigns list page |
+| `create-campaign.png` | Create Campaign form with all fields |
+| `campaign-call-logs.png` | Campaign detail — Call Logs tab |
+| `campaign-events.png` | Campaign detail — Campaign Events tab |
+| `campaign-executions.png` | Campaign detail — Executions tab |
+
+---
+
+## Analytics
+
+| Filename | What to capture |
+|----------|-----------------|
+| `analytics.png` | Full Analytics dashboard with filters, summary cards, charts, and Most Called Agents table |
+
+---
+
+## Notes
+
+- **Format:** PNG preferred, keep under 500KB each
+- **Size:** Capture at 2x resolution if possible for retina displays
+- **Annotations:** If you want callouts/arrows, add them before saving
+- **Sensitive data:** Blur or use fake data for any real customer info
diff --git "a/fern/products/atoms/pages/platform/building-agents/images/Screenshot 2026-01-28 at 9.04.27\342\200\257AM.png" "b/fern/products/atoms/pages/platform/building-agents/images/Screenshot 2026-01-28 at 9.04.27\342\200\257AM.png"
new file mode 100644
index 0000000..229cbdd
Binary files /dev/null and "b/fern/products/atoms/pages/platform/building-agents/images/Screenshot 2026-01-28 at 9.04.27\342\200\257AM.png" differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/add-contacts.png b/fern/products/atoms/pages/platform/building-agents/images/add-contacts.png
new file mode 100644
index 0000000..3bfe0d1
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/add-contacts.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/add-manually.png b/fern/products/atoms/pages/platform/building-agents/images/add-manually.png
new file mode 100644
index 0000000..b65b0c7
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/add-manually.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/add-pronunciation.png b/fern/products/atoms/pages/platform/building-agents/images/add-pronunciation.png
new file mode 100644
index 0000000..8e89a3c
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/add-pronunciation.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/analytics.png b/fern/products/atoms/pages/platform/building-agents/images/analytics.png
new file mode 100644
index 0000000..f1916c0
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/analytics.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/api-call-advanced.png b/fern/products/atoms/pages/platform/building-agents/images/api-call-advanced.png
new file mode 100644
index 0000000..23fa11c
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/api-call-advanced.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/api-call-basic.png b/fern/products/atoms/pages/platform/building-agents/images/api-call-basic.png
new file mode 100644
index 0000000..9c08aa0
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/api-call-basic.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/audience-members.png b/fern/products/atoms/pages/platform/building-agents/images/audience-members.png
new file mode 100644
index 0000000..2c0b26b
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/audience-members.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/audiences.png b/fern/products/atoms/pages/platform/building-agents/images/audiences.png
new file mode 100644
index 0000000..5239ddc
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/audiences.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/browse-select-template.png b/fern/products/atoms/pages/platform/building-agents/images/browse-select-template.png
new file mode 100644
index 0000000..573d28d
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/browse-select-template.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/campaign-call-logs.png b/fern/products/atoms/pages/platform/building-agents/images/campaign-call-logs.png
new file mode 100644
index 0000000..5fdfd8b
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/campaign-call-logs.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/campaign-events.png b/fern/products/atoms/pages/platform/building-agents/images/campaign-events.png
new file mode 100644
index 0000000..6cf0688
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/campaign-events.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/campaign-executions.png b/fern/products/atoms/pages/platform/building-agents/images/campaign-executions.png
new file mode 100644
index 0000000..b9ea357
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/campaign-executions.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/campaigns.png b/fern/products/atoms/pages/platform/building-agents/images/campaigns.png
new file mode 100644
index 0000000..81f65c4
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/campaigns.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-add-pronunciation.png b/fern/products/atoms/pages/platform/building-agents/images/cf-add-pronunciation.png
new file mode 100644
index 0000000..8e89a3c
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-add-pronunciation.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-branching-example.png b/fern/products/atoms/pages/platform/building-agents/images/cf-branching-example.png
new file mode 100644
index 0000000..d7f0cf3
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-branching-example.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-editor-settings-tab.png b/fern/products/atoms/pages/platform/building-agents/images/cf-editor-settings-tab.png
new file mode 100644
index 0000000..7744c07
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-editor-settings-tab.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-editor-workflow-tab.png b/fern/products/atoms/pages/platform/building-agents/images/cf-editor-workflow-tab.png
new file mode 100644
index 0000000..98417e1
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-editor-workflow-tab.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-general-settings.png b/fern/products/atoms/pages/platform/building-agents/images/cf-general-settings.png
new file mode 100644
index 0000000..76f653e
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-general-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-languages-tab.png b/fern/products/atoms/pages/platform/building-agents/images/cf-languages-tab.png
new file mode 100644
index 0000000..045fd96
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-languages-tab.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-model-settings.png b/fern/products/atoms/pages/platform/building-agents/images/cf-model-settings.png
new file mode 100644
index 0000000..0d7f85d
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-model-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-api-call.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-api-call.png
new file mode 100644
index 0000000..26f6a36
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-api-call.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-default.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-default.png
new file mode 100644
index 0000000..969e042
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-default.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-end-call.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-end-call.png
new file mode 100644
index 0000000..faafda4
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-end-call.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-post-call-api.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-post-call-api.png
new file mode 100644
index 0000000..7694840
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-post-call-api.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-pre-call-api.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-pre-call-api.png
new file mode 100644
index 0000000..a438661
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-pre-call-api.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-node-transfer-call.png b/fern/products/atoms/pages/platform/building-agents/images/cf-node-transfer-call.png
new file mode 100644
index 0000000..c5d1310
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-node-transfer-call.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-phone-number.png b/fern/products/atoms/pages/platform/building-agents/images/cf-phone-number.png
new file mode 100644
index 0000000..0042961
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-phone-number.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-variables-panel.png b/fern/products/atoms/pages/platform/building-agents/images/cf-variables-panel.png
new file mode 100644
index 0000000..969e042
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-variables-panel.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-voice-settings.png b/fern/products/atoms/pages/platform/building-agents/images/cf-voice-settings.png
new file mode 100644
index 0000000..3b5d8ac
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-voice-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/cf-workflow-builder.png b/fern/products/atoms/pages/platform/building-agents/images/cf-workflow-builder.png
new file mode 100644
index 0000000..98417e1
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/cf-workflow-builder.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/choose-start-with-template.png b/fern/products/atoms/pages/platform/building-agents/images/choose-start-with-template.png
new file mode 100644
index 0000000..b1d6fff
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/choose-start-with-template.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/configure-agent-editor.png b/fern/products/atoms/pages/platform/building-agents/images/configure-agent-editor.png
new file mode 100644
index 0000000..209d2f5
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/configure-agent-editor.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/convo-logs-events.png b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-events.png
new file mode 100644
index 0000000..d3ab6d7
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-events.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/convo-logs-list.png b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-list.png
new file mode 100644
index 0000000..6adfe14
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-list.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/convo-logs-metrics.png b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-metrics.png
new file mode 100644
index 0000000..483f774
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-metrics.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/convo-logs-overview.png b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-overview.png
new file mode 100644
index 0000000..63e7247
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-overview.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/convo-logs-transcript.png b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-transcript.png
new file mode 100644
index 0000000..27848a5
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/convo-logs-transcript.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/create-agent-modal.png b/fern/products/atoms/pages/platform/building-agents/images/create-agent-modal.png
new file mode 100644
index 0000000..00e52d2
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/create-agent-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/create-campaign.png b/fern/products/atoms/pages/platform/building-agents/images/create-campaign.png
new file mode 100644
index 0000000..c9b2158
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/create-campaign.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/create-with-ai-modal.png b/fern/products/atoms/pages/platform/building-agents/images/create-with-ai-modal.png
new file mode 100644
index 0000000..10c9aac
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/create-with-ai-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/create-with-ai.png b/fern/products/atoms/pages/platform/building-agents/images/create-with-ai.png
new file mode 100644
index 0000000..efe2dcc
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/create-with-ai.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/customize-template-editor.png b/fern/products/atoms/pages/platform/building-agents/images/customize-template-editor.png
new file mode 100644
index 0000000..8fcd36e
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/customize-template-editor.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/dashboard.png b/fern/products/atoms/pages/platform/building-agents/images/dashboard.png
new file mode 100644
index 0000000..18bf541
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/dashboard.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/end-call-modal.png b/fern/products/atoms/pages/platform/building-agents/images/end-call-modal.png
new file mode 100644
index 0000000..f22e0f7
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/end-call-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/general-settings.png b/fern/products/atoms/pages/platform/building-agents/images/general-settings.png
new file mode 100644
index 0000000..93b4afc
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/general-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/import-csv.png b/fern/products/atoms/pages/platform/building-agents/images/import-csv.png
new file mode 100644
index 0000000..c9c6250
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/import-csv.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/import-sip.png b/fern/products/atoms/pages/platform/building-agents/images/import-sip.png
new file mode 100644
index 0000000..4f7593c
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/import-sip.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/integrations.png b/fern/products/atoms/pages/platform/building-agents/images/integrations.png
new file mode 100644
index 0000000..23c3ee0
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/integrations.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/kb-add-document.png b/fern/products/atoms/pages/platform/building-agents/images/kb-add-document.png
new file mode 100644
index 0000000..cc9245a
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/kb-add-document.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/kb-create-modal.png b/fern/products/atoms/pages/platform/building-agents/images/kb-create-modal.png
new file mode 100644
index 0000000..c490b73
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/kb-create-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/kb-with-documents.png b/fern/products/atoms/pages/platform/building-agents/images/kb-with-documents.png
new file mode 100644
index 0000000..a45c1f5
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/kb-with-documents.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/language-settings.png b/fern/products/atoms/pages/platform/building-agents/images/language-settings.png
new file mode 100644
index 0000000..5b7109b
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/language-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/lock-agent.png b/fern/products/atoms/pages/platform/building-agents/images/lock-agent.png
new file mode 100644
index 0000000..4553f60
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/lock-agent.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/map-phone.png b/fern/products/atoms/pages/platform/building-agents/images/map-phone.png
new file mode 100644
index 0000000..44a82ca
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/map-phone.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/model-dropdown.png b/fern/products/atoms/pages/platform/building-agents/images/model-dropdown.png
new file mode 100644
index 0000000..915ccbf
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/model-dropdown.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/model-settings-cf.png b/fern/products/atoms/pages/platform/building-agents/images/model-settings-cf.png
new file mode 100644
index 0000000..f17300b
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/model-settings-cf.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/model-settings-sp.png b/fern/products/atoms/pages/platform/building-agents/images/model-settings-sp.png
new file mode 100644
index 0000000..2f7f993
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/model-settings-sp.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/phone-number-settings.png b/fern/products/atoms/pages/platform/building-agents/images/phone-number-settings.png
new file mode 100644
index 0000000..447ae5a
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/phone-number-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/phone-numbers.png b/fern/products/atoms/pages/platform/building-agents/images/phone-numbers.png
new file mode 100644
index 0000000..3d17608
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/phone-numbers.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/post-call-disposition.png b/fern/products/atoms/pages/platform/building-agents/images/post-call-disposition.png
new file mode 100644
index 0000000..57c1ee0
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/post-call-disposition.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/post-call-metrics-list.png b/fern/products/atoms/pages/platform/building-agents/images/post-call-metrics-list.png
new file mode 100644
index 0000000..192b8cb
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/post-call-metrics-list.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/post-call-templates.png b/fern/products/atoms/pages/platform/building-agents/images/post-call-templates.png
new file mode 100644
index 0000000..404477e
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/post-call-templates.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/prompt-editor.png b/fern/products/atoms/pages/platform/building-agents/images/prompt-editor.png
new file mode 100644
index 0000000..9aa3bfa
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/prompt-editor.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/rent-number.png b/fern/products/atoms/pages/platform/building-agents/images/rent-number.png
new file mode 100644
index 0000000..7d08718
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/rent-number.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/salesforce-connect.png b/fern/products/atoms/pages/platform/building-agents/images/salesforce-connect.png
new file mode 100644
index 0000000..b7e7046
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/salesforce-connect.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/single-prompt-select.png b/fern/products/atoms/pages/platform/building-agents/images/single-prompt-select.png
new file mode 100644
index 0000000..bfb42e5
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/single-prompt-select.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/sp-editor.png b/fern/products/atoms/pages/platform/building-agents/images/sp-editor.png
new file mode 100644
index 0000000..9aa3bfa
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/sp-editor.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/start-from-scratch.png b/fern/products/atoms/pages/platform/building-agents/images/start-from-scratch.png
new file mode 100644
index 0000000..8ed16de
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/start-from-scratch.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/template-gallery.png b/fern/products/atoms/pages/platform/building-agents/images/template-gallery.png
new file mode 100644
index 0000000..a0496be
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/template-gallery.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/test-agent-from-template.png b/fern/products/atoms/pages/platform/building-agents/images/test-agent-from-template.png
new file mode 100644
index 0000000..c2712c6
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/test-agent-from-template.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/test-chat.png b/fern/products/atoms/pages/platform/building-agents/images/test-chat.png
new file mode 100644
index 0000000..e61207d
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/test-chat.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/test-telephony.png b/fern/products/atoms/pages/platform/building-agents/images/test-telephony.png
new file mode 100644
index 0000000..81d904d
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/test-telephony.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/test-webcall.png b/fern/products/atoms/pages/platform/building-agents/images/test-webcall.png
new file mode 100644
index 0000000..166166f
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/test-webcall.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/transfer-call-modal.png b/fern/products/atoms/pages/platform/building-agents/images/transfer-call-modal.png
new file mode 100644
index 0000000..835c0a5
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/transfer-call-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/transfer-call-warm.png b/fern/products/atoms/pages/platform/building-agents/images/transfer-call-warm.png
new file mode 100644
index 0000000..ffdabbe
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/transfer-call-warm.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/upload-csv.png b/fern/products/atoms/pages/platform/building-agents/images/upload-csv.png
new file mode 100644
index 0000000..919f358
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/upload-csv.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/variables-api.png b/fern/products/atoms/pages/platform/building-agents/images/variables-api.png
new file mode 100644
index 0000000..0cea222
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/variables-api.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/variables-system.png b/fern/products/atoms/pages/platform/building-agents/images/variables-system.png
new file mode 100644
index 0000000..9336235
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/variables-system.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/variables-user.png b/fern/products/atoms/pages/platform/building-agents/images/variables-user.png
new file mode 100644
index 0000000..1883754
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/variables-user.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/voice-picker.png b/fern/products/atoms/pages/platform/building-agents/images/voice-picker.png
new file mode 100644
index 0000000..c7fe423
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/voice-picker.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/voice-settings.png b/fern/products/atoms/pages/platform/building-agents/images/voice-settings.png
new file mode 100644
index 0000000..4c6b20f
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/voice-settings.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/webhook-agent.png b/fern/products/atoms/pages/platform/building-agents/images/webhook-agent.png
new file mode 100644
index 0000000..5cf932b
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/webhook-agent.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/webhook-create.png b/fern/products/atoms/pages/platform/building-agents/images/webhook-create.png
new file mode 100644
index 0000000..f227cf1
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/webhook-create.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/webhook-detail.png b/fern/products/atoms/pages/platform/building-agents/images/webhook-detail.png
new file mode 100644
index 0000000..683d4b9
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/webhook-detail.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/webhook-modal.png b/fern/products/atoms/pages/platform/building-agents/images/webhook-modal.png
new file mode 100644
index 0000000..03eaca7
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/webhook-modal.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/webhooks-dashboard.png b/fern/products/atoms/pages/platform/building-agents/images/webhooks-dashboard.png
new file mode 100644
index 0000000..747d8dd
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/webhooks-dashboard.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/widget-compact.png b/fern/products/atoms/pages/platform/building-agents/images/widget-compact.png
new file mode 100644
index 0000000..5cbcc0d
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/widget-compact.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/widget-full-variant.png b/fern/products/atoms/pages/platform/building-agents/images/widget-full-variant.png
new file mode 100644
index 0000000..c2398b4
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/widget-full-variant.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/widget-full.png b/fern/products/atoms/pages/platform/building-agents/images/widget-full.png
new file mode 100644
index 0000000..e68035a
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/widget-full.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/images/widget-tiny.png b/fern/products/atoms/pages/platform/building-agents/images/widget-tiny.png
new file mode 100644
index 0000000..b5d95ed
Binary files /dev/null and b/fern/products/atoms/pages/platform/building-agents/images/widget-tiny.png differ
diff --git a/fern/products/atoms/pages/platform/building-agents/overview.mdx b/fern/products/atoms/pages/platform/building-agents/overview.mdx
new file mode 100644
index 0000000..fff5936
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/overview.mdx
@@ -0,0 +1,116 @@
+---
+title: "Building Agents"
+sidebarTitle: "Overview"
+description: "Understand voice AI agents and choose the right type for your use case."
+---
+
+## What is an Agent?
+
+An agent is an AI-powered voice assistant that handles phone conversations in real time. It listens, understands, and responds — all within milliseconds. Agents can answer questions, look up information, take actions through connected tools, and guide callers through processes, whether that's checking an order, booking an appointment, or resolving a support issue.
+
+Unlike basic IVR systems or scripted bots, agents reason through conversations. They understand context, remember what was said earlier in the call, and adapt their responses accordingly. To the caller, it feels like talking to a knowledgeable human.
+
+---
+
+## Two Ways to Build
+
+Atoms gives you two approaches. They solve different problems.
+
+
+
+ **One prompt. Infinite conversations.**
+
+ You write a single set of instructions — who the agent is, what it knows, how it behaves. The AI handles whatever comes next.
+
+ Single Prompt agents can use **tools** dynamically. Need to check inventory? Look up an order? Book an appointment? The agent decides what to do based on the conversation.
+
+ ```
+ You're Alex from Rivian support. Help owners with
+ charging, features, and service questions.
+
+ You can:
+ - Look up vehicle details by VIN
+ - Check service center availability
+ - Schedule appointments
+
+ Be helpful and genuine. If something needs hands-on
+ service, offer to book it.
+ ```
+
+ The caller asks about charging, then mentions a weird noise, then wants to schedule service — the agent adapts, using the right tools as needed.
+
+
+
+ **A visual workflow. Predictable outcomes.**
+
+ You design the conversation as a flowchart — steps for each part, branches for different responses. The AI guides callers through your defined paths.
+
+ ```
+ [Greeting] → [Verify Identity] → [What's the issue?]
+ ↓
+ ┌─────────────────────┼─────────────────────┐
+ ↓ ↓ ↓
+ [Billing] [Technical] [Other]
+ ↓ ↓ ↓
+ [Lookup Account] [Troubleshoot] [Transfer]
+ ```
+
+ Every caller goes through the same steps. You control exactly what gets asked, when tools get called, and where each path leads. Nothing is left to chance.
+
+
+
+---
+
+## Which Should You Choose?
+
+| | Single Prompt | Conversational Flow |
+|---|---|---|
+| **How you build** | Write one prompt | Design a visual flowchart |
+| **Conversation style** | Flexible, adapts on the fly | Structured, follows defined paths |
+| **Tool usage** | Agent decides when to use tools | You define exactly when tools run |
+| **Best for** | Support, FAQ, info lines | Lead qualification, booking, intake |
+| **Setup time** | Minutes | Longer, but more control |
+
+**Decision guide:**
+
+| If you need... | Choose |
+|----------------|--------|
+| Quick setup with minimal configuration | Single Prompt |
+| Agent to handle unpredictable questions | Single Prompt |
+| Specific data collected in a specific order | Conversational Flow |
+| Different paths based on caller responses | Conversational Flow |
+| Compliance with a defined script | Conversational Flow |
+| Flexibility to handle topic changes | Single Prompt |
+
+
+**Not sure?** Start with Single Prompt. It's faster to set up, and you'll quickly learn whether you need more structure.
+
+
+---
+
+## Get Started
+
+To create an agent, head to **Agents** in the sidebar, then click the **Create Agent** button in the top right.
+
+
+ 
+
+
+| Method | What it is |
+|--------|------------|
+| **Start from scratch** | Blank canvas. Full control over every setting. |
+| **Start with Template** | Pre-built starting points for common use cases like support, sales, or booking. |
+| **Create with AI** | Describe what you want in plain language, and AI generates the agent for you. |
+
+All three methods work for both Single Prompt and Conversational Flow agents.
+
+
+
+ Flexible conversations powered by one prompt
+
+
+ Deprecated
+
+ Structured workflows with visual builder
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/ai-assisted.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/ai-assisted.mdx
new file mode 100644
index 0000000..35d7f7b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/ai-assisted.mdx
@@ -0,0 +1,91 @@
+---
+title: "AI-Assisted Creation"
+sidebarTitle: "AI-Assisted"
+description: "Let AI help you build your Single Prompt agent."
+---
+
+Don't want to start from scratch? Describe what you need, and our AI will generate a complete Single Prompt agent for you.
+
+
+ [IMAGE: Create with AI page showing configuration panel and prompt inputs]
+
+
+---
+
+## How It Works
+
+
+
+ Fill in four prompts describing what you want your agent to do.
+
+
+ Choose voice, model, and optional knowledge base.
+
+
+ AI generates your complete agent.
+
+
+ Your agent opens in the editor — tweak as needed.
+
+
+
+
+ [IMAGE: Loading modal showing "Analyzing requirements → Designing prompt → Creating your agent"]
+
+
+---
+
+## Single Prompt AI Tips
+
+When using Create with AI for Single Prompt agents:
+
+
+ The more context you provide about the agent's purpose, the better the generated prompt.
+
+ **Instead of:** "Customer support agent"
+
+ **Try:** "A friendly customer support agent for a B2B software company that helps users with account issues, billing questions, and basic troubleshooting"
+
+
+
+ Include personality traits in your description — the AI will weave them into the prompt.
+
+ **Example:** "Warm and approachable, uses simple language, occasionally adds light humor"
+
+
+
+ List the main subjects your agent should handle. The AI will structure the prompt around these.
+
+ **Example:** "Handles questions about pricing tiers, feature comparisons, trial extensions, and upgrade paths"
+
+
+
+ Tell the AI what the agent should NOT do — this creates important guardrails.
+
+ **Example:** "Should never quote specific prices, always directs pricing questions to sales team"
+
+
+---
+
+## Learn More
+
+The full Create with AI guide covers everything — from the four prompts to templates:
+
+
+ Complete guide to AI-assisted agent creation
+
+
+---
+
+## After Generation
+
+Once AI generates your agent, it opens in the standard editor. From there:
+
+
+
+ Polish the AI-generated content
+
+
+ Adjust voice, model, and features
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/creating.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/creating.mdx
new file mode 100644
index 0000000..c0f0f8a
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/creating.mdx
@@ -0,0 +1,154 @@
+---
+title: "Creating a Single Prompt Agent"
+sidebarTitle: "Creating Your Agent"
+description: "Step-by-step guide to building a Single Prompt agent."
+---
+
+This guide walks you through creating a Single Prompt agent from scratch. By the end, you'll have a working agent ready for testing.
+
+
+ [IMAGE: Blank single prompt editor with Prompt Section, Configuration Panel, and Left Sidebar labeled]
+
+
+---
+
+## Steps to Create
+
+### Step 1: Start Creation
+
+1. Click the green **"Create Agent"** button (top right of dashboard)
+2. Select **"Start from scratch"**
+3. Choose **"Single Prompt"**
+
+The agent editor opens.
+
+---
+
+### Step 2: Understand the Layout
+
+The editor has three main areas:
+
+| Area | Location | Purpose |
+|------|----------|---------|
+| **Prompt Section** | Top bar | Model, Voice, Language dropdowns |
+| **Prompt Editor** | Center | Write your agent's instructions |
+| **Configuration Panel** | Right sidebar | End Call, Transfer, KB, Variables, API Calls |
+
+**Left Sidebar Navigation:**
+
+| Item | Icon | Description |
+|------|------|-------------|
+| Prompt | 📄 | Main prompt editor (you are here) |
+| Agent Settings | ⚙️ | Voice, Model, Phone, Webhook, General tabs |
+| Widget | `>` | Embed widget configuration |
+| Integrations | 🔗 | Third-party connections |
+| Post Call Metrics | 📊 | Analytics configuration |
+
+**Top Right Actions:**
+
+| Button | Function |
+|--------|----------|
+| Convo Logs | View conversation transcripts |
+| Lock Agent | Prevent accidental edits |
+| Test Agent | Test via Telephony/Web/Chat |
+
+**Header Info:**
+- Back arrow (←) — return to agents list
+- Agent name — click to rename
+- Agent ID — click to copy
+
+---
+
+### Step 3: Configure Basic Settings
+
+**In the Prompt Section (top bar):**
+
+1. **Model** — Select your LLM (GPT-4o recommended)
+2. **Voice** — Choose from the voice library
+3. **Language** — Set primary language
+
+Click each dropdown to see options. For voices, use the play button to preview.
+
+---
+
+### Step 4: Write Your Prompt
+
+In the center Prompt Editor, write instructions for your agent. A good prompt includes:
+
+1. **Role** — Who is the agent?
+2. **Objective** — What should it accomplish?
+3. **Key Information** — What should it know?
+4. **Guidelines** — How should it behave?
+5. **End Conditions** — When should it end calls?
+
+**Example Prompt:**
+
+```
+You are an agent which tells the users about Smallest.ai.
+
+Smallest.ai is a unified AI platform that specializes in real-time
+applications using small language models (SLMs). The company focuses
+on providing fast, efficient, and hyper-personalized AI solutions.
+
+Key advantages to mention:
+1. Small Models: Easier integrations and faster fine-tuning
+2. Hyper Personalization: SLMs that actively learn from interactions
+3. Minimal Latency: 100ms streaming responses
+4. On Edge Deployment: Works from mobile to enterprise clouds
+5. Low Cost: 10x cheaper than traditional large models
+
+Be friendly, concise, and helpful. Keep responses under 30 words
+when possible. If you don't know something, say so honestly.
+```
+
+---
+
+### Step 5: Configure Right Panel (Optional)
+
+The Configuration Panel offers additional features:
+
+| Feature | Purpose |
+|---------|---------|
+| End Call | Define when AI terminates calls |
+| Transfer Call | Set up human handoffs |
+| Knowledge Base | Attach reference documents |
+| Variables | Add dynamic values |
+| API Calls | Connect external services |
+
+Toggle each feature ON and click the settings icon (⚙️) to configure.
+
+---
+
+### Step 6: Test Your Agent
+
+1. Click **"Test Agent"** (top right)
+2. Choose test mode:
+ - **Telephony Call** — Real phone call
+ - **Web Call** — Browser voice call
+ - **Chat** — Text-only
+3. Have a conversation
+4. Check Convo Logs to review
+
+---
+
+## Your Agent is Ready
+
+You now have a working Single Prompt agent. From here, you can:
+
+- Refine your prompt based on test conversations
+- Add a Knowledge Base for more information
+- Configure voice settings in Agent Settings
+- Deploy to a phone number or widget
+
+---
+
+## What's Next
+
+
+
+ Master prompt engineering
+
+
+ Explore all configuration options
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/from-template.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/from-template.mdx
new file mode 100644
index 0000000..0795392
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/from-template.mdx
@@ -0,0 +1,236 @@
+---
+title: "From Template"
+sidebarTitle: "From Template"
+description: "Jumpstart your Single Prompt agent with pre-built templates."
+---
+
+Templates give you a proven starting point. Pick one that matches your use case, customize it, and you're ready to go.
+
+
+ [IMAGE: Grid of template cards showing different use cases]
+
+
+---
+
+## Available Templates
+
+
+
+ Handle support inquiries, troubleshooting, and general help. Pre-configured with common support patterns.
+
+
+ Qualify leads, answer product questions, and guide potential customers.
+
+
+ Handle property inquiries, schedule viewings, and collect buyer/renter information.
+
+
+ Handle card services, payment inquiries, and account questions.
+
+
+ Technical troubleshooting and product support for electronics.
+
+
+ Guide new users through setup and initial questions.
+
+
+
+---
+
+## How to Use a Template
+
+
+
+ From your dashboard, click the green **Create Agent** button.
+
+
+ [IMAGE: Dashboard with Create Agent button highlighted]
+
+
+
+
+ Choose the second option in the modal.
+
+
+ [IMAGE: Modal with "Start with Template" highlighted]
+
+
+
+
+ Select the Single Prompt agent type.
+
+
+ [IMAGE: Single Prompt option selected]
+
+
+
+
+ Explore available templates. Click any to preview.
+
+
+ [IMAGE: Template cards with preview option]
+
+
+
+
+ Click **Use Template** to load it into the editor.
+
+
+ [IMAGE: Editor with template prompt pre-filled]
+
+
+
+
+---
+
+## What Templates Include
+
+Each template comes pre-configured with:
+
+| Component | What's Included |
+|-----------|-----------------|
+| **Prompt** | Complete prompt with role, objectives, guidelines |
+| **Suggested Voice** | Voice that fits the use case |
+| **Example Scenarios** | Common conversations the agent should handle |
+| **Best Practices** | Tips specific to that use case |
+
+
+ [IMAGE: Editor showing template with annotations pointing to included elements]
+
+
+---
+
+## Customizing Your Template
+
+Templates are starting points, not final products. Always customize for your business.
+
+
+
+ Replace placeholder text with your specifics:
+
+ ```diff
+ - You are a support agent for [Company].
+ + You are a support agent for Acme Corporation.
+
+ - Our support hours are [hours].
+ + Our support hours are 9am-6pm EST.
+ ```
+
+
+ [IMAGE: Prompt with [Company] and [hours] placeholders visible]
+
+
+
+
+ Update with your actual business rules:
+
+ ```diff
+ - Returns accepted within [X] days.
+ + Returns accepted within 30 days with receipt.
+
+ - Shipping takes [X-X] business days.
+ + Shipping takes 3-5 business days.
+ ```
+
+
+ [IMAGE: Prompt section with policy text highlighted]
+
+
+
+
+ Adjust the personality to match your brand:
+
+ ```diff
+ - Be professional and courteous.
+ + Be warm, friendly, and occasionally use casual language.
+ + Feel free to use emojis when appropriate! 😊
+ ```
+
+
+ [IMAGE: Behavioral guidelines section of prompt]
+
+
+
+
+
+**Always test after customizing.** Template defaults work well together — your changes might need fine-tuning.
+
+
+---
+
+## Template Example: Customer Support
+
+Here's what the Customer Support template looks like:
+
+
+ [IMAGE: Full editor view with Customer Support template loaded]
+
+
+```
+You are a friendly customer support agent for [Company Name]. Your
+mission is to help customers quickly and efficiently while maintaining
+a positive, helpful attitude.
+
+WHAT YOU HANDLE:
+- Account questions and updates
+- Billing and payment inquiries
+- Product troubleshooting
+- Returns and exchanges
+- General information
+
+KEY POLICIES:
+- Returns: [X] days with receipt
+- Support hours: [hours]
+- Response time: [timeframe]
+
+HOW TO BEHAVE:
+- Be friendly and patient
+- Listen before solving
+- Confirm understanding
+- Keep responses concise (under 30 words)
+- Offer alternatives when possible
+- Know when to escalate
+
+IF YOU CAN'T HELP:
+- Acknowledge the limitation honestly
+- Offer to transfer to a specialist
+- Provide alternative contact methods
+
+END THE CALL WHEN:
+- Issue is resolved and confirmed
+- Customer thanks you or says goodbye
+- You've successfully transferred them
+```
+
+---
+
+## Tips for Template Success
+
+
+ Even if no template is perfect, pick the closest one. It's easier to modify an existing structure than start from nothing.
+
+
+
+ Templates are organized intentionally. Keep the section headers and overall structure — just replace the content.
+
+
+
+ After customizing, test with actual questions your customers ask. Use Convo Logs to refine.
+
+
+
+ Review conversation logs after launch. Update your prompt based on what works and what doesn't.
+
+
+---
+
+## Next Steps
+
+
+
+ Master prompt engineering
+
+
+ Validate before deploying
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/manual-setup.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/manual-setup.mdx
new file mode 100644
index 0000000..00ce4be
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/manual-setup.mdx
@@ -0,0 +1,292 @@
+---
+title: "Manual Setup"
+sidebarTitle: "Manual Setup"
+description: "Build a Single Prompt agent from scratch with complete control."
+---
+
+Starting from scratch gives you a blank canvas and full control. This guide walks you through every step.
+
+
+ [IMAGE: Dashboard with green Create Agent button highlighted]
+
+
+---
+
+## Step 1: Start Creation
+
+
+
+ Find the green **Create Agent** button in the top right of your dashboard.
+
+
+ [IMAGE: Close-up of Create Agent button]
+
+
+
+
+ In the modal that appears, choose the first option.
+
+
+ [IMAGE: Modal with "Start from scratch" option highlighted]
+
+
+
+
+ Select the Single Prompt agent type.
+
+
+ [IMAGE: Modal showing Single Prompt option with icon]
+
+
+
+
+The editor opens with a blank canvas ready for your prompt.
+
+---
+
+## Step 2: Meet the Editor
+
+
+ [IMAGE: Full editor screenshot with numbered callouts for each area]
+
+
+### Editor Layout
+
+| Area | Location | What It Does |
+|------|----------|--------------|
+| **Prompt Section** | Top bar | Model, voice, and language selection |
+| **Prompt Editor** | Center | Where you write your agent's instructions |
+| **Config Panel** | Right sidebar | End call, transfer, KB, variables, APIs |
+| **Navigation** | Left sidebar | Switch between Prompt, Settings, Widget, etc. |
+
+
+ | Item | Purpose |
+ |------|---------|
+ | **Prompt** | Main prompt editor (current view) |
+ | **Agent Settings** | Voice, model, phone, webhook, general tabs |
+ | **Widget** | Embed configuration for web |
+ | **Integrations** | Third-party connections |
+ | **Post Call Metrics** | Analytics setup |
+
+
+---
+
+## Step 3: Configure Basics
+
+Before writing your prompt, set up the fundamentals in the **Prompt Section** (top bar).
+
+
+ [IMAGE: Top bar showing Model, Voice, Language dropdowns]
+
+
+### Select Your Model
+
+Click the **Model** dropdown to choose your LLM.
+
+
+ [IMAGE: Dropdown showing available models like GPT-4o]
+
+
+
+**GPT-4o** is recommended for most use cases — great balance of capability and speed.
+
+
+→ Learn more: [Model Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/model-selection)
+
+### Select Your Voice
+
+Click the **Voice** dropdown to open the voice picker.
+
+
+ [IMAGE: Voice picker showing search, filters, and voice list with play buttons]
+
+
+- Use **filters** to narrow by language, accent, gender, age
+- Click **▶️** to preview any voice
+- Click a voice name to select it
+
+→ Learn more: [Voice Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/voice-selection)
+
+### Select Language
+
+Choose the primary language for your agent's responses.
+
+
+ [IMAGE: Language dropdown showing available languages]
+
+
+
+Available languages depend on your selected voice. Choose voice first.
+
+
+→ Learn more: [Language Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/language-selection)
+
+---
+
+## Step 4: Write Your Prompt
+
+Now the important part — telling your agent who to be and how to behave.
+
+
+ [IMAGE: Clean prompt editor with blinking cursor]
+
+
+### Prompt Structure
+
+A great prompt covers these elements:
+
+
+
+ Who is this agent? What company do they represent?
+
+ ```
+ You are a friendly customer service agent for Acme Inc.
+ ```
+
+
+
+ What's the agent trying to accomplish?
+
+ ```
+ Your goal is to help customers with questions about
+ their orders, returns, and account issues.
+ ```
+
+
+
+ What does the agent need to know?
+
+ ```
+ Key policies:
+ - Returns accepted within 30 days
+ - Free shipping on orders over $50
+ - Support hours: 9am-6pm EST
+ ```
+
+
+
+ How should the agent communicate?
+
+ ```
+ Be friendly and patient. Keep responses concise
+ (under 30 words when possible). If you don't know
+ something, say so honestly.
+ ```
+
+
+
+ When should the call end?
+
+ ```
+ End the call when:
+ - The customer's issue is resolved
+ - They explicitly say goodbye
+ - You've transferred them to a human
+ ```
+
+
+
+### Complete Example
+
+
+ [IMAGE: Editor showing complete prompt below]
+
+
+```
+You are a friendly customer service agent for Acme Inc. Your goal
+is to help customers with questions about orders, returns, and
+account issues.
+
+Key policies:
+- Returns accepted within 30 days with receipt
+- Free shipping on orders over $50
+- Support hours: 9am-6pm EST Monday-Friday
+
+Behavior guidelines:
+- Be friendly, patient, and professional
+- Keep responses under 30 words when possible
+- If you don't know something, say so honestly
+- Offer to transfer to a human for complex issues
+
+End the call when:
+- The customer's issue is resolved
+- They say goodbye or thank you
+- You've transferred them to a specialist
+```
+
+→ Deep dive: [Writing Effective Prompts](/atoms/atoms-platform/single-prompt-agents/prompt-section/writing-prompts)
+
+---
+
+## Step 5: Configure Features (Optional)
+
+The **Configuration Panel** (right sidebar) offers additional capabilities.
+
+
+ [IMAGE: Right sidebar showing End Call, Transfer Call, KB, Variables, API toggles]
+
+
+| Feature | What It Does | Learn More |
+|---------|--------------|------------|
+| **End Call** | Define when/how AI ends calls | [End Call →](/atoms/atoms-platform/single-prompt-agents/configuration-panel/end-call) |
+| **Transfer Call** | Set up human handoffs | [Transfer Call →](/atoms/atoms-platform/single-prompt-agents/configuration-panel/transfer-call) |
+| **Knowledge Base** | Attach reference documents | [Knowledge Base →](/atoms/atoms-platform/single-prompt-agents/configuration-panel/knowledge-base) |
+| **Variables** | Use dynamic values in prompts | [Variables →](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables) |
+| **API Calls** | Connect external services | [API Calls →](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls) |
+
+Toggle any feature **ON**, then click the **⚙️** icon to configure.
+
+---
+
+## Step 6: Test Your Agent
+
+Time to hear your agent in action.
+
+
+ [IMAGE: Top right showing Test Agent button, with modal showing three test modes]
+
+
+
+
+ Find it in the top right corner of the editor.
+
+
+
+ | Mode | Best For |
+ |------|----------|
+ | **Web Call** | Quick voice testing in browser |
+ | **Telephony** | Real phone call experience |
+ | **Chat** | Text-only logic testing |
+
+
+
+ Test different scenarios. Try edge cases.
+
+
+
+ Click **Convo Logs** to see the transcript and identify improvements.
+
+
+
+→ Learn more: [Testing Your Agent](/atoms/atoms-platform/analytics-logs/testing)
+
+---
+
+## You're Live!
+
+Your Single Prompt agent is ready. From here you can:
+
+
+
+ Master prompt engineering
+
+
+ Voice, model, webhooks & more
+
+
+ Give your agent reference docs
+
+
+ Assign a real phone number
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/overview.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/overview.mdx
new file mode 100644
index 0000000..6d3d349
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/overview.mdx
@@ -0,0 +1,104 @@
+---
+title: "Single Prompt Agents"
+sidebarTitle: "Overview"
+description: "Build flexible, conversational agents powered by a single prompt."
+---
+
+A Single Prompt agent runs on one set of instructions. You write a prompt that defines who the agent is, what it knows, and how it should behave — and that prompt governs the entire conversation. The AI interprets your instructions and applies them dynamically, adapting to whatever direction the caller takes.
+
+---
+
+## How It Works
+
+Think of your prompt as a briefing. You're telling the agent: here's your role, here's what you know, here's how to handle situations. The AI internalizes this once and then uses that understanding for every exchange.
+
+When a caller speaks, the agent doesn't follow a script. It reasons through the conversation based on your instructions. This is why Single Prompt agents feel natural — they're not jumping between pre-written responses, they're thinking through each moment.
+
+---
+
+## Capabilities
+
+**Dynamic tool usage.** You can connect your agent to APIs, databases, and external services. The agent decides when to use them based on the conversation. If a caller asks about their order, the agent can look it up. If they want to book something, it can check availability.
+
+**Conversation memory.** Everything said in the call stays in context. The agent remembers details from earlier in the conversation and can reference them naturally.
+
+**Handling the unexpected.** Without a rigid flow, the agent adapts to topic changes, follow-up questions, and tangents. Real conversations rarely follow a straight line — Single Prompt agents are designed for that reality.
+
+---
+
+## Building a Single Prompt Agent
+
+You'll create three things:
+
+**1. The Prompt**
+
+This is the core. Your prompt should cover:
+- **Identity** — Who is this agent? What's their name, role, personality?
+- **Knowledge** — What do they know? Products, policies, FAQs, context.
+- **Behavior** — How should they sound? What's off-limits? How do they handle edge cases?
+- **Endings** — When should the call wrap up? When should they transfer?
+
+**2. Tools** (optional)
+
+If you want the agent to take actions — look up records, check calendars, create tickets — you'll configure the tools it can access and describe when to use them.
+
+**3. Voice and Model**
+
+Pick the voice your agent speaks with and the AI model that powers its reasoning.
+
+---
+
+## The Editor
+
+Once you create a Single Prompt agent, you land in the editor — your workspace for everything.
+
+
+ 
+
+
+| Area | Location | What It Does |
+|------|----------|--------------|
+| **Prompt Section** | Top bar | Model, voice, and language selection |
+| **Prompt Editor** | Center | Where you write your agent's instructions |
+| **Config Panel** | Right sidebar | End call, transfer, knowledge base, variables, APIs |
+| **Navigation** | Left sidebar | Switch between Prompt, Settings, Widget, Integrations |
+
+→ [Full editor guide](/atoms/atoms-platform/single-prompt-agents/overview)
+
+---
+
+## After You Launch
+
+Once your agent is live, refinement happens in a few places:
+
+**Prompt updates.** You'll review call logs, find where the agent struggled, and tighten your instructions. Most improvements come from prompt iteration.
+
+**Voice tuning.** Adjust speech speed, add pronunciation rules for tricky words, tweak turn-taking behavior.
+
+**Tool adjustments.** Add new capabilities, modify API connections, or change when tools get triggered.
+
+**Configuration.** Fine-tune end call conditions, transfer settings, timeout behavior, and more.
+
+---
+
+## Get Started
+
+
+ | Method | Description |
+ |--------|-------------|
+ | **Start from scratch** | Blank canvas. Full control over every setting. |
+ | **Start with Template** | Pre-built prompts for common use cases. Customize from there. |
+ | **Create with AI** | Describe what you want, and AI generates the prompt for you. |
+
+
+
+
+ Set up your agent
+
+
+ Voice, model, tools & more
+
+
+ Validate before going live
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/quick-start.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/quick-start.mdx
new file mode 100644
index 0000000..174ec6e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/quick-start.mdx
@@ -0,0 +1,164 @@
+---
+title: "Quick Start"
+sidebarTitle: "Quick Start"
+description: "Create your first Single Prompt agent in under 10 minutes."
+---
+
+This guide walks you through creating a working Single Prompt agent. By the end, you'll have an agent you can actually call and talk to.
+
+---
+
+## Step 1: Start Creating
+
+From your dashboard, click **Create Agent** in the top-right corner.
+
+
+
+
+
+---
+
+## Step 2: Fill In Basic Details
+
+A modal appears asking for basic information:
+
+
+
+
+
+| Field | What to Enter |
+|-------|---------------|
+| **Agent Name** | Something descriptive — "Customer Support Bot", "Sales Assistant", etc. |
+| **Call Type** | **Inbound** if customers call in, **Outbound** if the agent makes calls |
+| **Voice** | Click to preview voices, pick one that matches your brand |
+| **Language** | Primary language for the conversation |
+
+---
+
+## Step 3: Select Agent Type
+
+Choose **Single prompt agent** — it's marked as Recommended.
+
+
+
+
+
+The other option, Conversational Flow, is for complex step-by-step workflows. Stick with Single Prompt for natural conversations.
+
+---
+
+## Step 4: Choose a Starting Point
+
+You can start from scratch or use a template:
+
+**Start from Scratch**
+Select "Start with custom prompt" to write everything yourself. Best when you have specific requirements.
+
+**Use a Template**
+Pick a pre-built template for your industry — Healthcare, E-commerce, Banking, Sales, Real Estate. Templates give you a solid foundation that you can customize.
+
+
+Templates save time. Even if your use case is unique, starting from a related template is often faster than writing from scratch.
+
+
+---
+
+## Step 5: Add Knowledge Base (Optional)
+
+If you want your agent to reference specific information (product docs, policies, FAQs), connect a Knowledge Base now.
+
+Click **Select knowledge base** and either choose an existing one or create new. The agent will search this content when answering questions.
+
+You can skip this step and add it later.
+
+---
+
+## Step 6: Create the Agent
+
+Click **Create agent** in the top-right.
+
+Atoms will process your configuration — this takes about 30 seconds. When complete, you'll see a success message.
+
+Click **Go to Agent** to open the prompt editor.
+
+---
+
+## Step 7: Write Your Prompt
+
+You're now in the main editor. The center area shows four prompt sections:
+
+
+
+
+
+Fill in each section:
+
+**Role & Objective**
+Who your agent is and what it should accomplish.
+
+```
+You are Alex, a friendly customer support agent for TechStore.
+Your goal is to help customers with orders, returns, and product questions.
+```
+
+**Conversation Flow**
+How the agent should guide conversations.
+
+```
+1. Greet warmly and ask how you can help
+2. Listen and understand their need
+3. Provide helpful information or take action
+4. Confirm they're satisfied
+5. Ask if there's anything else
+```
+
+**Dos and Don'ts**
+Behavioral guardrails.
+
+```
+DO: Be patient, confirm before making changes, offer to transfer if stuck
+DON'T: Share other customers' info, make promises you can't keep
+```
+
+**End Call Conditions**
+When to conclude the call.
+
+```
+End when: Issue resolved, customer requests it, or transferred successfully
+```
+
+For detailed guidance on writing great prompts, see [Writing Prompts](/atoms/atoms-platform/single-prompt-agents/prompt-section/writing-prompts).
+
+---
+
+## Step 8: Test Your Agent
+
+Click **Test Agent** in the top bar. Make a test call and try different scenarios:
+
+- Ask a normal question
+- Ask something unexpected
+- Interrupt mid-response
+- Try to get it to break a rule
+
+Listen for how natural it sounds. Check that it follows your guidelines.
+
+---
+
+## You're Live!
+
+Your agent is now ready. From here, you can:
+
+
+
+ Ground responses in your documentation
+
+
+ Get a number customers can call
+
+
+ Personalize with customer data
+
+
+ Let your agent take actions
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/when-to-use.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/when-to-use.mdx
new file mode 100644
index 0000000..4bdd6f6
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/when-to-use.mdx
@@ -0,0 +1,105 @@
+---
+title: "When to Use Single Prompt"
+sidebarTitle: "When to Use"
+description: "Determine if Single Prompt agents are right for your use case."
+---
+
+Single Prompt agents are the simpler of the two agent types. They use one comprehensive prompt to guide all conversations, letting the AI handle the flow naturally. But they're not right for every situation.
+
+---
+
+## Ideal Use Cases
+
+Single Prompt agents shine when conversations are **flexible and open-ended**:
+
+### Customer FAQ Bots
+
+Customers ask all kinds of questions. A Single Prompt agent can handle diverse topics naturally, moving between subjects as the conversation flows.
+
+### General Product Information
+
+When callers want to learn about your offerings, a Single Prompt agent can discuss features, pricing, and comparisons without rigid scripts.
+
+### Basic Support Triage
+
+For first-line support that identifies issues and provides general guidance before escalating, Single Prompt handles the variety well.
+
+### Creative or Advisory Interactions
+
+Conversations involving recommendations, advice, or creative problem-solving benefit from the flexible nature of Single Prompt.
+
+### Simple Information Lookup
+
+When callers need quick answers from a knowledge base — store hours, order status, basic policies — Single Prompt delivers naturally.
+
+---
+
+## Not Ideal For
+
+Single Prompt agents struggle when you need **strict control over conversation flow**:
+
+### Strict Multi-Step Workflows
+
+If callers must complete steps in a specific order (collect info A, then B, then C), Conversational Flow gives you that control.
+
+### Lead Qualification with Specific Criteria
+
+When you need to score leads based on exact questions and route based on answers, the visual workflow of Conversational Flow is clearer.
+
+### Appointment Booking with Complex Branching
+
+Scheduling with multiple conditions (time slots, service types, locations) often needs the precision of defined paths.
+
+### Compliance-Required Conversations
+
+When regulations require specific disclosures in specific order, Conversational Flow ensures nothing is missed.
+
+### Processes Requiring Exact Sequences
+
+Any process where the order of steps matters more than natural conversation should use Conversational Flow.
+
+---
+
+## Decision Checklist
+
+Answer these questions about your use case:
+
+| Question | If Yes → |
+|----------|----------|
+| Can the conversation go in many directions? | Single Prompt ✓ |
+| Do callers ask unpredictable questions? | Single Prompt ✓ |
+| Is flexibility more important than structure? | Single Prompt ✓ |
+| Must steps happen in exact order? | Conversational Flow |
+| Do you need branching logic based on answers? | Conversational Flow |
+| Are there compliance requirements? | Conversational Flow |
+
+---
+
+## Example Scenarios
+
+**Good for Single Prompt:**
+- "Tell me about your return policy"
+- "What products do you offer?"
+- "I have a question about my order"
+- "Can you help me choose between X and Y?"
+
+**Better for Conversational Flow:**
+- Lead qualification surveys
+- Insurance intake forms
+- Appointment scheduling systems
+- Payment collection flows
+
+---
+
+## What's Next
+
+
+
+ Start building a Single Prompt agent
+
+
+ Deprecated
+
+ Compare with Conversational Flow
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/single-prompt/writing-prompts.mdx b/fern/products/atoms/pages/platform/building-agents/single-prompt/writing-prompts.mdx
new file mode 100644
index 0000000..03c17b5
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/single-prompt/writing-prompts.mdx
@@ -0,0 +1,270 @@
+---
+title: "Writing Effective Prompts"
+sidebarTitle: "Writing Prompts"
+description: "Craft prompts that make your agent intelligent, helpful, and consistent."
+---
+
+Your prompt is everything. It defines who your agent is, what it knows, how it speaks, and when it takes action. A well-written prompt creates an agent that feels genuinely helpful. A sloppy one creates confusion and frustration.
+
+This page covers how to structure prompts, what to include, and how to refine them over time.
+
+---
+
+## The Prompt Editor
+
+The prompt editor is a markdown editor. You can use headings, bullet points, numbered lists, bold, and other formatting to organize your instructions clearly.
+
+
+ 
+
+
+### Prompt Section Navigation
+
+Click the **Prompt Section** dropdown above the editor to jump between sections of your prompt. This is especially useful for long, detailed prompts.
+
+The dropdown shows all your markdown headings, letting you navigate directly to:
+- Role & Objective
+- Personality & Tone
+- User Details
+- Conversational Flow
+- Common Questions & Responses
+- And any other sections you create
+
+
+**Templates use this structure.** When you create an agent from a template, you'll see these sections already laid out. Even when starting from scratch, following this structure keeps your prompt organized and maintainable.
+
+
+---
+
+## Prompt Structure
+
+A great prompt covers these areas. You don't need to use these exact headings, but you should address each concept.
+
+### Role & Objective
+
+Who is this agent? What's it trying to accomplish?
+
+```markdown
+## Role & Objective
+
+You are Sarah, a customer support specialist for Acme Insurance.
+Your goal is to help policyholders with claim status inquiries,
+provide clear updates, and guide them through next steps.
+```
+
+### Personality & Tone
+
+How should the agent communicate? What's the vibe?
+
+```markdown
+## Personality & Tone
+
+- Warm and reassuring — insurance claims are stressful
+- Clear and direct — avoid jargon, explain terms simply
+- Patient — never rush the caller, let them process
+- Professional but human — not robotic
+```
+
+### User Details
+
+What do you know about callers? What context should the agent use?
+
+```markdown
+## User Details
+
+Callers are existing policyholders. They've already filed a claim
+and are calling for updates. You have access to their claim details
+via the lookup API.
+```
+
+### Conversational Flow
+
+What's the typical structure of a call?
+
+```markdown
+## Conversational Flow
+
+1. Greet warmly and confirm you're speaking with the policyholder
+2. Verify identity (last 4 of SSN or date of birth)
+3. Ask about the purpose of the call
+4. Look up their claim and provide status
+5. Answer follow-up questions
+6. Confirm next steps
+7. End warmly
+```
+
+### Common Questions & Responses
+
+What questions come up repeatedly? How should the agent handle them?
+
+```markdown
+## Common Questions & Responses
+
+**"How long will my claim take?"**
+Explain that most claims are processed within 5-7 business days,
+but complex claims may take longer. Offer to check the specific
+timeline for their claim.
+
+**"Can I speak to an adjuster?"**
+Explain that adjusters work on multiple claims and aren't available
+for direct calls, but you can schedule a callback.
+```
+
+### Knowledge Base Topics
+
+What subjects might require document lookup?
+
+```markdown
+## Knowledge Base Topics
+
+For questions about coverage limits, deductibles, or policy terms,
+search the knowledge base. Don't guess at policy details.
+```
+
+### Objection & Concern Handling
+
+How should the agent handle frustration or pushback?
+
+```markdown
+## Objection & Concern Handling
+
+If the caller is frustrated about delays:
+- Acknowledge their frustration genuinely
+- Explain what's causing the delay if known
+- Offer concrete next steps
+- Never be defensive
+```
+
+### End Conditions
+
+When and how should calls end?
+
+```markdown
+## End Conditions
+
+End the call when:
+- The caller's questions are answered and they confirm satisfaction
+- They explicitly say goodbye or thank you
+- You've successfully transferred them
+- They become unresponsive after 3 attempts
+```
+
+---
+
+## Best Practices
+
+
+| Vague | Specific |
+|-------|----------|
+| "Be helpful" | "Answer questions directly, offer next steps, never leave the caller wondering what happens next" |
+| "Be professional" | "Use complete sentences, avoid slang, but don't sound robotic" |
+| "Handle complaints" | "If the caller is frustrated, acknowledge their feelings first, then address the issue" |
+
+
+
+Show the agent what you mean:
+
+```markdown
+When confirming identity, say something like:
+"Before I can access your account, I just need to verify a few details.
+Can you confirm your date of birth?"
+```
+
+
+
+What happens when things go wrong?
+
+- What if the API is down?
+- What if the caller doesn't pass verification?
+- What if they ask something completely off-topic?
+- What if they're angry?
+
+
+
+Your first prompt won't be perfect. Review conversation logs, find where the agent stumbled, and update your instructions. The best prompts evolve over time.
+
+
+---
+
+## Using Variables
+
+Make prompts dynamic with variables:
+
+```markdown
+Hello {{customer_name}}! I see you're calling about claim #{{claim_id}}.
+```
+
+At runtime, these get replaced with actual values from your variables or API responses.
+
+→ [Variables](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables)
+
+---
+
+## Example: Complete Prompt
+
+Here's a full example putting it all together:
+
+```markdown
+## Role & Objective
+
+You are Alex, a claims support specialist for Reliable Insurance.
+Help policyholders check claim status, understand next steps, and
+feel supported through the process.
+
+## Personality & Tone
+
+- Warm and empathetic — claims are stressful
+- Clear and jargon-free
+- Patient and never rushed
+- Confident but not dismissive
+
+## Conversational Flow
+
+1. Greet and confirm you're speaking with the policyholder
+2. Verify identity (date of birth)
+3. Ask how you can help
+4. Look up their claim
+5. Provide clear status update
+6. Answer questions
+7. Confirm next steps
+8. Close warmly
+
+## Common Questions
+
+**"When will I hear back?"**
+Most claims are reviewed within 5-7 business days. I can check
+your specific timeline if you'd like.
+
+**"Why is it taking so long?"**
+Sometimes we need additional documentation or verification.
+Let me check what's happening with yours specifically.
+
+## Sensitive Situations
+
+If the caller is upset or frustrated:
+- Listen fully before responding
+- Acknowledge their feelings: "I completely understand this is frustrating"
+- Focus on what you CAN do, not what you can't
+- Offer concrete next steps
+
+## End Conditions
+
+End the call when:
+- Caller confirms they have what they need
+- They say goodbye or thank you
+- Transfer is complete
+- No response after 3 attempts (end politely)
+```
+
+---
+
+## What's Next
+
+
+
+ See how your prompt performs
+
+
+ Find where to improve
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-launch/conversation-logs.mdx b/fern/products/atoms/pages/platform/building-agents/testing-launch/conversation-logs.mdx
new file mode 100644
index 0000000..553c190
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-launch/conversation-logs.mdx
@@ -0,0 +1,142 @@
+---
+title: "Conversation Logs"
+sidebarTitle: "Conversation Logs"
+description: "Review transcripts and debug agent behavior."
+---
+
+Conversation Logs are your window into every call. See exactly what was said, when events occurred, and how metrics were captured — everything you need to understand and improve your agent.
+
+**Location:** Top right → **Convo Logs** button
+
+---
+
+## Call Logs List
+
+
+ 
+
+
+The main view shows all calls with key information at a glance:
+
+| Column | Description |
+|--------|-------------|
+| **Call Date** | When the call occurred |
+| **Call ID** | Unique identifier (click to copy) |
+| **From / To** | Phone numbers or sources |
+| **Duration** | How long the call lasted |
+| **Hangup Cause** | Why the call ended |
+| **Status** | Current state of the call |
+| **Retries** | Number of retry attempts |
+| **Details** | Click to view full conversation |
+
+---
+
+## Filtering
+
+Click **Filter By** to narrow down your logs:
+
+| Filter | Options |
+|--------|---------|
+| **Conversation Type** | Inbound Calls, Outbound Calls, Web Calls, Chat |
+| **Status** | Pending, In Queue, In Progress, Active, Completed, Failed, Cancelled, No Answer, Processing |
+| **End Reason** | Dial No Answer, User Hangup, Agent Hangup, Busy, Timeout, Error, Voicemail |
+| **Call Type** | All Attempts, Retry Attempts, Initial Attempts |
+| **Call Duration** | 0-30 seconds, 30-60 seconds, 1-5 minutes, 5+ minutes |
+
+Use **Search Logs** to find specific calls by ID or content.
+
+---
+
+## Call Details
+
+Click **Details** on any call to open the full conversation view. You'll see tabs for different types of information:
+
+
+
+
+ 
+
+
+ High-level summary of the call:
+
+ | Field | Description |
+ |-------|-------------|
+ | **Call Summary** | AI-generated summary of what happened |
+ | **Agent** | Which agent handled the call |
+ | **Call ID** | Unique identifier |
+ | **Model** | AI model used |
+ | **Voice** | Voice used |
+ | **Date & Time** | When the call occurred |
+ | **Cost (Credits)** | Credit usage |
+ | **Disconnection Reason** | Why the call ended |
+
+ Play the audio recording using the waveform player at the top.
+
+
+
+
+ 
+
+
+ The full conversation, word for word. Each message shows:
+ - Who spoke (Agent or User)
+ - What was said
+ - Timestamp
+
+ Use this to understand exactly how the conversation flowed.
+
+
+
+
+ 
+
+
+ Timeline of everything that happened:
+ - Agent responses
+ - Call End triggers
+ - Transfers
+ - API calls
+ - Other system events
+
+ Each event shows the timestamp and what occurred.
+
+
+
+
+ 
+
+
+ Post-call metrics you've configured, with their values:
+
+ Each metric shows:
+ - Name
+ - Data type (Integer, String, Boolean, etc.)
+ - Value extracted from this call
+
+ Click the dropdown on any metric to see details.
+
+
+
+---
+
+## Exporting
+
+Click the **Export** button to download your logs:
+
+| Format | Best for |
+|--------|----------|
+| **JSON** | Developers, programmatic analysis |
+| **CSV** | Spreadsheets, reporting |
+
+---
+
+## Related
+
+
+
+ Define what to track from each call
+
+
+ Test your agent
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-launch/locking.mdx b/fern/products/atoms/pages/platform/building-agents/testing-launch/locking.mdx
new file mode 100644
index 0000000..2018520
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-launch/locking.mdx
@@ -0,0 +1,45 @@
+---
+title: "Locking Your Agent"
+sidebarTitle: "Locking"
+description: "Protect production agents from accidental changes."
+---
+
+Once your agent is working well, lock it. Locking prevents accidental edits that could break a production agent.
+
+**Location:** Top right → **Lock Agent** toggle
+
+
+ 
+
+
+---
+
+## How It Works
+
+Toggle **Lock Agent** to ON — all editing becomes disabled.
+
+**What's blocked:**
+- Prompt editing
+- Configuration changes
+- Settings modifications
+- Node changes (Convo Flow)
+
+**What still works:**
+- Test Agent
+- View Conversation Logs
+- Live calls continue normally
+
+To make changes, toggle it back to OFF, edit, test, then re-lock.
+
+---
+
+## Related
+
+
+
+ Test before locking
+
+
+ Deploy to production
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-launch/testing.mdx b/fern/products/atoms/pages/platform/building-agents/testing-launch/testing.mdx
new file mode 100644
index 0000000..3450908
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-launch/testing.mdx
@@ -0,0 +1,58 @@
+---
+title: "Testing Your Agent"
+sidebarTitle: "Testing"
+description: "Validate your agent before deploying to production."
+---
+
+Testing is the difference between a great agent and a frustrating one. Atoms gives you three ways to test, so you can catch issues before real callers do.
+
+**Location:** Top right → **Test Agent** button
+
+---
+
+## Three Test Modes
+
+
+
+
+ 
+
+
+ **Voice call in your browser.** Quick and convenient — no phone needed.
+
+ Best for rapid testing during development.
+
+
+
+
+ 
+
+
+ **Real phone call.** The authentic experience — exactly what your callers will hear.
+
+ Best for final validation before launch.
+
+
+
+
+ 
+
+
+ **Text-only conversation.** Test conversation logic without voice.
+
+ Best for testing branching and prompts quickly.
+
+
+
+---
+
+## Related
+
+
+
+ Review call transcripts
+
+
+ Protect production agents
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-management/conversation-logs.mdx b/fern/products/atoms/pages/platform/building-agents/testing-management/conversation-logs.mdx
new file mode 100644
index 0000000..79f380b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-management/conversation-logs.mdx
@@ -0,0 +1,175 @@
+---
+title: "Conversation Logs"
+sidebarTitle: "Conversation Logs"
+description: "Review and analyze every conversation your agent has."
+---
+
+Conversation Logs record every interaction your agent has — test calls, live calls, all of them. They're your window into what's actually happening in conversations, essential for debugging, optimization, and quality assurance.
+
+---
+
+## Accessing Conversation Logs
+
+Find Conversation Logs in the top bar of your agent editor, or through the main dashboard.
+
+
+
+
+
+Each entry shows a complete conversation with all the details you need to understand what happened.
+
+---
+
+## What's in a Log
+
+Each conversation log contains:
+
+### Call Metadata
+
+| Field | Description |
+|-------|-------------|
+| **Call ID** | Unique identifier for this conversation |
+| **Timestamp** | When the call happened |
+| **Duration** | How long it lasted |
+| **Direction** | Inbound or outbound |
+| **Phone Number** | Caller's number (if available) |
+| **Disposition** | How the call ended (successful, unsuccessful, transferred, etc.) |
+
+### Transcript
+
+A full text record of everything said — both by the caller and your agent. Each turn is timestamped.
+
+```
+[00:02] Agent: Hi, this is Jordan from TechStore. How can I help you today?
+[00:05] Caller: Yeah, I need to return something I bought last week.
+[00:08] Agent: I'd be happy to help with that. Could you tell me what item you'd like to return?
+[00:12] Caller: The wireless headphones, they don't fit right.
+...
+```
+
+### Audio Recording
+
+The actual audio of the call (if recording is enabled). Listen to hear tone, pacing, and things the transcript might miss.
+
+### Variables
+
+All variables used in the conversation — what values they had and when they changed.
+
+### API Activity
+
+For Convo Flow agents: which API calls were made, what data was sent/received, and whether they succeeded.
+
+### Branch Decisions
+
+For Convo Flow agents: which branches were taken and why. Understand the path the conversation followed.
+
+---
+
+## Using Logs for Debugging
+
+When something goes wrong, logs tell you exactly what happened:
+
+### Common Issues to Look For
+
+**Speech Recognition Errors**
+The transcript shows what the system *thought* it heard. If it's wrong, that explains downstream problems.
+
+```
+Caller actually said: "I want to cancel my order"
+System heard: "I want to cancel my daughter"
+```
+
+**Intent Misunderstanding**
+The caller's words were transcribed correctly, but the agent misinterpreted the intent.
+
+**Wrong Branch Taken**
+In Convo Flow, check which branches fired. The AI's interpretation might differ from your expectation.
+
+**API Failures**
+Check the API activity section. Failed calls explain why data wasn't available or actions weren't taken.
+
+---
+
+## Filtering and Searching
+
+With many calls, you need to find specific conversations:
+
+### Filter Options
+
+| Filter | What It Finds |
+|--------|---------------|
+| **Date Range** | Calls within a specific period |
+| **Disposition** | Only successful, unsuccessful, or transferred calls |
+| **Duration** | Calls shorter or longer than a threshold |
+| **Phone Number** | Calls from/to a specific number |
+| **Contains Text** | Calls where specific words appear in transcript |
+
+### Useful Searches
+
+- **Short calls** — Often indicate quick hang-ups or problems
+- **Long calls** — May reveal conversations that got stuck
+- **Unsuccessful dispositions** — Learn why calls fail
+- **Calls with transfers** — Understand what AI couldn't handle
+
+---
+
+## Analyzing Patterns
+
+Look beyond individual calls to spot trends:
+
+**Frequent Fallbacks**
+If many calls trigger fallback branches, your prompts may need more specific handling.
+
+**Common Questions**
+What do callers ask most? Make sure these are handled excellently.
+
+**Transfer Reasons**
+Why are calls being transferred? Can AI handle more of these?
+
+**Drop-off Points**
+Where do unsuccessful calls fail? Early hang-ups vs. mid-conversation issues tell different stories.
+
+---
+
+## Using Logs for Improvement
+
+Turn log insights into agent improvements:
+
+1. **Review regularly** — Set aside time weekly to review a sample of calls
+2. **Categorize issues** — Group problems by type (prompt, understanding, integration)
+3. **Prioritize by impact** — Fix issues that affect the most callers first
+4. **Make targeted changes** — Adjust prompts, add branches, fix integrations
+5. **Track results** — See if the same issues recur after your changes
+
+---
+
+## Privacy and Compliance
+
+
+Conversation logs may contain personally identifiable information (PII). Ensure your logging practices comply with relevant regulations (GDPR, HIPAA, etc.) and your company's data policies.
+
+
+### Data Retention
+
+Configure how long logs are kept. Shorter retention reduces storage and compliance risk. Longer retention enables more analysis.
+
+### Recording Consent
+
+For calls with audio recording, ensure appropriate consent disclosures are made at the start of calls, as required by law.
+
+### Access Control
+
+Limit who can view conversation logs. Not everyone needs access to customer call recordings.
+
+---
+
+## Next Steps
+
+
+
+ Generate logs through testing
+
+
+ Freeze your agent configuration
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-management/locking/how-locking-works.mdx b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/how-locking-works.mdx
new file mode 100644
index 0000000..40df631
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/how-locking-works.mdx
@@ -0,0 +1,175 @@
+---
+title: "How Locking Works"
+sidebarTitle: "How It Works"
+description: "Technical details of the agent locking mechanism."
+---
+
+Understanding how locking works helps you use it effectively and avoid common pitfalls.
+
+---
+
+## The Lock Toggle
+
+Find the lock toggle in the top bar of your agent editor.
+
+
+
+
+
+**Unlocked (default):** Full editing enabled. You can change anything.
+
+**Locked:** Editing disabled. Configuration is frozen.
+
+Click the toggle to switch states. Locking requires confirmation.
+
+---
+
+## What Gets Locked
+
+When you lock an agent, the following are frozen:
+
+### For All Agents
+
+| Component | Locked? |
+|-----------|---------|
+| Agent name | ✓ |
+| Voice selection | ✓ |
+| LLM model | ✓ |
+| LLM parameters (temperature, etc.) | ✓ |
+| Language settings | ✓ |
+
+### For Single Prompt Agents
+
+| Component | Locked? |
+|-----------|---------|
+| Role & Objective prompt | ✓ |
+| Conversation Flow prompt | ✓ |
+| Dos and Don'ts prompt | ✓ |
+| End Call Conditions prompt | ✓ |
+
+### For Convo Flow Agents
+
+| Component | Locked? |
+|-----------|---------|
+| All nodes and their prompts | ✓ |
+| All branch conditions | ✓ |
+| Branch connections | ✓ |
+| API configurations | ✓ |
+| Variable definitions | ✓ |
+
+### Not Locked
+
+| Component | Why Not Locked? |
+|-----------|-----------------|
+| Phone number assignment | You need to connect/disconnect numbers |
+| Conversation logs | These accumulate regardless |
+| Knowledge Base content | Content can be updated independently |
+| External API endpoints | These are managed externally |
+
+---
+
+## Attempting to Edit While Locked
+
+If you try to edit a locked agent:
+
+1. The edit UI is disabled (fields are read-only)
+2. If you somehow trigger an edit API, it returns an error
+3. A message indicates the agent is locked
+
+To make changes, you must either:
+- Unlock the agent (if you have permission)
+- Create a new version based on this one
+
+---
+
+## Locking and Phone Numbers
+
+Locked agents can be connected to live phone numbers. In fact, this is the recommended workflow:
+
+```
+Lock agent → Connect to phone number → Go live
+```
+
+The lock protects the configuration while it's handling real calls.
+
+You can disconnect a phone number from a locked agent without unlocking it.
+
+---
+
+## Unlocking
+
+To unlock an agent:
+
+1. Click the lock toggle
+2. Confirm you want to unlock
+3. Editing is now enabled
+
+
+Unlocking a live agent is risky. Any changes you make immediately affect live calls. Consider creating a new version instead.
+
+
+### When Unlocking is Appropriate
+
+- The agent is not connected to any live phone numbers
+- You've disconnected it from live traffic
+- You're making an emergency fix and accept the risk
+
+### Better Alternative: Version
+
+Instead of unlocking, create a new version:
+1. Keep the current version locked (and live)
+2. Create a new unlocked version to edit
+3. Test the new version
+4. Lock the new version
+5. Switch traffic to the new version
+6. Archive or delete the old version
+
+This prevents any disruption to live calls.
+
+---
+
+## Lock State in Team Environments
+
+In team settings:
+
+- **Who can lock:** Anyone with edit permissions
+- **Who can unlock:** Anyone with edit permissions (consider restricting this)
+- **Visibility:** Lock state is visible to all team members
+- **Audit:** Lock/unlock actions are logged with timestamp and user
+
+
+For production agents, consider restricting unlock permissions to senior team members to prevent accidental changes.
+
+
+---
+
+## Lock State via API
+
+If you're managing agents programmatically:
+
+```bash
+# Check lock state
+GET /agents/{agent_id}
+# Returns: { ..., "is_locked": true, ... }
+
+# Lock an agent
+POST /agents/{agent_id}/lock
+
+# Unlock an agent
+POST /agents/{agent_id}/unlock
+```
+
+API requests to modify a locked agent return `403 Forbidden`.
+
+---
+
+## Next Steps
+
+
+
+ Managing multiple versions safely
+
+
+ Deciding when to lock
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-management/locking/version-management.mdx b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/version-management.mdx
new file mode 100644
index 0000000..2e20f1a
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/version-management.mdx
@@ -0,0 +1,188 @@
+---
+title: "Version Management"
+sidebarTitle: "Versions"
+description: "Manage multiple versions of your agent safely."
+---
+
+Version management lets you maintain multiple configurations of your agent — enabling safe iteration without disrupting live traffic.
+
+---
+
+## Why Versioning Matters
+
+Without versioning, every change to your agent affects live calls immediately. That's risky:
+
+- A typo in your prompt could confuse callers
+- A broken API configuration could crash conversations
+- Testing in production means real customers experience bugs
+
+Versioning gives you a safety net. Work on changes separately, test thoroughly, then promote when ready.
+
+---
+
+## How Versioning Works
+
+Each agent can have multiple versions:
+
+```
+My Support Agent
+├── v1 (locked, live on +1-555-0100)
+├── v2 (locked, archived)
+└── v3 (unlocked, in development)
+```
+
+Only one version handles live traffic at a time. Others exist for development, testing, or historical reference.
+
+---
+
+## Creating a New Version
+
+To create a new version:
+
+1. Go to your agent's settings or version panel
+2. Click **Create New Version**
+3. Choose to copy from:
+ - Current version (start with existing config)
+ - Blank slate (start fresh)
+4. The new version is created **unlocked** for editing
+
+The new version gets a version number automatically (v2, v3, etc.).
+
+---
+
+## Version Lifecycle
+
+A typical version goes through these stages:
+
+```
+Created (unlocked)
+ ↓ editing and testing
+Locked
+ ↓ final testing
+Deployed
+ ↓ live traffic
+Superseded
+ ↓ replaced by newer version
+Archived
+```
+
+### Stage Details
+
+| Stage | What's Happening |
+|-------|------------------|
+| **Created** | New version, actively being edited |
+| **Locked** | Configuration frozen, ready for deployment |
+| **Deployed** | Handling live traffic |
+| **Superseded** | Was live, now replaced by newer version |
+| **Archived** | Kept for reference but no longer active |
+
+---
+
+## Switching Live Versions
+
+To switch which version handles live calls:
+
+1. Ensure the new version is locked
+2. Go to the phone number configuration
+3. Change the assigned agent version
+4. Confirm the switch
+
+
+The switch is nearly instant. In-progress calls continue on the old version; new calls go to the new version.
+
+
+---
+
+## Comparing Versions
+
+When deciding whether to deploy a new version, compare it to the current live version:
+
+**Configuration Diff**
+See exactly what changed between versions — prompt text, settings, workflow structure.
+
+**Test Results**
+Compare test call outcomes. Does the new version handle the same scenarios correctly?
+
+**Metrics Preview**
+If possible, A/B test the new version with a portion of traffic before full deployment.
+
+---
+
+## Rolling Back
+
+If a new version has problems, roll back quickly:
+
+1. Go to phone number configuration
+2. Switch back to the previous version
+3. The old version resumes handling calls
+
+Because locked versions are frozen, the old version is exactly as you left it.
+
+
+Don't delete old versions immediately. Keep at least one previous version available for quick rollback.
+
+
+---
+
+## Best Practices
+
+
+
+ Never unlock a live version to make changes. Create a new version instead. This protects live traffic from in-progress changes.
+
+
+ Only deploy locked versions. This ensures the configuration is frozen and stable.
+
+
+ Don't test on v3 then deploy v4 because "they're basically the same." Test the exact version going live.
+
+
+ When creating a new version, add notes about what changes it contains. Future you will thank present you.
+
+
+ Archive versions you no longer need. Keep the current live version and one previous version for rollback.
+
+
+
+---
+
+## Version Strategy for Teams
+
+For teams with multiple people working on agents:
+
+**Development Branch**
+Unlocked versions where individual contributors make changes. Each person might have their own development version.
+
+**Staging Version**
+A locked version deployed to a test phone number. Team reviews changes here before production.
+
+**Production Version**
+The locked version handling real customer calls. Changes only come through the staging process.
+
+```
+Development → Staging → Production
+ (unlocked) (locked) (locked)
+```
+
+---
+
+## Version Limits
+
+Each agent can have a limited number of versions (check your plan). To free up version slots:
+
+- Archive versions you no longer need
+- Delete versions that were never deployed
+- Consolidate abandoned development versions
+
+---
+
+## Next Steps
+
+
+
+ Know when your version is ready
+
+
+ Test versions before deployment
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-management/locking/when-to-lock.mdx b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/when-to-lock.mdx
new file mode 100644
index 0000000..c38b983
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-management/locking/when-to-lock.mdx
@@ -0,0 +1,133 @@
+---
+title: "When to Lock Your Agent"
+sidebarTitle: "When to Lock"
+description: "Understand when and why to lock your agent configuration."
+---
+
+Locking freezes your agent's configuration — preventing accidental changes while it handles live calls. It's the safeguard between testing and production.
+
+---
+
+## What Locking Does
+
+When you lock an agent:
+
+- **Prompt cannot be edited** — Your carefully tested prompt stays exactly as is
+- **Settings are frozen** — Voice, LLM, language settings stay fixed
+- **Workflow is immutable** — For Convo Flow agents, nodes and branches can't change
+- **API configurations are protected** — Integration settings remain stable
+
+You can still:
+- View the agent configuration
+- View conversation logs
+- Make test calls
+- Create a new unlocked version
+
+---
+
+## When to Lock
+
+### Before Going Live
+
+Lock immediately before connecting your agent to a live phone number or widget. This ensures:
+
+- The tested version is exactly what goes live
+- No one accidentally changes something
+- You have a known-good baseline to return to
+
+### After Major Changes
+
+After significant prompt or workflow updates that you've thoroughly tested:
+
+1. Test the changes completely
+2. Confirm everything works
+3. Lock the agent
+4. Then deploy to production
+
+### For Compliance
+
+Some industries require change management for production systems. Locking provides:
+
+- A clear record of what configuration was live when
+- Protection against unauthorized changes
+- Audit trail of version history
+
+---
+
+## Signs You're Ready to Lock
+
+Ask yourself these questions:
+
+| Question | If "Yes" → Ready to Lock |
+|----------|--------------------------|
+| Have I tested all common scenarios? | ✓ |
+| Have I tested edge cases? | ✓ |
+| Have I had others test it? | ✓ |
+| Am I confident in the current behavior? | ✓ |
+| Are all integrations working correctly? | ✓ |
+| Does the voice and tone match my brand? | ✓ |
+
+If you answered "no" to any of these, keep testing before locking.
+
+---
+
+## When NOT to Lock
+
+**During Active Development**
+If you're still iterating frequently, locking just creates extra steps. Wait until you've reached a stable point.
+
+**If You're Unsure**
+Locking isn't urgent. If you're not confident the agent is ready, keep testing.
+
+**For Quick Experiments**
+Testing new prompt ideas? Don't lock between every experiment. Lock only when you've found what works.
+
+---
+
+## The Lock-Test-Deploy Workflow
+
+A typical safe workflow:
+
+```
+1. Develop agent (unlocked)
+2. Test thoroughly
+3. Lock the agent ← You are confident
+4. Deploy to live phone number
+5. Monitor conversation logs
+6. If changes needed:
+ - Create new version (unlocked)
+ - Make changes
+ - Test again
+ - Lock new version
+ - Deploy new version
+```
+
+---
+
+## Multiple Environments
+
+For larger teams, consider:
+
+**Development Agent (Unlocked)**
+Where you make and test changes freely.
+
+**Staging Agent (Locked)**
+A locked version connected to a test phone number for final validation.
+
+**Production Agent (Locked)**
+The version actually handling customer calls, always locked.
+
+Changes flow from Development → Staging → Production, with locking at each promotion.
+
+---
+
+## Next Steps
+
+
+
+ Technical details of the locking mechanism
+
+
+ Managing multiple versions of your agent
+
+
diff --git a/fern/products/atoms/pages/platform/building-agents/testing-management/testing.mdx b/fern/products/atoms/pages/platform/building-agents/testing-management/testing.mdx
new file mode 100644
index 0000000..fc8c6b1
--- /dev/null
+++ b/fern/products/atoms/pages/platform/building-agents/testing-management/testing.mdx
@@ -0,0 +1,171 @@
+---
+title: "Testing Your Agent"
+sidebarTitle: "Testing"
+description: "Validate your agent before going live with real callers."
+---
+
+Testing is the most important step between building and deploying. A well-tested agent handles real conversations gracefully. A poorly tested one frustrates callers and damages your brand.
+
+Atoms provides multiple testing methods so you can validate thoroughly before going live.
+
+---
+
+## Testing Methods
+
+### Web Call Testing
+
+The fastest way to test. Click **Test Agent** in the top bar to start a browser-based call.
+
+
+
+
+
+**How it works:**
+1. Click **Test Agent**
+2. Allow microphone access when prompted
+3. Talk to your agent like a real caller would
+4. The call appears in Conversation Logs when done
+
+**Best for:** Quick iterations, checking prompt changes, initial validation.
+
+### Phone Call Testing
+
+Test with actual phone audio — more realistic than browser testing.
+
+**How it works:**
+1. Go to **Settings** → **Test Phone Number**
+2. Call the provided number from your phone
+3. Have a real conversation with your agent
+4. Review the call in Conversation Logs
+
+**Best for:** Final validation, voice quality checks, realistic testing before launch.
+
+---
+
+## What to Test
+
+Don't just test the happy path. Systematically validate every aspect of your agent:
+
+### Conversation Flow
+
+| Test | What You're Checking |
+|------|---------------------|
+| **Happy path** | Does the ideal conversation work perfectly? |
+| **Edge cases** | What happens when callers say unexpected things? |
+| **Fallbacks** | Does the agent handle confusion gracefully? |
+| **Interruptions** | What happens if you interrupt mid-sentence? |
+| **Silence** | What does the agent do when you don't respond? |
+
+### Response Quality
+
+| Test | What You're Checking |
+|------|---------------------|
+| **Accuracy** | Are answers factually correct? |
+| **Relevance** | Does the agent actually answer the question asked? |
+| **Tone** | Does it sound like your brand? |
+| **Length** | Are responses appropriately concise for voice? |
+
+### Guardrails
+
+| Test | What You're Checking |
+|------|---------------------|
+| **Off-topic requests** | Does the agent stay on task? |
+| **Manipulation attempts** | Can you trick it into breaking rules? |
+| **Sensitive topics** | Does it handle them appropriately? |
+| **Competitor mentions** | Does it follow your guidelines? |
+
+---
+
+## Testing Checklist
+
+Before going live, verify each of these:
+
+**Basic Functionality**
+- [ ] Agent greets correctly
+- [ ] Agent understands common requests
+- [ ] Agent provides accurate information
+- [ ] Agent ends calls gracefully
+
+**Edge Cases**
+- [ ] Agent handles unclear speech
+- [ ] Agent manages interruptions
+- [ ] Agent recovers from silence
+- [ ] Agent deals with unexpected topics
+
+**Integrations** (if applicable)
+- [ ] API calls work correctly
+- [ ] Data is fetched/sent properly
+- [ ] Transfer calls connect
+- [ ] Variables populate correctly
+
+**Quality**
+- [ ] Voice sounds natural
+- [ ] Response timing feels right
+- [ ] Personality matches brand
+- [ ] No awkward pauses
+
+---
+
+## Testing Tips
+
+
+
+ Don't use perfect English. Mumble. Use filler words. Ask things in weird ways. Real callers don't speak like prompts.
+
+
+ Ask off-topic questions. Try to get it to reveal information it shouldn't. Interrupt constantly. Your callers will find edge cases — find them first.
+
+
+ Background noise, poor phone connection, speaking quickly. Test the conditions your real callers will have.
+
+
+ You know your agent too well. Fresh testers find problems you miss because they don't know the "right" way to talk to it.
+
+
+ After testing, check Conversation Logs. Read the transcript. Listen to the audio. Look for anywhere the agent could have done better.
+
+
+
+---
+
+## Interpreting Test Results
+
+After each test call, check:
+
+**Transcript Accuracy**
+Was what you said transcribed correctly? Speech recognition errors can cause downstream problems.
+
+**Intent Understanding**
+Did the agent understand what you meant, even if you said it imperfectly?
+
+**Response Appropriateness**
+Was the response helpful, on-topic, and correctly toned?
+
+**Flow Progression**
+Did the conversation move forward naturally, or did it get stuck or repeat?
+
+---
+
+## Iterating on Problems
+
+When tests reveal issues:
+
+1. **Identify the pattern** — Is it a one-off or does it happen consistently?
+2. **Check the logs** — What exactly did the agent see and decide?
+3. **Trace to the cause** — Is it a prompt issue, LLM issue, or integration issue?
+4. **Make targeted fixes** — Change one thing at a time so you know what worked
+5. **Re-test the specific scenario** — Confirm the fix works
+6. **Re-test adjacent scenarios** — Make sure you didn't break something else
+
+---
+
+## Next Steps
+
+
+
+ Analyze what happened in test calls
+
+
+ Freeze your agent when it's ready
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/agent-settings/general-tab.mdx b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/general-tab.mdx
new file mode 100644
index 0000000..2d1a3cc
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/general-tab.mdx
@@ -0,0 +1,85 @@
+---
+title: "General Tab"
+sidebarTitle: "General Tab"
+description: "Configure timeout and general agent behavior."
+---
+
+The General Tab contains timeout settings that control what happens when callers become unresponsive.
+
+---
+
+## Location
+
+**Left Sidebar → Agent Settings → General tab**
+
+---
+
+## LLM Idle Timeout Settings
+
+> Configure how long agent waits for user response before sending inactivity message. After 3 attempts, conversation automatically ends.
+
+| Setting | Input | Default | Description |
+|---------|-------|---------|-------------|
+| **Chat Timeout** | Seconds | 60 | Timeout for chat/text conversations |
+| **Webcall Timeout** | Seconds | 20 | Timeout for browser voice calls |
+| **Telephony Timeout** | Seconds | (configurable) | Timeout for phone calls |
+
+---
+
+## How Timeout Works
+
+1. **User stops responding** — Silence detected
+2. **Timeout triggers** — After configured seconds
+3. **Agent sends inactivity message** — "Are you still there?"
+4. **Repeats up to 3 times** — Giving user chances to respond
+5. **Call ends automatically** — After 3 failed attempts
+
+---
+
+## Setting Recommendations
+
+| Channel | Recommended Timeout | Reason |
+|---------|---------------------|--------|
+| Chat | 60s | Users may be multitasking |
+| Web Call | 20s | Real-time, expect engagement |
+| Telephony | 15-30s | Phone calls expect quick responses |
+
+---
+
+## Inactivity Messages
+
+When timeout triggers, the agent sends a re-engagement message. Configure what the agent says in your prompt:
+
+```
+If the user hasn't responded for a while, say something like:
+"I'm still here if you need anything. Is there something I can help with?"
+```
+
+---
+
+## Use Cases
+
+### Short Timeouts (10-20s)
+
+- Sales calls where engagement matters
+- Time-sensitive conversations
+- Active support calls
+
+### Longer Timeouts (30-60s)
+
+- Complex issues where user might be looking something up
+- Multi-tasking expected
+- User might be finding information
+
+---
+
+## What's Next
+
+
+
+ Configure web widget
+
+
+ Test timeout behavior
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/agent-settings/model-tab.mdx b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/model-tab.mdx
new file mode 100644
index 0000000..196392a
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/model-tab.mdx
@@ -0,0 +1,137 @@
+---
+title: "Model Tab"
+sidebarTitle: "Model Tab"
+description: "Configure LLM and language behavior settings."
+---
+
+The Model Tab controls the AI model powering your agent and how it handles language. This includes model selection, speech formatting, and advanced language switching.
+
+
+ [IMAGE: Full Model tab with Language Switching section expanded]
+
+
+---
+
+## Location
+
+**Left Sidebar → Agent Settings → Model tab**
+
+---
+
+## AI Model
+
+| Setting | Control | Example |
+|---------|---------|---------|
+| **LLM Model** | Dropdown | GPT-4o |
+| **Language** | Dropdown | English |
+
+### Model Selection
+
+Choose the LLM that powers your agent's understanding and responses. This is the same as the Prompt Section model dropdown.
+
+### Language
+
+Set the primary language. This should match your voice selection's language capability.
+
+---
+
+## Speech Formatting
+
+| Setting | Toggle | Default |
+|---------|--------|---------|
+| **Speech Formatting** | ON/OFF | ON |
+
+When enabled, the system formats responses for natural speech:
+- Expands abbreviations
+- Handles numbers naturally
+- Formats dates and times for speaking
+
+**Example:**
+- Written: "Your appt is on 1/15/24 at 3:00pm"
+- Spoken: "Your appointment is on January fifteenth, twenty twenty-four at three p m"
+
+---
+
+## Language Switching
+
+| Setting | Toggle | Default |
+|---------|--------|---------|
+| **Language Switching** | ON/OFF | ON |
+
+When enabled, the agent can detect when a caller switches languages and respond in kind.
+
+### Advanced Language Switching Settings
+
+When language switching is enabled, additional controls appear:
+
+> Controls how accurately agent detects language switches. Higher thresholds reduce false switches; lower thresholds allow quicker changes.
+
+| Setting | Range | Default | Description |
+|---------|-------|---------|-------------|
+| **Minimum Words for Detection** | 1-10 | 2 | Words needed before switching |
+| **Strong Signal Threshold** | Low-High | 0.7 | Confidence for immediate switch |
+| **Weak Signal Threshold** | Low-High | 0.3 | Confidence for tentative detection |
+| **Consecutive Weak Signals** | 1-8 | 2 | Weak signals needed to switch |
+
+### Understanding the Settings
+
+**Minimum Words for Detection**
+How many words in the new language before considering a switch. Higher = more conservative.
+
+**Strong Signal Threshold**
+If confidence is above this level, switch immediately. Higher = requires more certainty.
+
+**Weak Signal Threshold**
+Confidence level that counts as "maybe" a language switch. Below this is ignored.
+
+**Consecutive Weak Signals**
+How many weak signals in a row before switching. Higher = more conservative.
+
+---
+
+## Use Cases
+
+### Single Language (Simple)
+
+- Set primary language
+- Disable Language Switching
+- Agent only speaks one language
+
+### Multi-Language (Flexible)
+
+- Select multi-language voice
+- Set primary language
+- Enable Language Switching
+- Agent adapts to caller's language
+
+### Conservative Multi-Language
+
+- Enable Language Switching
+- Increase Minimum Words (5+)
+- Increase Strong Signal Threshold (0.8+)
+- Agent only switches when very confident
+
+---
+
+## Saving Changes
+
+After making changes, you'll see:
+```
+"You have unsaved changes"
+[Discard] [Save]
+```
+
+Click **Save** to apply changes.
+
+---
+
+## What's Next
+
+
+
+ Assign a phone number
+
+
+ Configure voice settings
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/agent-settings/phone-number-tab.mdx b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/phone-number-tab.mdx
new file mode 100644
index 0000000..87aeefa
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/phone-number-tab.mdx
@@ -0,0 +1,94 @@
+---
+title: "Phone Number Tab"
+sidebarTitle: "Phone Number Tab"
+description: "Assign a phone number to your agent."
+---
+
+The Phone Number Tab lets you connect your agent to a phone number. Once assigned, inbound calls to that number are handled by this agent.
+
+---
+
+## Location
+
+**Left Sidebar → Agent Settings → Phone Number tab**
+
+---
+
+## Assigning a Number
+
+1. Navigate to Agent Settings → Phone Number tab
+2. Click the phone number dropdown
+3. Select from available numbers
+4. Save changes
+
+---
+
+## Available Numbers
+
+The dropdown shows phone numbers you've acquired through Atoms:
+
+| Status | Description |
+|--------|-------------|
+| **Available** | Not assigned to any agent |
+| **Assigned** | Currently used by another agent (shown with agent name) |
+
+You can only assign numbers that aren't already in use.
+
+---
+
+## Getting Phone Numbers
+
+Before you can assign a number, you need to acquire one.
+
+→ See: [Getting a Number](/atoms/atoms-platform/deployment/phone-numbers)
+
+---
+
+## One Number Per Agent
+
+Each phone number can only be assigned to one agent at a time.
+
+| Scenario | Result |
+|----------|--------|
+| Number is free | Can assign to this agent |
+| Number assigned elsewhere | Must unassign first, or choose different number |
+
+To reassign a number:
+1. Go to the agent currently using it
+2. Unassign or assign a different number
+3. Return to your agent and assign
+
+---
+
+## Inbound vs Outbound
+
+**Inbound Calls:**
+When someone calls your assigned number, this agent handles the conversation.
+
+**Outbound Calls:**
+For outbound, you use Campaigns which specify which agent makes calls. The Phone Number Tab is primarily for inbound.
+
+→ See: [Campaigns](/atoms/atoms-platform/deployment/campaigns)
+
+---
+
+## Saving Changes
+
+After selecting a number, save to apply:
+```
+"You have unsaved changes"
+[Discard] [Save]
+```
+
+---
+
+## What's Next
+
+
+
+ Configure event notifications
+
+
+ Get phone numbers
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/agent-settings/voice-tab.mdx b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/voice-tab.mdx
new file mode 100644
index 0000000..6dea80b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/voice-tab.mdx
@@ -0,0 +1,166 @@
+---
+title: "Voice Tab"
+sidebarTitle: "Voice Tab"
+description: "Fine-tune voice and speech behavior for your agent."
+---
+
+The Voice Tab provides detailed control over how your agent sounds and handles speech. Beyond basic voice selection, you can adjust speed, pronunciation, background sounds, and advanced speech detection.
+
+
+ [IMAGE: Full Voice tab with all sections visible]
+
+
+---
+
+## Location
+
+**Left Sidebar → Agent Settings → Voice tab**
+
+---
+
+## Voice Selection
+
+At the top, you'll find the same voice dropdown as the Prompt Section. Change voices here or in the top bar — they sync.
+
+---
+
+## Speech Settings
+
+| Setting | Control | Range | Default |
+|---------|---------|-------|---------|
+| **Speech Speed** | Slider | Slow ↔ Fast | 1 (normal) |
+
+Adjust how quickly your agent speaks:
+- Slower for complex information
+- Faster for energetic conversations
+- Default (1) works for most cases
+
+---
+
+## Pronunciation & Background
+
+### Pronunciation Dictionaries
+
+Custom pronunciations for words the AI might mispronounce.
+
+| Element | Description |
+|---------|-------------|
+| **Pronunciations list** | Current custom pronunciations |
+| **Add Pronunciation** | Add new pronunciation rule |
+
+**When to use:**
+- Brand names with unusual spelling
+- Technical terms
+- Names of people or places
+- Acronyms that should be spelled out
+
+**Example:**
+- Word: "Atoms" → Pronunciation: "AH-toms"
+- Word: "API" → Pronunciation: "A P I"
+
+### Background Sound
+
+Add ambient audio to make conversations feel more natural:
+
+| Option | Description |
+|--------|-------------|
+| **None** | No background (default) |
+| **Office** | Subtle office ambiance |
+| **Cafe** | Coffee shop sounds |
+| **Call Center** | Busy call center background |
+
+---
+
+## Advanced Voice Settings
+
+| Setting | Toggle | Default | Description |
+|---------|--------|---------|-------------|
+| **Mute User Until First Bot Response** | ON/OFF | OFF | Prevents user audio until bot speaks first |
+| **Voicemail Detection** | ON/OFF | OFF | Detect if call goes to voicemail |
+| **Personal Info Redaction (PII)** | ON/OFF | OFF | Automatically redact sensitive information |
+| **Denoising** | ON/OFF | OFF | Remove background noise from caller audio |
+
+### Setting Details
+
+**Mute User Until First Bot Response**
+Useful for outbound calls where you want the agent to speak first without the caller interrupting the greeting.
+
+**Voicemail Detection**
+For outbound campaigns — detect answering machines and handle appropriately.
+
+**Personal Info Redaction (PII)**
+Automatically removes sensitive data (SSN, credit cards, etc.) from transcripts and logs.
+
+**Denoising**
+Improves speech recognition when callers have noisy backgrounds.
+
+---
+
+## Smart Turn Detection
+
+Intelligent handling of when the agent should start speaking.
+
+| Setting | Control | Description |
+|---------|---------|-------------|
+| **Smart Turn Detection** | Toggle | Enable intelligent turn-taking |
+| **Wait Time** | Slider | How long to wait before responding |
+
+When enabled, the system intelligently determines when the caller has finished speaking, reducing interruptions.
+
+**Wait Time:** When enabled, adjust how long the agent waits after detected silence before responding.
+
+---
+
+## Interruption Backoff Timer
+
+Controls how the agent handles when users interrupt.
+
+| Control | Description |
+|---------|-------------|
+| **Slider** | Time before agent resumes after interruption |
+
+Shorter = agent resumes quickly after interruption
+Longer = more patient, waits for caller to finish
+
+---
+
+## Voice Detection Tuning
+
+Fine-tune voice activity detection for challenging audio conditions.
+
+| Setting | Control | Range | Description |
+|---------|---------|-------|-------------|
+| **Confidence** | Slider | Low - High | How confident system must be that speech is occurring |
+| **Min Volume** | Slider | Low - High | Minimum volume to count as speech |
+| **Trigger Time** | Slider | Seconds | How long speech must occur to trigger detection |
+| **Release Time** | Slider | Seconds | How long silence before speech is considered ended |
+
+**When to adjust:**
+- Callers with very quiet voices → lower Min Volume
+- Noisy environments → higher Confidence
+- Callers who pause often → longer Release Time
+
+---
+
+## Saving Changes
+
+After making changes, you'll see:
+```
+"You have unsaved changes"
+[Discard] [Save]
+```
+
+Click **Save** to apply your changes.
+
+---
+
+## What's Next
+
+
+
+ Configure LLM and language settings
+
+
+ Test voice settings
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/agent-settings/webhook-tab.mdx b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/webhook-tab.mdx
new file mode 100644
index 0000000..05ae2b4
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/agent-settings/webhook-tab.mdx
@@ -0,0 +1,123 @@
+---
+title: "Webhook Tab"
+sidebarTitle: "Webhook Tab"
+description: "Send event data to your external systems."
+---
+
+The Webhook Tab lets you configure automatic notifications when call events occur. When something happens (call starts, call ends, analytics ready), Atoms sends data to your specified URL.
+
+
+ [IMAGE: Configure Webhook modal showing endpoint dropdown and event checkboxes]
+
+
+---
+
+## Location
+
+**Left Sidebar → Agent Settings → Webhook tab**
+
+---
+
+## How Webhooks Work
+
+1. An event occurs (e.g., call ends)
+2. Atoms sends an HTTP POST to your endpoint
+3. Your system receives call data
+4. You process it as needed (log, update CRM, trigger workflows)
+
+---
+
+## Configuration
+
+### Webhook Endpoint
+
+| Field | Control | Description |
+|-------|---------|-------------|
+| **Webhook Endpoint** | Dropdown | Select from existing webhooks |
+
+You must create webhook endpoints first before they appear here.
+
+→ See: [Creating Endpoints](/atoms/atoms-platform/features/webhooks)
+
+### Events to Subscribe
+
+| Event | When It Fires | Data Included |
+|-------|---------------|---------------|
+| **Start** | When call begins, before conversation | Caller info, timestamp |
+| **End** | When call ends | Transcript, duration, outcome |
+| **Analytics Completed** | When post-call analytics finish | Metrics, analysis |
+
+Check the events you want to receive.
+
+---
+
+## Setup Process
+
+1. **Create webhook endpoint** (Features → Webhooks)
+2. **Select endpoint** in dropdown
+3. **Check events** to subscribe
+4. **Save** configuration
+
+
+"Select a webhook endpoint to enable event selection"
+
+
+You must select an endpoint before you can choose events.
+
+---
+
+## Event Details
+
+### Start Event
+
+Fires when a call connects, before any conversation.
+
+**Use cases:**
+- Log call initiation
+- Start tracking in external system
+- Trigger real-time dashboards
+
+### End Event
+
+Fires when call concludes, regardless of how it ended.
+
+**Use cases:**
+- Log full transcript
+- Update CRM with call outcome
+- Create follow-up tasks
+- Trigger post-call workflows
+
+### Analytics Completed
+
+Fires when post-call analysis is ready.
+
+**Use cases:**
+- Capture sentiment analysis
+- Log metrics and scores
+- Update customer records with insights
+
+---
+
+## Testing Webhooks
+
+After configuration:
+
+1. Make a test call
+2. Check your endpoint for received data
+3. Verify payload structure
+4. Confirm your system processes correctly
+
+→ See: [Webhook Use Cases](/atoms/atoms-platform/features/webhooks) for common patterns
+
+---
+
+## What's Next
+
+
+
+ Timeout settings
+
+
+ Full webhook documentation
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/api-calls.mdx b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/api-calls.mdx
new file mode 100644
index 0000000..453ac33
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/api-calls.mdx
@@ -0,0 +1,171 @@
+---
+title: "API Calls Configuration"
+sidebarTitle: "API Calls"
+description: "Connect to external services during conversations."
+---
+
+API Calls let your agent interact with external systems — look up customer data, check order status, book appointments, or update records mid-conversation.
+
+---
+
+## Location
+
+**Configuration Panel (right sidebar) → API Calls**
+
+---
+
+## What API Calls Enable
+
+| Use Case | Example |
+|----------|---------|
+| Customer lookup | Fetch account details by phone number |
+| Order status | Get real-time order information |
+| Appointment booking | Check availability and create bookings |
+| CRM updates | Log call information to Salesforce |
+| Data verification | Verify customer information |
+| Ticket creation | Create support tickets |
+
+---
+
+## How It Works
+
+1. **Define the API endpoint** — URL, method, headers, body
+2. **Set trigger conditions** — When should the call happen?
+3. **Map responses to variables** — Store returned data
+4. **Use variables in conversation** — Reference the data
+
+---
+
+## Configuration
+
+→ **NEEDS PLATFORM INFO:** Detailed API configuration interface
+
+Basic configuration includes:
+
+| Field | Description |
+|-------|-------------|
+| **Endpoint URL** | The API URL to call |
+| **Method** | GET, POST, PUT, DELETE |
+| **Headers** | Authentication tokens, content-type |
+| **Body** | Request payload (for POST/PUT) |
+| **Response Mapping** | Map response fields to variables |
+
+---
+
+## Example: Customer Lookup
+
+### API Configuration
+
+```
+URL: https://api.yourcrm.com/customers
+Method: GET
+Headers:
+ Authorization: Bearer {{api_key}}
+ Content-Type: application/json
+Query Parameters:
+ phone: {{caller_phone}}
+```
+
+### Response
+
+```json
+{
+ "id": "cust_12345",
+ "name": "Jane Smith",
+ "status": "active",
+ "tier": "premium"
+}
+```
+
+### Response Mapping
+
+| API Field | Variable |
+|-----------|----------|
+| name | `{{api.customer_name}}` |
+| status | `{{api.account_status}}` |
+| tier | `{{api.tier}}` |
+
+### Using in Conversation
+
+```
+Hi {{api.customer_name}}! I see you're a {{api.tier}} member.
+How can I help you today?
+```
+
+---
+
+## In Conversational Flow
+
+Conversational Flow agents have dedicated **API Call Nodes**:
+
+- **Pre-Call API** — Runs before conversation starts
+- **API Call Node** — Runs mid-conversation
+- **Post-Call API** — Runs after conversation ends
+
+→ See: [Node Types Reference](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types)
+
+---
+
+## Error Handling
+
+What happens when API calls fail?
+
+| Scenario | Recommendation |
+|----------|----------------|
+| Timeout | Have fallback responses ready |
+| 404 Not Found | "I couldn't find that information" |
+| 500 Server Error | "I'm having trouble accessing that right now" |
+| Invalid Data | Validate before using |
+
+Build graceful handling into your prompts:
+```
+If you cannot retrieve customer information, apologize and
+offer to help in other ways or transfer to a human agent.
+```
+
+---
+
+## Security Considerations
+
+- **Never expose API keys in prompts** — Use secure configuration
+- **Validate inputs** — Don't pass unvalidated user input to APIs
+- **Use HTTPS** — Encrypt all API traffic
+- **Limit permissions** — API keys should have minimal required access
+
+---
+
+## Best Practices
+
+### Test API Calls Thoroughly
+
+Use the test modes to verify:
+- Calls execute at the right time
+- Responses map correctly to variables
+- Errors are handled gracefully
+
+### Keep Latency in Mind
+
+API calls add latency to conversations. Optimize for speed:
+- Use fast endpoints
+- Cache when possible
+- Only call when necessary
+
+### Log for Debugging
+
+Check conversation logs to see:
+- Request sent
+- Response received
+- Variables set
+
+---
+
+## What's Next
+
+
+
+ Complete API documentation
+
+
+ Configure voice settings
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/end-call.mdx b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/end-call.mdx
new file mode 100644
index 0000000..ce75413
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/end-call.mdx
@@ -0,0 +1,147 @@
+---
+title: "End Call Configuration"
+sidebarTitle: "End Call"
+description: "Configure when and how your agent terminates calls."
+---
+
+End Call configuration defines when the AI should end conversations. Without proper end call setup, agents may hang on awkwardly or end calls too abruptly.
+
+
+ [IMAGE: End Call Settings page showing list of configured functions]
+
+
+---
+
+## Location
+
+**Configuration Panel (right sidebar) → End Call**
+
+---
+
+## Enabling End Call
+
+1. Find "End Call" in the Configuration Panel
+2. Toggle it **ON**
+3. Click the settings icon (⚙️) to configure
+
+---
+
+## End Call Settings Page
+
+| Element | Description |
+|---------|-------------|
+| **Header** | "← End Call Settings" |
+| **Add button** | "+ Add End Call" |
+| **Functions list** | Configured end call functions with Edit/Delete |
+
+---
+
+## Adding an End Call Function
+
+Click **"+ Add End Call"** to open the configuration modal.
+
+
+ [IMAGE: Configure End Call Function modal with Name and Description fields]
+
+
+### Modal Fields
+
+| Field | Type | Required | Example |
+|-------|------|----------|---------|
+| **Name** | Text input | Yes | `end_call` |
+| **Description** | Text area | Yes | `Terminate the current call` |
+
+---
+
+## Writing Descriptions
+
+The **Description** tells the AI when to trigger this function. Be clear and specific.
+
+### Good Examples
+
+```
+End the call when the customer confirms their issue is resolved
+and has no more questions.
+```
+
+```
+Terminate the conversation when the user says goodbye, thanks you,
+or indicates they're done.
+```
+
+```
+End the call after successfully transferring to a human agent.
+```
+
+### Bad Examples
+
+```
+End call
+```
+(Too vague — AI doesn't know when)
+
+```
+When done
+```
+(What counts as "done"?)
+
+---
+
+## Common End Call Triggers
+
+| Trigger | Description Example |
+|---------|---------------------|
+| **Issue Resolved** | "Customer confirms their issue is resolved" |
+| **User Says Goodbye** | "User says goodbye, thanks, or indicates they're done" |
+| **Task Complete** | "Appointment is successfully booked and confirmed" |
+| **Transfer Success** | "Call has been transferred to human agent" |
+| **No Response** | "User is unresponsive after 3 attempts to re-engage" |
+| **Cannot Help** | "Issue is outside scope and no transfer is available" |
+
+---
+
+## Multiple End Call Functions
+
+Create separate functions for different scenarios:
+
+| Function Name | Trigger |
+|---------------|---------|
+| `successful_resolution` | Issue resolved, customer satisfied |
+| `customer_goodbye` | Customer ends conversation |
+| `transfer_complete` | Handoff to human successful |
+| `no_response_timeout` | Caller unresponsive |
+
+This provides better analytics — you can see how calls ended.
+
+---
+
+## Best Practices
+
+### Be Specific
+
+The AI uses your description to decide when to end. Specific descriptions = accurate behavior.
+
+### Cover All Scenarios
+
+Think about every way a call might end:
+- Happy path (resolved)
+- Customer-initiated (goodbye)
+- Handoff (transfer)
+- Edge cases (unresponsive, can't help)
+
+### Test Each Trigger
+
+In testing, verify each end condition triggers properly. Check conversation logs.
+
+---
+
+## What's Next
+
+
+
+ Configure call transfers
+
+
+ Test end call behavior
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/knowledge-base.mdx b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/knowledge-base.mdx
new file mode 100644
index 0000000..65ec859
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/knowledge-base.mdx
@@ -0,0 +1,119 @@
+---
+title: "Knowledge Base (Config)"
+sidebarTitle: "Knowledge Base"
+description: "Attach a knowledge base to give your agent reference information."
+---
+
+Knowledge Base configuration lets you connect a repository of information that your agent can reference during conversations. This is essential for agents that need to answer detailed questions accurately.
+
+---
+
+## Location
+
+**Configuration Panel (right sidebar) → Knowledge Base**
+
+---
+
+## Enabling Knowledge Base
+
+1. Find "Knowledge Base" in the Configuration Panel
+2. Toggle it **ON**
+3. Select a KB from the dropdown
+
+
+ [IMAGE: KB toggle and dropdown selection]
+
+
+---
+
+## Selecting a Knowledge Base
+
+The dropdown shows available knowledge bases:
+
+| Option | Description |
+|--------|-------------|
+| **None** | Agent relies only on prompt |
+| **[Your KB names]** | Available knowledge bases |
+
+Select the KB you want this agent to use.
+
+---
+
+## Local vs Global KB
+
+| Type | Scope | Best For |
+|------|-------|----------|
+| **Local KB** | Only this agent | Agent-specific information |
+| **Global KB** | Shared across agents | Company-wide FAQs, policies |
+
+→ See: [Knowledge Base Features](/atoms/atoms-platform/features/knowledge-base) for creating and managing KBs
+
+---
+
+## How It Works
+
+When a caller asks a question:
+
+1. Agent checks if the answer might be in the KB
+2. Searches the KB for relevant content
+3. Uses that content to form an accurate response
+4. Cites information from your documents
+
+This helps agents answer questions they couldn't know from the prompt alone.
+
+---
+
+## When to Use
+
+| Use Case | KB Value |
+|----------|----------|
+| Product FAQ | High — answer product questions accurately |
+| Pricing information | High — give correct prices |
+| Policy details | High — cite official policies |
+| General support | Medium — supplements prompt |
+| Simple tasks | Low — may not need external info |
+
+---
+
+## Requirements
+
+Before you can attach a KB:
+
+1. **Create the Knowledge Base** — In the Build section
+2. **Upload content** — Documents, URLs, text
+3. **Wait for processing** — Content needs indexing
+
+→ See: [Creating a Knowledge Base](/atoms/atoms-platform/features/knowledge-base)
+
+---
+
+## Best Practices
+
+### Keep KB Content Current
+
+Outdated information leads to wrong answers. Update your KB when information changes.
+
+### Structure Content Well
+
+Well-organized documents are easier to search. Use clear headings and sections.
+
+### Test Retrieval
+
+Ask questions that should use KB content. Verify the agent finds and uses the right information.
+
+### Don't Overload
+
+Focus on information the agent actually needs. Too much content can reduce retrieval accuracy.
+
+---
+
+## What's Next
+
+
+
+ Add dynamic values to prompts
+
+
+ Full KB documentation
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/transfer-call.mdx b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/transfer-call.mdx
new file mode 100644
index 0000000..496c299
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/transfer-call.mdx
@@ -0,0 +1,191 @@
+---
+title: "Transfer Call Configuration"
+sidebarTitle: "Transfer Call"
+description: "Configure call transfers to human agents or other numbers."
+---
+
+Transfer Call configuration lets your agent hand off conversations to human agents. You can set up cold transfers (immediate) or warm transfers (with context).
+
+
+ [IMAGE: Transfer Call Settings page]
+
+
+---
+
+## Location
+
+**Configuration Panel (right sidebar) → Transfer Call**
+
+---
+
+## Enabling Transfer Call
+
+1. Find "Transfer Call" in the Configuration Panel
+2. Toggle it **ON**
+3. Click the settings icon (⚙️) to configure
+
+---
+
+## Transfer Call Settings Page
+
+| Element | Description |
+|---------|-------------|
+| **Header** | "← Transfer Call Settings" |
+| **Add button** | "+ Add Transfer Call" |
+| **Empty state** | "No transfer call configured yet" |
+| **Functions list** | Configured transfers |
+
+---
+
+## Adding a Transfer
+
+Click **"+ Add Transfer Call"** to open the configuration modal.
+
+
+ [IMAGE: Configure Transfer Call modal showing Cold/Warm selection]
+
+
+### Modal Fields
+
+| Field | Type | Required | Example |
+|-------|------|----------|---------|
+| **Name** | Text input | Yes | `transfer_call` |
+| **Description** | Text area | Yes | `Transfer to support team` |
+| **Transfer Number** | Phone input | Yes | +1 (555) 123-4567 |
+| **Type** | Selection | Yes | Cold Transfer / Warm Transfer |
+
+---
+
+## Transfer Types
+
+| Type | Icon | Description |
+|------|------|-------------|
+| **Cold Transfer** | 📞 | Immediately connects caller to the number |
+| **Warm Transfer** | 👥 | AI briefs receiving agent before connecting |
+
+### When to Use Cold Transfer
+
+- Simple handoffs
+- When context isn't critical
+- High-volume call centers
+- When receiving agents access caller info independently
+
+### When to Use Warm Transfer
+
+- Complex issues requiring context
+- VIP customers
+- When receiving agents need background
+- Improved customer experience
+
+---
+
+## Warm Transfer Options
+
+When you select Warm Transfer, additional options appear:
+
+
+ [IMAGE: Warm transfer options - During Transfer, During Connection, After Connects]
+
+
+### 1. During Transfer Call
+
+| Setting | Control | Description |
+|---------|---------|-------------|
+| **On-hold Music** | Dropdown | Music caller hears while transferring |
+
+Options: Ringtone, Classical, Jazz, None, etc.
+
+### 2. During Agent Connection
+
+| Setting | Control | Description |
+|---------|---------|-------------|
+| **Transfer only if human answers** | Checkbox | Coming Soon — Skip voicemails |
+| **Whisper Message** | Toggle | Message ONLY the receiving agent hears |
+| **Handoff Message** | Text/Prompt | Content of the whisper message |
+
+**Whisper Message:** This is spoken to the receiving agent before connecting. The caller doesn't hear it.
+
+Example: "Incoming transfer. Customer Jane is calling about a billing dispute. Account ends in 4521."
+
+### 3. After Transfer Connects
+
+| Setting | Control | Description |
+|---------|---------|-------------|
+| **Three-way Message** | Toggle | Message BOTH parties hear |
+| **Message Content** | Text/Prompt | Introduction message |
+
+Example: "I've connected you with Sarah from our billing team. Sarah, Jane has been asking about a charge from last month."
+
+---
+
+## Writing Descriptions
+
+The description tells the AI when to trigger the transfer.
+
+### Good Examples
+
+```
+Transfer to the sales team when the caller is interested in
+purchasing and ready to speak with a sales representative.
+```
+
+```
+Transfer to a supervisor when the caller requests to speak with
+a manager or when the issue requires authorization beyond my scope.
+```
+
+### Specify Conditions Clearly
+
+- What keywords trigger it?
+- What situations require it?
+- What should happen first?
+
+---
+
+## Multiple Transfer Destinations
+
+Create separate transfers for different scenarios:
+
+| Transfer Name | Destination | Trigger |
+|---------------|-------------|---------|
+| `transfer_billing` | Billing team | Billing questions |
+| `transfer_technical` | Tech support | Technical issues |
+| `transfer_sales` | Sales team | Purchase interest |
+| `transfer_supervisor` | Management | Escalation requests |
+
+---
+
+## Best Practices
+
+### Use Warm Transfer for Complex Issues
+
+The brief context saves time and improves customer experience.
+
+### Write Helpful Whisper Messages
+
+Include:
+- Customer name (if known)
+- Issue summary
+- Account info (if relevant)
+- What you've already tried
+
+### Test Transfer Flows
+
+Verify:
+- Number connects correctly
+- Whisper plays only to agent
+- Hold music works
+- Three-way message is clear
+
+---
+
+## What's Next
+
+
+
+ Attach reference documents
+
+
+ Configure call termination
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/variables.mdx b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/variables.mdx
new file mode 100644
index 0000000..78a5f4e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/configuration-panel/variables.mdx
@@ -0,0 +1,183 @@
+---
+title: "Variables Configuration"
+sidebarTitle: "Variables"
+description: "Use dynamic values in prompts and conversations."
+---
+
+Variables let you insert dynamic values into your prompts. Instead of hardcoding information, you use placeholders that get replaced with real data at runtime.
+
+
+ [IMAGE: Variable Management panel showing three tabs]
+
+
+---
+
+## Location
+
+**Configuration Panel (right sidebar) → Variables Management**
+
+---
+
+## Variable Syntax
+
+Use double curly braces:
+
+```
+{{variable_name}}
+```
+
+### Example in Prompt
+
+```
+Hello {{customer_name}}, I see you're calling about order {{order_id}}.
+Your order status is currently {{order_status}}.
+```
+
+At runtime, this becomes:
+```
+Hello John, I see you're calling about order #12345.
+Your order status is currently shipped.
+```
+
+---
+
+## Variable Types
+
+The Variable Management Panel has three tabs:
+
+| Tab | Source | Description |
+|-----|--------|-------------|
+| **User Defined** | You create them | Custom variables for your needs |
+| **System** | Platform provides | Built-in variables from Atoms |
+| **API** | API responses | Variables from API call results |
+
+---
+
+## User Defined Variables
+
+Variables you create and manage.
+
+### Empty State
+
+```
+{ }
+No user variables found
+Add variables to your prompt using
+{{variable_name}} syntax.
+```
+
+### Adding Variables
+
+Variables appear when you:
+1. Type `{{variable_name}}` in your prompt
+2. The system detects and lists it
+3. You can set default values if needed
+
+### Common User Variables
+
+| Variable | Example Use |
+|----------|-------------|
+| `{{company_name}}` | Your company name |
+| `{{product_name}}` | Product being discussed |
+| `{{promo_code}}` | Current promotion code |
+| `{{team_name}}` | Department name |
+
+---
+
+## System Variables
+
+Built-in variables provided by Atoms.
+
+| Variable | Contains |
+|----------|----------|
+| `{{caller_phone}}` | Caller's phone number |
+| `{{call_time}}` | When the call started |
+| `{{call_duration}}` | How long the call has lasted |
+| `{{current_date}}` | Today's date |
+| `{{current_time}}` | Current time |
+
+→ See: [Variables Reference](/atoms/atoms-platform/features/variables-reference) for complete list
+
+---
+
+## API Variables
+
+Variables populated from API call responses.
+
+When an API Call returns data, you can map response fields to variables:
+
+```json
+// API Response
+{
+ "customer_name": "Jane Smith",
+ "account_status": "active",
+ "balance": "$1,234.56"
+}
+
+// Mapped Variables
+{{api.customer_name}} → "Jane Smith"
+{{api.account_status}} → "active"
+{{api.balance}} → "$1,234.56"
+```
+
+Use these in subsequent prompts or nodes.
+
+---
+
+## Using Variables Effectively
+
+### Personalization
+
+```
+Hi {{customer_name}}! Thanks for being a {{membership_level}} member.
+```
+
+### Dynamic Information
+
+```
+Your order {{order_id}} is scheduled for delivery on {{delivery_date}}.
+```
+
+### Conditional Context
+
+Variables can inform behavior:
+```
+If {{account_type}} is "premium", offer priority support.
+```
+
+---
+
+## Best Practices
+
+### Use Descriptive Names
+
+- Good: `{{customer_first_name}}`
+- Bad: `{{n1}}`
+
+### Handle Missing Variables
+
+What if a variable isn't set? Have graceful fallbacks in your prompt:
+```
+Hi {{customer_name|there}}! (Uses "there" if name unknown)
+```
+
+### Test Variable Substitution
+
+Verify variables are replaced correctly in test conversations.
+
+### Keep Track
+
+Document your variables so team members understand what each one does.
+
+---
+
+## What's Next
+
+
+
+ Fetch dynamic data
+
+
+ Complete variable list
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/editor-overview.mdx b/fern/products/atoms/pages/platform/configuring-agents/editor-overview.mdx
new file mode 100644
index 0000000..7f7962a
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/editor-overview.mdx
@@ -0,0 +1,131 @@
+---
+title: "Editor Overview"
+sidebarTitle: "Editor Overview"
+description: "Navigate the agent editor and understand all configuration areas."
+---
+
+After creating an agent, you work in the agent editor. This page explains every part of the interface so you can configure agents efficiently.
+
+
+ [IMAGE: Full agent editor with all three areas (Prompt Section, Config Panel, Left Sidebar) clearly annotated]
+
+
+---
+
+## Editor Layout
+
+The editor has three main configuration areas:
+
+| Area | Location | Contains |
+|------|----------|----------|
+| **Prompt Section** | Top bar | Model, Voice, Language dropdowns |
+| **Configuration Panel** | Right sidebar | End Call, Transfer, KB, Variables, API Calls |
+| **Agent Settings** | Left sidebar → "Agent Settings" | Voice, Model, Phone, Webhook, General tabs |
+
+---
+
+## Left Sidebar Navigation
+
+| Item | Icon | Description |
+|------|------|-------------|
+| **Prompt** | 📄 | Main prompt editor (Single Prompt only) |
+| **Agent Settings** | ⚙️ | Detailed configuration tabs |
+| **Widget** | `>` | Embed widget configuration |
+| **Integrations** | 🔗 | Third-party connections |
+| **Post Call Metrics** | 📊 | Analytics configuration |
+
+---
+
+## Top Right Actions
+
+| Button | Function |
+|--------|----------|
+| **Convo Logs** | View conversation transcripts |
+| **Lock Agent** | Prevent accidental edits |
+| **Test Agent** | Test via Telephony/Web/Chat |
+
+---
+
+## Header
+
+The header contains:
+
+- **Back arrow (←)** — Return to agents list
+- **Agent name** — Click to rename
+- **Agent ID** — Click to copy
+
+---
+
+## Single Prompt vs Conversational Flow
+
+The editor layout differs slightly between agent types:
+
+| Element | Single Prompt | Conversational Flow |
+|---------|---------------|---------------------|
+| Top area | Prompt Section (Model, Voice, Language) | Toggle tabs (Workflow / Settings) |
+| Center | Prompt editor | Visual canvas |
+| Right sidebar | Configuration Panel | Configuration Panel (when in Settings) |
+| Left sidebar | Same | Same |
+
+In Conversational Flow, click **"Settings"** tab to access the same configuration options available in Single Prompt.
+
+---
+
+## Configuration Areas in Detail
+
+### Prompt Section
+
+Located in the top bar, provides quick access to:
+- **Model** — Select LLM (GPT-4o, etc.)
+- **Voice** — Choose from voice library
+- **Language** — Set primary language
+
+→ See: [Model Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/model-selection), [Voice Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/voice-selection), [Language Selection](/atoms/atoms-platform/single-prompt-agents/prompt-section/language-selection)
+
+### Configuration Panel
+
+Located in the right sidebar, provides toggles for:
+- **End Call** — When/how to terminate calls
+- **Transfer Call** — Handoff to humans
+- **Knowledge Base** — Attach reference docs
+- **Variables** — Dynamic values in prompts
+- **API Calls** — External service connections
+
+→ See: [End Call](/atoms/atoms-platform/single-prompt-agents/configuration-panel/end-call), [Transfer Call](/atoms/atoms-platform/single-prompt-agents/configuration-panel/transfer-call), [Knowledge Base](/atoms/atoms-platform/single-prompt-agents/configuration-panel/knowledge-base), [Variables](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables), [API Calls](/atoms/atoms-platform/single-prompt-agents/configuration-panel/api-calls)
+
+### Agent Settings
+
+Accessed via left sidebar, contains detailed tabs:
+- **Voice Tab** — Speech settings, pronunciation, advanced voice
+- **Model Tab** — LLM settings, language switching
+- **Phone Number Tab** — Assign phone number
+- **Webhook Tab** — Event notifications
+- **General Tab** — Timeout settings
+
+→ See: [Voice Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/voice-settings), [Model Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings), [Phone Number Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/phone-number), [Webhook Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/webhooks), [General Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/general-settings)
+
+---
+
+## Saving Changes
+
+Most changes save automatically. However, some sections show:
+
+```
+"You have unsaved changes"
+[Discard] [Save]
+```
+
+Always click **Save** before leaving if you see this message.
+
+---
+
+## What's Next
+
+
+
+ Choose your LLM
+
+
+ Select and configure voice
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/integrations.mdx b/fern/products/atoms/pages/platform/configuring-agents/integrations.mdx
new file mode 100644
index 0000000..caa943f
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/integrations.mdx
@@ -0,0 +1,99 @@
+---
+title: "Integrations"
+sidebarTitle: "Integrations"
+description: "Connect third-party services to your agent."
+---
+
+Integrations let you connect your agent to external services like CRMs, calendars, and business tools. This enables automated data flow between your voice agent and the systems your business already uses.
+
+---
+
+## Location
+
+**Left Sidebar → Integrations**
+
+---
+
+## Available Integrations
+
+| Integration | Status | Description |
+|-------------|--------|-------------|
+| **Salesforce** | Available | CRM integration |
+| **HubSpot** | Coming Soon | Marketing and CRM |
+| **Google Calendar** | Coming Soon | Calendar booking |
+| **Google Sheets** | Coming Soon | Spreadsheet data |
+
+---
+
+## Salesforce Integration
+
+The Salesforce integration allows your agent to:
+
+- Look up contact records
+- Create and update leads
+- Log call activities
+- Trigger workflows
+
+### Setup
+
+1. Click **"Configure"** next to Salesforce
+2. Connect your Salesforce account
+3. Configure field mappings
+4. Test the connection
+
+→ **NEEDS PLATFORM INFO:** Detailed Salesforce configuration steps
+
+---
+
+## Using Integrations in Conversational Flow
+
+In Conversational Flow agents, integrations appear in the Node Palette:
+
+1. Open your workflow
+2. Find integrations in the left panel
+3. Drag integration node onto canvas
+4. Configure the specific action
+
+This lets you trigger integration actions at specific points in the conversation.
+
+---
+
+## Enterprise Integrations
+
+Some advanced integrations require:
+- Enterprise plan
+- Custom configuration
+- Sales team engagement
+
+Contact sales for:
+- Custom CRM integrations
+- ERP connections
+- Proprietary system APIs
+- High-volume data sync
+
+---
+
+## Coming Soon
+
+We're actively building more integrations:
+
+| Integration | Expected Capability |
+|-------------|---------------------|
+| **HubSpot** | CRM data, contact management |
+| **Google Calendar** | Availability checking, booking |
+| **Google Sheets** | Data lookup, logging |
+| **Zapier** | Connect to thousands of apps |
+| **Microsoft 365** | Calendar, contacts |
+
+---
+
+## What's Next
+
+
+
+ Configure analytics extraction
+
+
+ Custom API integrations
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/post-call-metrics.mdx b/fern/products/atoms/pages/platform/configuring-agents/post-call-metrics.mdx
new file mode 100644
index 0000000..38026e4
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/post-call-metrics.mdx
@@ -0,0 +1,180 @@
+---
+title: "Post-Call Metrics"
+sidebarTitle: "Post-Call Metrics"
+description: "Define metrics to extract from completed calls."
+---
+
+Post-Call Metrics let you automatically extract and analyze data from every call. Define what you want to measure, and Atoms analyzes conversations to provide structured insights.
+
+
+ [IMAGE: Post-call metrics setup modal showing form]
+
+
+---
+
+## Location
+
+**Left Sidebar → Post Call Metrics**
+
+---
+
+## What Are Post-Call Metrics?
+
+After each call, Atoms can analyze the conversation and extract specific information:
+
+- Did the issue get resolved?
+- What product was discussed?
+- How satisfied was the customer?
+- Does this need follow-up?
+
+This data helps you understand performance and improve over time.
+
+---
+
+## Set Up Post Call Metrics Modal
+
+### Left Panel - Metric Types
+
+| Type | Icon | Description |
+|------|------|-------------|
+| **Disposition Metrics** | 📊 | Evaluate call outcomes by category |
+| **Templates** | 📋 | Select from pre-filled metrics |
+
+### Right Panel - Configuration
+
+Header shows "Disposition Metrics" with **"Add Another +"** button.
+
+---
+
+## Creating a Metric
+
+### Metric Form Fields
+
+| Field | Type | Required | Description |
+|-------|------|----------|-------------|
+| **Identifier** | Text | Yes | Unique name for this metric |
+| **Data Type** | Dropdown | Yes | String, Number, Boolean |
+| **Prompt** | Text area | Yes | Question for AI to analyze |
+
+### Identifier Rules
+
+- Lowercase letters only
+- Numbers allowed
+- Underscores allowed
+- No spaces or special characters
+
+**Examples:**
+- `call_outcome` ✓
+- `satisfaction_score` ✓
+- `follow_up_needed` ✓
+- `Call Outcome` ✗ (has spaces, uppercase)
+
+---
+
+## Data Types
+
+| Type | When to Use | Example Values |
+|------|-------------|----------------|
+| **String** | Categories, text answers | "resolved", "billing", "product_x" |
+| **Number** | Scores, counts | 1-5 rating, count of issues |
+| **Boolean** | Yes/no questions | true, false |
+
+---
+
+## Example Metrics
+
+### Call Outcome (String)
+
+```
+Identifier: call_outcome
+Data Type: String
+Prompt: What was the outcome of this call?
+ Options: resolved, unresolved, transferred, callback_scheduled
+```
+
+### Satisfaction Score (Number)
+
+```
+Identifier: satisfaction_score
+Data Type: Number
+Prompt: Based on the conversation tone and customer responses,
+ rate the customer's satisfaction from 1 (very dissatisfied)
+ to 5 (very satisfied).
+```
+
+### Follow-up Needed (Boolean)
+
+```
+Identifier: follow_up_needed
+Data Type: Boolean
+Prompt: Does this call require any follow-up action from
+ the support team? Answer true or false.
+```
+
+### Product Discussed (String)
+
+```
+Identifier: product_discussed
+Data Type: String
+Prompt: What product or service was primarily discussed
+ in this conversation?
+```
+
+---
+
+## Using Templates
+
+Click **Templates** in the left panel to see pre-built metric sets:
+
+- Common support metrics
+- Sales qualification metrics
+- Satisfaction metrics
+
+Templates pre-fill identifier, type, and prompt. Customize as needed.
+
+---
+
+## Viewing Results
+
+After calls complete, metrics appear in:
+
+- **Conversation Logs** — Individual call details
+- **Analytics Dashboard** — Aggregate views
+- **Webhook Payloads** — Sent to your systems (Analytics Completed event)
+
+---
+
+## Best Practices
+
+### Write Clear Prompts
+
+The AI uses your prompt to analyze. Be specific:
+
+**Vague:** "Was the customer happy?"
+
+**Better:** "Based on the customer's language, tone, and explicit statements, rate their satisfaction from 1-5."
+
+### Use Consistent Identifiers
+
+Stick to a naming convention across agents for easier analysis.
+
+### Start Simple
+
+Begin with 3-5 key metrics. You can always add more later.
+
+### Test with Real Calls
+
+Make test calls and verify metrics are extracted correctly.
+
+---
+
+## What's Next
+
+
+
+ Test metric extraction
+
+
+ View aggregated metrics
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/prompt-section/language-selection.mdx b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/language-selection.mdx
new file mode 100644
index 0000000..819a5ca
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/language-selection.mdx
@@ -0,0 +1,91 @@
+---
+title: "Language Selection"
+sidebarTitle: "Language Selection"
+description: "Set the primary language for your agent's conversations."
+---
+
+Language selection determines what language your agent speaks and understands. This affects both speech recognition and text-to-speech output.
+
+---
+
+## Location
+
+**Prompt Section (top bar) → Language dropdown**
+
+---
+
+## How to Select
+
+1. Click the language dropdown
+2. Choose from available languages
+3. Selection applies immediately
+
+---
+
+## Available Languages
+
+The available languages depend on your selected voice. Choose your voice first, then select a language it supports.
+
+Common options include:
+- English
+- Spanish
+- French
+- German
+- Portuguese
+- Hindi
+- Arabic
+- Chinese
+- And more
+
+---
+
+## Voice and Language Relationship
+
+| If Voice Supports | You Can Select |
+|-------------------|----------------|
+| English only | English |
+| English, Spanish | English OR Spanish |
+| 18+ languages | Any of those languages |
+
+**Tip:** If you need specific languages, check voice capabilities first. Voices like Rachel support 18+ languages.
+
+---
+
+## Multi-Language Support
+
+For agents that need to switch languages during conversations:
+
+1. Select a multi-language voice
+2. Set primary language here
+3. Enable **Language Switching** in the Model Tab
+
+→ See: [Model Tab](/atoms/atoms-platform/single-prompt-agents/agent-settings/model-settings) for language switching configuration
+
+---
+
+## Best Practices
+
+### Choose Primary Language First
+
+Set the language most callers will use as the primary language.
+
+### Match Voice to Language
+
+Some voices sound more natural in certain languages. Preview the voice speaking your target language.
+
+### Test with Native Speakers
+
+Speech recognition and synthesis quality varies by language. Test with native speakers when possible.
+
+---
+
+## What's Next
+
+
+
+ Configure call termination
+
+
+ Language switching settings
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/prompt-section/model-selection.mdx b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/model-selection.mdx
new file mode 100644
index 0000000..18ab0ca
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/model-selection.mdx
@@ -0,0 +1,117 @@
+---
+title: "Model Selection"
+sidebarTitle: "Model Selection"
+description: "Choose the LLM that powers your agent's understanding and responses."
+---
+
+The model selection determines which Large Language Model (LLM) processes conversations. Different models offer different capabilities, speeds, and costs.
+
+
+ [IMAGE: Model dropdown expanded showing options]
+
+
+---
+
+## Location
+
+**Prompt Section (top bar) → First dropdown**
+
+---
+
+## Available Model Types
+
+| Type | Description |
+|------|-------------|
+| **Emotive Models** | Speech-to-speech with emotional tone and expression (Beta) |
+| **Traditional Models** | Standard LLM models for text processing |
+
+---
+
+## Available Models
+
+| Model | Provider | Best For |
+|-------|----------|----------|
+| **GPT-4o** | OpenAI | Complex conversations, nuanced understanding |
+| **Electron** | Atoms | Speed and efficiency |
+
+→ **NEEDS PLATFORM INFO:** Complete list of available models
+
+---
+
+## How to Select
+
+1. Click the model dropdown in the Prompt Section
+2. Browse available options
+3. Click to select your choice
+
+The change applies immediately.
+
+---
+
+## Choosing the Right Model
+
+### GPT-4o (Recommended for most)
+
+- Best understanding and reasoning
+- Handles complex queries well
+- Slightly higher latency than smaller models
+- Recommended for support, sales, complex workflows
+
+### Emotive Models (Beta)
+
+- Natural emotional expression
+- More human-like responses
+- Good for conversations requiring empathy
+- Beta — may have quirks
+
+### Electron Models
+
+- Optimized for speed
+- Lower latency
+- Good for simple, high-volume use cases
+- Cost-effective
+
+---
+
+## Considerations
+
+### Latency
+
+Larger models take longer to respond. For voice AI, every millisecond matters:
+- Simple queries → smaller models may be sufficient
+- Complex reasoning → larger models worth the tradeoff
+
+### Cost
+
+Different models have different per-minute costs:
+- Check your plan details for pricing
+- Higher-capability models typically cost more
+
+### Accuracy
+
+More capable models generally:
+- Follow instructions better
+- Handle edge cases more gracefully
+- Provide more nuanced responses
+
+---
+
+## Best Practices
+
+- **Start with GPT-4o** for most use cases
+- **Test thoroughly** when changing models
+- **Compare latency** in real calls
+- **Review conversation logs** to verify quality
+
+---
+
+## What's Next
+
+
+
+ Choose your agent's voice
+
+
+ Set primary language
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/prompt-section/voice-selection.mdx b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/voice-selection.mdx
new file mode 100644
index 0000000..eec1877
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/prompt-section/voice-selection.mdx
@@ -0,0 +1,144 @@
+---
+title: "Voice Selection"
+sidebarTitle: "Voice Selection"
+description: "Choose and preview the voice your agent uses."
+---
+
+Voice selection determines how your agent sounds. Atoms offers a library of high-quality voices with different characteristics to match your brand.
+
+
+ [IMAGE: Voice picker panel with filter options and voice list visible]
+
+
+---
+
+## Location
+
+**Prompt Section (top bar) → Voice dropdown**
+
+---
+
+## Voice Picker Panel
+
+Clicking the voice dropdown opens a panel with:
+
+| Element | Description |
+|---------|-------------|
+| **Search bar** | "Search for languages, accent" with filter icon |
+| **Filter tabs** | Language, Accent, Age, Gender, Model |
+| **Currently used** | Shows your selected voice |
+| **All Voices** | Full voice library |
+
+---
+
+## Filter Options
+
+Click filter tabs to narrow your search:
+
+### Language
+
+- ✓ All Language
+- African
+- Arabic
+- Bengali
+- Chinese
+- Croatian
+- English
+- Hindi
+- Spanish
+- (and more)
+
+### Other Filters
+
+- **Accent** — Regional variations
+- **Age** — Young, Middle, Mature
+- **Gender** — Male, Female
+- **Model** — Voice engine type
+
+---
+
+## Available Voices
+
+| Voice | Languages | Notes |
+|-------|-----------|-------|
+| **Tiffany** ⭐ | English, Hindi, Spanish +3 | Multi-language, warm |
+| **Daniel** ⭐ | English | Professional |
+| **Jessica** ⭐ | English | Friendly |
+| **Joseph** ⭐ | English | Confident |
+| **Brandon** ⭐ | English, Spanish, Hindi +4 | Multi-language |
+| **Rachel** ⭐ | English, Hindi, Portuguese +18 | Most languages |
+
+**Legend:**
+- ⭐ = Featured/premium voice
+- ▶️ = Preview button (click to hear sample)
+- "Others" = Shows regional variants
+
+---
+
+## How to Select
+
+1. Click the voice dropdown
+2. Use filters to narrow options (optional)
+3. Click ▶️ to preview a voice
+4. Click the voice name to select it
+
+The selected voice appears in the dropdown and is used for all conversations.
+
+---
+
+## Previewing Voices
+
+Before selecting, preview how voices sound:
+
+1. Find a voice you're interested in
+2. Click the ▶️ play button next to it
+3. Listen to the sample
+4. Compare multiple voices
+5. Select your preference
+
+**Tip:** Preview with text similar to what your agent will say. Different content sounds different.
+
+---
+
+## Choosing the Right Voice
+
+### Match Your Brand
+
+| Brand Personality | Voice Characteristics |
+|-------------------|----------------------|
+| Professional/Corporate | Clear, neutral, confident |
+| Friendly/Casual | Warm, approachable, upbeat |
+| Authoritative | Deep, measured, assured |
+| Youthful | Energetic, modern |
+
+### Consider Your Audience
+
+- Who are your callers?
+- What do they expect?
+- What builds trust with them?
+
+### Multi-Language Needs
+
+If your agent handles multiple languages, choose a voice that supports all needed languages (like Rachel with 18+ languages).
+
+---
+
+## Best Practices
+
+- **Preview before selecting** — Hearing is believing
+- **Test in real calls** — Browser preview differs from phone audio
+- **Match to use case** — Support vs. sales may need different voices
+- **Consider consistency** — Use the same voice across similar agents
+
+---
+
+## What's Next
+
+
+
+ Set primary language
+
+
+ Advanced voice configuration
+
+
diff --git a/fern/products/atoms/pages/platform/configuring-agents/widget-configuration.mdx b/fern/products/atoms/pages/platform/configuring-agents/widget-configuration.mdx
new file mode 100644
index 0000000..b7b9a28
--- /dev/null
+++ b/fern/products/atoms/pages/platform/configuring-agents/widget-configuration.mdx
@@ -0,0 +1,90 @@
+---
+title: "Widget Configuration"
+sidebarTitle: "Widget Configuration"
+description: "Configure the embeddable web widget for your agent."
+---
+
+The Widget section lets you configure an embeddable voice widget that visitors can use on your website. This is an alternative to phone-based deployment.
+
+
+ [IMAGE: Widget configuration page]
+
+
+---
+
+## Location
+
+**Left Sidebar → Widget**
+
+---
+
+## What is the Widget?
+
+A small button or panel that appears on your website. When visitors click it, they can have a voice conversation with your agent directly in their browser.
+
+**Benefits:**
+- No phone number needed
+- Works on any website
+- Visitors don't leave your site
+- Lower barrier to conversation
+
+---
+
+## Configuration Options
+
+→ **NEEDS PLATFORM INFO:** Specific widget configuration options and interface
+
+### Appearance
+
+- Widget button style
+- Colors and branding
+- Position on page (corner placement)
+- Size and visibility
+
+### Behavior
+
+- Auto-open settings
+- Greeting message
+- Privacy controls
+- Recording disclosure
+
+### Branding
+
+- Logo/icon customization
+- Brand colors
+- Custom CSS (if available)
+
+---
+
+## Getting the Embed Code
+
+After configuring your widget:
+
+1. Complete widget settings
+2. Generate embed code
+3. Copy the code snippet
+4. Add to your website's HTML
+
+→ See: [Widget Deployment](/atoms/atoms-platform/features/widget) for embedding instructions
+
+---
+
+## Testing the Widget
+
+1. Configure widget settings
+2. Save changes
+3. Use **Test Agent → Web Call** to test widget behavior
+4. Verify appearance and functionality
+
+---
+
+## What's Next
+
+
+
+ Get embed code for your site
+
+
+ Connect third-party services
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/conditions.mdx b/fern/products/atoms/pages/platform/convo-flow/conditions.mdx
new file mode 100644
index 0000000..f3549b0
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/conditions.mdx
@@ -0,0 +1,361 @@
+---
+title: "Conditions & Branching"
+sidebarTitle: "Conditions & Branching"
+description: "Create dynamic conversation paths based on caller responses."
+---
+
+Branching is what makes Conversational Flow powerful. Instead of a linear script, your agent can take different paths based on what callers say, how they respond, or data from your systems.
+
+
+ 
+
+
+---
+
+## How Branching Works
+
+
+
+ The current node poses a question or presents options.
+
+
+ The caller says something (or doesn't respond).
+
+
+ The AI checks each branch condition against the response.
+
+
+ The matching condition determines which node comes next.
+
+
+
+---
+
+## Configuring Branches
+
+Click any Default node, then click **Branching** to configure output paths.
+
+
+ 
+
+
+### Adding a Branch
+
+1. Click the Default node you want to branch from
+2. Click **Branching** in the configuration panel
+3. Click **+ Add Branch**
+4. Configure the condition
+5. Connect to the target node
+
+### Branch Fields
+
+| Field | Description |
+|-------|-------------|
+| **Label** | Name shown on the canvas (e.g., "Wants Billing Help") |
+| **Condition** | What triggers this path (natural language or variable-based) |
+| **Target Node** | Where the conversation goes when this condition matches |
+
+---
+
+## Condition Types
+
+
+
+ Write conditions in plain English. The AI interprets caller intent.
+
+ **Examples:**
+
+ | Condition | Matches When Caller Says |
+ |-----------|--------------------------|
+ | "User confirms" | "Yes", "Yeah", "That's right", "Correct" |
+ | "User declines" | "No", "Nope", "Not really", "I don't think so" |
+ | "User asks about billing" | "I have a billing question", "About my invoice" |
+ | "User wants to speak to a person" | "Can I talk to someone?", "Get me a human" |
+ | "User is frustrated" | Angry tone, complaints, escalation requests |
+ | "Anything else" | Fallback — catches everything not matched above |
+
+
+ Write conditions as if describing the caller's intent, not their exact words. The AI handles variations automatically.
+
+
+
+
+ Route based on variable values from APIs or collected data.
+
+ **Syntax:**
+ ```
+ {{variable_name}} operator value
+ ```
+
+ **Operators:**
+
+ | Operator | Meaning |
+ |----------|---------|
+ | `==` | Equals |
+ | `!=` | Not equals |
+ | `>` | Greater than |
+ | `<` | Less than |
+ | `>=` | Greater or equal |
+ | `<=` | Less or equal |
+
+ **Examples:**
+
+ | Condition | Logic |
+ |-----------|-------|
+ | `{{budget}} > 10000` | High-value lead path |
+ | `{{account_tier}} == "premium"` | VIP treatment |
+ | `{{attempts}} >= 3` | Escalation after 3 tries |
+ | `{{api.balance}} < 0` | Negative balance handling |
+
+
+
+ Combine multiple conditions for complex routing.
+
+ **AND Conditions:**
+ ```
+ {{account_tier}} == "premium" && {{budget}} > 10000
+ ```
+ Both must be true.
+
+ **OR Conditions:**
+ ```
+ {{issue_type}} == "billing" || {{issue_type}} == "payment"
+ ```
+ Either can be true.
+
+
+
+ Catch-all for when no other condition matches.
+
+ Use **"Anything else"** or leave condition empty for fallback behavior.
+
+ **Always include a default branch.** It handles:
+ - Unexpected responses
+ - Unclear answers
+ - Edge cases you didn't anticipate
+ - Silence or no response
+
+ **Good fallback prompt:**
+ ```
+ I didn't quite catch that. Could you tell me again —
+ are you calling about billing or technical support?
+ ```
+
+
+
+---
+
+## Branch Order Matters
+
+Conditions are evaluated top to bottom. The first matching condition wins.
+
+
+Put specific conditions first, fallback last. If "Anything else" is first, it will always match and other conditions will never trigger.
+
+
+**Correct Order:**
+1. `{{budget}} >= 50000` → Enterprise Path
+2. `{{budget}} >= 10000` → Professional Path
+3. `{{budget}} >= 1000` → Starter Path
+4. Anything else → Self-Serve Resources
+
+**Incorrect Order:**
+1. `{{budget}} >= 1000` ← This catches everything above $1k
+2. `{{budget}} >= 10000` ← Never reached
+3. `{{budget}} >= 50000` ← Never reached
+
+---
+
+## Real-World Examples
+
+### Support Routing
+
+```
+[Ask Issue Type]
+"I'm here to help! Are you calling about billing,
+technical support, or something else?"
+
+Branches:
+├── "User asks about billing" → [Billing Flow]
+├── "User has technical issue" → [Technical Flow]
+├── "User wants to speak to someone" → [Transfer Call]
+└── "Anything else" → [Clarify and Re-ask]
+```
+
+### Lead Qualification
+
+```
+[Ask Budget]
+"What's your approximate budget for this project?"
+
+→ Store response as {{budget}}
+
+Branches:
+├── {{budget}} >= 50000 → [Enterprise Path]
+├── {{budget}} >= 10000 → [Professional Path]
+├── {{budget}} >= 1000 → [Starter Path]
+└── "Anything else" → [Self-Serve Resources]
+```
+
+### Confirmation Flow
+
+```
+[Confirm Appointment]
+"Just to confirm — you'd like to book for
+Tuesday at 3pm. Is that correct?"
+
+Branches:
+├── "User confirms" → [Complete Booking]
+├── "User wants to change" → [Modify Appointment]
+└── "Anything else" → [Re-confirm]
+```
+
+### API Response Routing
+
+```
+[API Call: Check Account Status]
+
+Branches:
+├── {{account_status}} == "active" → [Standard Service]
+├── {{account_status}} == "suspended" → [Reactivation Flow]
+├── {{account_status}} == "premium" → [VIP Service]
+└── API Error → [Fallback / Transfer]
+```
+
+---
+
+## Best Practices
+
+
+ No matter how many conditions you define, something unexpected will happen.
+
+ Your fallback should:
+ - Acknowledge the response
+ - Re-ask the question differently
+ - Offer options to clarify
+
+ ```
+ "I want to make sure I understand. Are you calling about
+ billing, technical issues, or something else entirely?"
+ ```
+
+
+
+ Avoid overlapping conditions that could both match.
+
+ | Overlapping (Bad) | Exclusive (Good) |
+ |-------------------|------------------|
+ | "support" AND "technical support" | "billing" OR "technical" OR "other" |
+ | `>10` AND `>50` | `10-50` AND `>50` |
+
+ When conditions overlap, the first one wins — which may not be what you want.
+
+
+
+ It's easy to forget a branch while testing. Be systematic:
+
+ 1. List all possible paths
+ 2. Test each one deliberately
+ 3. Try edge cases (silence, gibberish, topic changes)
+ 4. Review in Conversation Logs
+
+
+
+ Too many nested branches become impossible to manage.
+
+ If your flow is getting too deep:
+ - Can you combine some branches?
+ - Should some paths be separate flows?
+ - Is Single Prompt better for this use case?
+
+
+
+ Labels appear on the canvas — make them meaningful.
+
+ | Bad Labels | Good Labels |
+ |------------|-------------|
+ | "Option 1" | "Wants Billing Help" |
+ | "Path A" | "Budget > $10k" |
+ | "Yes" | "Confirmed Appointment" |
+ | "Branch 2" | "Frustrated Customer" |
+
+
+---
+
+## Complex Patterns
+
+### Loop Back (Retry)
+
+For scenarios where you need to re-ask:
+
+```
+[Ask Budget]
+ ↓
+[Validate Response]
+ ├── Valid → Continue to next step
+ └── Invalid → Loop back to [Ask Budget]
+```
+
+
+**Avoid infinite loops.** Add a counter variable and exit after N attempts. After 2-3 retries, offer to transfer or end gracefully.
+
+
+### Parallel Paths That Merge
+
+Different paths can lead to the same destination:
+
+```
+[Qualify Lead]
+├── High Budget → [Fast Track] ─────────┐
+└── Standard Budget → [Standard Process] ├→ [Schedule Demo]
+ │
+```
+
+### Guard Rails
+
+Add safety branches for edge cases:
+
+```
+[Any Node]
+├── Normal flow conditions...
+├── "User seems upset or frustrated" → [Empathy Response]
+├── "User mentions legal or lawsuit" → [Transfer to Manager]
+└── "Anything else" → [Standard Fallback]
+```
+
+---
+
+## Debugging Branches
+
+When branches don't work as expected:
+
+
+
+ See exactly which conditions were evaluated and which matched.
+
+
+
+ Typos in variable names or operators fail silently.
+
+
+
+ If fallback triggers too often, your conditions may be too specific.
+
+
+
+ Conditions are checked top to bottom — earlier matches win.
+
+
+
+---
+
+## Next
+
+
+
+ Dynamic data for conditions and prompts
+
+
+ Validate your branches work correctly
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/api-calls.mdx b/fern/products/atoms/pages/platform/convo-flow/config/api-calls.mdx
new file mode 100644
index 0000000..c3da98d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/api-calls.mdx
@@ -0,0 +1,287 @@
+---
+title: "API Calls"
+sidebarTitle: "API Calls"
+description: "Connect your agent to external services and data."
+---
+
+API Calls let your agent fetch and send data during conversations. Look up customer information, check order status, book appointments, create tickets — all in real-time while the conversation is happening.
+
+In Conversational Flow, API calls are configured through dedicated nodes: **API Call**, **Pre-Call API**, and **Post-Call API**.
+
+---
+
+## API Nodes Overview
+
+| Node | When It Runs | Use Case |
+|------|--------------|----------|
+| **Pre-Call API** | Before conversation starts | Load customer data, set context |
+| **API Call** | During conversation | Fetch/send data mid-flow |
+| **Post-Call API** | After conversation ends | Log outcomes, trigger follow-ups |
+
+→ See: [Node Types](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/node-types) for full details on each node.
+
+---
+
+## Configuration
+
+All three API node types share the same configuration structure. Click the node to open its settings panel.
+
+
+
+ Select the HTTP method and enter the full API endpoint URL.
+
+ | Field | Description |
+ |-------|-------------|
+ | **Method** | HTTP method (GET, POST, PUT, PATCH, DELETE) |
+ | **URL** | Full endpoint URL |
+
+ Use variables in the URL for dynamic requests:
+
+ ```
+ https://api.example.com/customers/{{caller_phone}}
+ ```
+
+
+
+ Add custom headers to your API request. These are key-value pairs, often used for Content-Type or API keys.
+
+ | Common Headers | Example Value |
+ |----------------|---------------|
+ | `Content-Type` | `application/json` |
+ | `Authorization` | `Bearer {{api_key}}` |
+ | `X-API-Key` | `your-api-key-here` |
+
+ Click **+ Add Header** to add each header.
+
+
+
+ Construct the data payload for your request. Typically required for POST, PUT, or PATCH methods.
+
+ ```json
+ {
+ "phone": "{{caller_phone}}",
+ "name": "{{customer_name}}",
+ "action": "lookup"
+ }
+ ```
+
+ Variables are replaced with actual values at runtime.
+
+
+
+ Specify a variable name and JSONPath expression to extract values from the API response.
+
+ | Field | Description |
+ |-------|-------------|
+ | **Variable Name** | Name to store the extracted value |
+ | **JSONPath** | Path to the value in the response |
+
+ **Example:**
+
+ API returns:
+ ```json
+ {
+ "data": {
+ "name": "John Smith",
+ "tier": "premium"
+ }
+ }
+ ```
+
+ Extract mappings:
+ | Variable | JSONPath |
+ |----------|----------|
+ | `customer_name` | `$.data.name` |
+ | `account_tier` | `$.data.tier` |
+
+ Use in later nodes: `"Hi {{customer_name}}, I see you're a {{account_tier}} member."`
+
+
+
+---
+
+## Requirements
+
+
+**API Call nodes have connection requirements:**
+- Must have at least one incoming connection
+- Must have at least one outgoing connection
+- Must have an endpoint URL configured
+
+
+Pre-Call API and Post-Call API nodes have different connection requirements since they run at specific points in the call lifecycle.
+
+---
+
+## Example: Customer Lookup (Pre-Call)
+
+Load customer data before the conversation starts.
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Method** | GET |
+ | **URL** | `https://crm.example.com/api/customers?phone={{caller_phone}}` |
+
+
+
+ | JSONPath | Variable |
+ |----------|----------|
+ | `$.customer.name` | `customer_name` |
+ | `$.customer.tier` | `account_tier` |
+ | `$.customer.last_order` | `last_order` |
+
+
+
+ ```
+ Hello {{customer_name|there}}! I see you're a {{account_tier}}
+ member. Your last order was {{last_order}}.
+
+ How can I help you today?
+ ```
+
+
+
+---
+
+## Example: Mid-Conversation Booking
+
+Book an appointment based on information collected during the call.
+
+
+
+ ```
+ [Collect Preferred Time]
+ ↓
+ [API Call: Book Appointment]
+ ↓
+ [Confirm or Handle Error]
+ ```
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Method** | POST |
+ | **URL** | `https://calendar.example.com/api/appointments` |
+ | **Headers** | `Content-Type: application/json` |
+ | **Body** | See below |
+
+ ```json
+ {
+ "customer_phone": "{{caller_phone}}",
+ "customer_name": "{{customer_name}}",
+ "preferred_time": "{{collected_time}}",
+ "service_type": "consultation"
+ }
+ ```
+
+
+
+ ```
+ [API Call: Book Appointment]
+ ├── {{booking_status}} == "confirmed" → [Confirmation Node]
+ ├── {{booking_status}} == "unavailable" → [Offer Alternative]
+ └── Error → [Fallback / Transfer]
+ ```
+
+
+
+---
+
+## Example: Post-Call CRM Update
+
+Log the call outcome after the conversation ends.
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Method** | POST |
+ | **URL** | `https://crm.example.com/api/call-logs` |
+
+
+
+ ```json
+ {
+ "phone": "{{caller_phone}}",
+ "agent_id": "{{agent_id}}",
+ "call_id": "{{call_id}}",
+ "duration": "{{call_duration}}",
+ "outcome": "{{disposition}}",
+ "notes": "{{call_summary}}",
+ "collected_data": {
+ "budget": "{{collected_budget}}",
+ "timeline": "{{collected_timeline}}"
+ }
+ }
+ ```
+
+
+
+---
+
+## Using Variables in API Calls
+
+Variables work throughout your API configuration:
+
+**In URL:**
+```
+https://api.example.com/orders/{{order_id}}
+```
+
+**In Headers:**
+```
+Authorization: Bearer {{api_key}}
+```
+
+**In Body:**
+```json
+{
+ "phone": "{{caller_phone}}",
+ "query": "{{customer_question}}"
+}
+```
+
+→ See: [Variables](/atoms/atoms-platform/conversational-flow-agents/workflow-tab/variables)
+
+---
+
+## Tips
+
+
+ APIs can fail. Add branches to handle errors:
+
+ ```
+ [API Call]
+ ├── Success → Continue
+ └── Error → [Fallback Response or Transfer]
+ ```
+
+ In your fallback node: "I'm having trouble accessing that information right now. Let me connect you with someone who can help."
+
+
+
+ For slow APIs, ensure your timeout is adequate — but remember the caller is waiting. Keep API calls as fast as possible.
+
+
+
+ Test your API calls with actual responses to ensure:
+ - JSONPath expressions extract correctly
+ - Variables populate as expected
+ - Error handling works
+
+
+---
+
+## Related
+
+
+
+ Full reference for API nodes
+
+
+ Use API response data in prompts
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/end-call.mdx b/fern/products/atoms/pages/platform/convo-flow/config/end-call.mdx
new file mode 100644
index 0000000..1e084c7
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/end-call.mdx
@@ -0,0 +1,135 @@
+---
+title: "End Call"
+sidebarTitle: "End Call"
+description: "Configure when and how your agent ends calls."
+---
+
+In Conversational Flow, calls end when the conversation reaches an **End Call node**. This node terminates the call gracefully with a closing message.
+
+---
+
+## How End Calls Work
+
+Unlike Single Prompt agents where end conditions trigger automatically, Conversational Flow agents end calls explicitly when the flow reaches an End Call node.
+
+```
+[Conversation Flow]
+ ↓
+[Final Question]
+├── "User confirms" → [End Call: Resolved]
+├── "User has more questions" → [Loop back]
+└── "User wants transfer" → [Transfer Call]
+```
+
+---
+
+## End Call Node Configuration
+
+Click an End Call node to configure it.
+
+| Field | Description |
+|-------|-------------|
+| **Name** | Identifier shown on canvas (e.g., "End - Resolved") |
+| **Closing Message** | What the agent says before hanging up |
+
+### Example Closings
+
+
+
+ ```
+ Great! I'm glad I could help. Is there anything else
+ before I let you go? ... Perfect! Thank you for calling
+ Acme Support. Have a wonderful day!
+ ```
+
+
+
+ ```
+ I'm connecting you now. Thanks for calling Acme, and
+ have a great day!
+ ```
+
+
+
+ ```
+ Thanks so much for your interest. I'll have someone
+ send over some resources that might be helpful. Take care!
+ ```
+
+
+
+ ```
+ It seems like you might have stepped away. Feel free to
+ call back anytime if you need assistance. Goodbye!
+ ```
+
+
+
+---
+
+## Multiple End Points
+
+Your flow will likely have multiple End Call nodes for different outcomes:
+
+| End Call Node | Use Case |
+|---------------|----------|
+| `End - Resolved` | Issue successfully handled |
+| `End - Goodbye` | Customer said goodbye |
+| `End - Transfer Complete` | After successful transfer |
+| `End - No Response` | Caller became unresponsive |
+| `End - Out of Scope` | Couldn't help, directed elsewhere |
+| `End - Callback Scheduled` | Follow-up arranged |
+
+
+**Every path must end.** Make sure all branches in your flow eventually reach an End Call or Transfer Call node. Use the validation feature to find orphaned paths.
+
+
+---
+
+## Best Practices
+
+
+ Don't assume the caller is done. Ask for confirmation:
+
+ ```
+ Is there anything else I can help you with today?
+ ```
+
+ Create branches:
+ - "User confirms they're done" → End Call
+ - "User has more questions" → Loop back
+
+
+
+ Different endings deserve different messages:
+
+ | Outcome | Closing Tone |
+ |---------|--------------|
+ | Resolved | Warm, celebratory |
+ | Not qualified | Helpful, redirecting |
+ | No response | Polite, inviting return |
+ | After transfer | Brief, professional |
+
+
+
+ For complex interactions, summarize before closing:
+
+ ```
+ Just to recap — I've scheduled your appointment for Tuesday
+ at 3pm, and sent a confirmation to {{customer_email}}.
+ Is there anything else before we wrap up?
+ ```
+
+
+---
+
+## Related
+
+
+
+ Complete node reference
+
+
+ Hand off to human agents
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/general-settings.mdx b/fern/products/atoms/pages/platform/convo-flow/config/general-settings.mdx
new file mode 100644
index 0000000..d63b74c
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/general-settings.mdx
@@ -0,0 +1,40 @@
+---
+title: "General Settings"
+sidebarTitle: "General Settings"
+description: "Configure timeout behavior for idle conversations."
+---
+
+General Settings control how long your agent waits for a response before prompting the caller — and when to give up.
+
+**Location:** Agent Settings → General tab
+
+
+ 
+
+
+---
+
+## LLM Idle Timeout Settings
+
+Configure how long the agent waits for user response before sending an inactivity message. After 3 attempts with no response, the conversation automatically ends.
+
+| Setting | Default | Description |
+|---------|---------|-------------|
+| **Chat Timeout** | 60 sec | For text chat conversations |
+| **Webcall Timeout** | 20 sec | For browser-based voice calls |
+| **Telephony Timeout** | 20 sec | For phone calls |
+
+Each timeout triggers an inactivity prompt. If the user still doesn't respond after 3 prompts, the agent ends the conversation gracefully.
+
+---
+
+## Next
+
+
+
+ Try your agent before going live
+
+
+ Review and analyze calls
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/knowledge-base.mdx b/fern/products/atoms/pages/platform/convo-flow/config/knowledge-base.mdx
new file mode 100644
index 0000000..3f4ba3d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/knowledge-base.mdx
@@ -0,0 +1,122 @@
+---
+title: "Knowledge Base"
+sidebarTitle: "Knowledge Base"
+description: "Give your agent access to reference documents."
+---
+
+A Knowledge Base is a repository of information your agent can search during conversations. Instead of cramming everything into the prompt, upload documents — product specs, policies, FAQs — and let the agent retrieve what it needs.
+
+**Location:** Settings tab → Model → Knowledge Base dropdown
+
+
+ 
+
+
+
+In Conversational Flow agents, Knowledge Base is configured in the **Model tab** alongside the Global Prompt, not in a separate configuration panel.
+
+
+---
+
+## Setup
+
+1. Go to **Settings** tab
+2. Open **Model** section
+3. Find the **Knowledge Base** dropdown
+4. Select a KB from the list (or "No Knowledge Base")
+
+
+You need to create a Knowledge Base first before you can attach it here. See [Creating Knowledge Bases](/atoms/atoms-platform/features/knowledge-base).
+
+
+---
+
+## Local vs Global
+
+| Type | Scope | Best For |
+|------|-------|----------|
+| **Local** | This agent only | Agent-specific information |
+| **Global** | Shared across agents | Company-wide policies, general FAQs |
+
+---
+
+## How It Works
+
+1. **Caller asks a question** → "What's your return policy?"
+2. **Agent searches KB** → Finds relevant documents automatically
+3. **Agent responds** → Uses retrieved information in the answer
+
+The agent decides when to search based on the question. You don't need to configure triggers — it happens automatically when relevant.
+
+---
+
+## KB + Global Prompt
+
+In Conversational Flow, both the Knowledge Base and Global Prompt are in the Model tab. They work together:
+
+| Component | Purpose |
+|-----------|---------|
+| **Global Prompt** | Personality, behavior guidelines, style instructions |
+| **Knowledge Base** | Factual reference material, policies, product info |
+
+**Example Global Prompt instruction:**
+
+```markdown
+When answering questions about products, pricing, or policies,
+always check the knowledge base first. Don't guess at specific
+details like prices or return windows.
+```
+
+---
+
+## Best Practices
+
+
+ | Put in KB | Put in Prompt |
+ |-----------|---------------|
+ | Product details | Personality and tone |
+ | Policies | Conversation patterns |
+ | FAQ answers | End conditions |
+ | Pricing info | Behavioral guidelines |
+
+
+
+ Smaller, topic-specific documents retrieve better than massive catch-all files.
+
+ | Better | Worse |
+ |--------|-------|
+ | `returns-policy.pdf` | `everything.pdf` |
+ | `pricing-2024.txt` | `company-info.docx` (500 pages) |
+ | `product-specs-widget.md` | `all-products.pdf` |
+
+
+
+ Ask your agent questions that should hit the KB. Verify it finds the right information:
+
+ 1. Test with expected questions ("What's the return window?")
+ 2. Test with variations ("Can I return something after 30 days?")
+ 3. Check Conversation Logs to see what was retrieved
+
+
+
+ Tell your agent when to consult the knowledge base:
+
+ ```
+ For any question about specific policies, pricing, or product
+ specifications, search the knowledge base. Never make up numbers
+ or policy details.
+ ```
+
+
+---
+
+## Related
+
+
+
+ Global Prompt and model configuration
+
+
+ Creating and managing knowledge bases
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/languages.mdx b/fern/products/atoms/pages/platform/convo-flow/config/languages.mdx
new file mode 100644
index 0000000..20daaba
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/languages.mdx
@@ -0,0 +1,53 @@
+---
+title: "Languages"
+sidebarTitle: "Languages"
+description: "Configure supported languages for your agent."
+---
+
+The Languages tab lets you define which languages your Conversational Flow agent can communicate in.
+
+**Location:** Settings tab → Languages
+
+
+ 
+
+
+---
+
+## Configuration
+
+| Setting | Description |
+|---------|-------------|
+| **Supported Languages** | Languages your agent can speak and understand |
+| **Primary Language** | Default language for starting conversations |
+
+---
+
+## Adding Languages
+
+1. Open **Settings** tab
+2. Go to **Languages**
+3. Click **+ Add Language**
+4. Select from available languages
+5. Set one as primary
+
+Your agent will start conversations in the primary language but can switch to any supported language if the caller speaks differently.
+
+---
+
+## Language Switching
+
+When combined with **Language Switching** in the Model tab, your agent can automatically detect when a caller speaks a different language and switch accordingly.
+
+---
+
+## Next
+
+
+
+ Configure speech speed and pronunciation
+
+
+ Set up Global Prompt and Knowledge Base
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/model-settings.mdx b/fern/products/atoms/pages/platform/convo-flow/config/model-settings.mdx
new file mode 100644
index 0000000..af76185
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/model-settings.mdx
@@ -0,0 +1,88 @@
+---
+title: "Model Settings"
+sidebarTitle: "Model Settings"
+description: "Configure AI model, global prompt, and knowledge base."
+---
+
+Model Settings control how the AI behaves across your flow — the model powering responses, global instructions, and knowledge base connection.
+
+**Location:** Settings tab → Model
+
+
+ 
+
+
+
+Conversational Flow agents have **Global Prompt** and **Knowledge Base** in this tab since individual prompts are defined per-node in the workflow.
+
+
+---
+
+## AI Model
+
+| Setting | Description |
+|---------|-------------|
+| **LLM Model** | The AI model (Electron, GPT-4o, etc.) |
+| **Language** | Primary language for responses |
+
+---
+
+## Global Prompt
+
+Set global instructions for your agent's personality and behavior. This applies across all nodes (limit: 4,000 characters).
+
+Use this for:
+- Personality traits
+- Behavioral guidelines
+- Consistent phrasing
+- Company-specific instructions
+
+Node-specific prompts add to the Global Prompt. Use Global Prompt for consistency, node prompts for specific questions.
+
+---
+
+## Knowledge Base
+
+Connect a knowledge base for reference material.
+
+| Option | Description |
+|--------|-------------|
+| **No Knowledge Base** | Agent uses only prompts |
+| **[Your KB]** | Agent can search for answers |
+
+
+---
+
+## Speech Formatting
+
+When enabled (default: ON), transcripts are automatically formatted for readability — punctuation, paragraphs, and proper formatting for dates and numbers.
+
+---
+
+## Language Switching
+
+Enable your agent to switch languages mid-conversation (default: ON).
+
+### Advanced Settings
+
+| Setting | Default | Description |
+|---------|---------|-------------|
+| **Minimum Words** | 2 | Words before considering a switch |
+| **Strong Signal** | 0.7 | Confidence for immediate switch |
+| **Weak Signal** | 0.3 | Confidence for tentative detection |
+| **Consecutive Weak** | 2 | Weak signals needed to switch |
+
+Defaults work for most cases. Adjust only if seeing unwanted switching.
+
+---
+
+## Next
+
+
+
+ Create and manage knowledge bases
+
+
+ Configure speech and pronunciation
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/phone-number.mdx b/fern/products/atoms/pages/platform/convo-flow/config/phone-number.mdx
new file mode 100644
index 0000000..f6ae21f
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/phone-number.mdx
@@ -0,0 +1,38 @@
+---
+title: "Phone Number"
+sidebarTitle: "Phone Number"
+description: "Assign a phone number to your agent."
+---
+
+The Phone Number tab lets you connect your agent to a phone number for inbound and outbound calls. Once assigned, callers to that number will reach this agent.
+
+**Location:** Settings tab → Phone Number
+
+
+ 
+
+
+---
+
+## Select Phone Numbers
+
+Click the dropdown to choose from your available phone numbers. If you haven't set up any numbers yet, you'll see "No phone numbers selected."
+
+You can assign multiple numbers to the same agent if needed.
+
+
+You need to purchase or configure phone numbers before they appear here. See [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers) to get started.
+
+
+---
+
+## Next
+
+
+
+ Get and manage phone numbers
+
+
+ Set up outbound calling
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/transfer-call.mdx b/fern/products/atoms/pages/platform/convo-flow/config/transfer-call.mdx
new file mode 100644
index 0000000..22a9c84
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/transfer-call.mdx
@@ -0,0 +1,215 @@
+---
+title: "Transfer Call"
+sidebarTitle: "Transfer Call"
+description: "Configure call transfers to human agents."
+---
+
+In Conversational Flow, transfers happen when the conversation reaches a **Transfer Call node**. This hands the call to a human agent via cold or warm transfer.
+
+---
+
+## How Transfers Work
+
+Transfer Call nodes route callers to human agents when the AI can't (or shouldn't) handle the situation.
+
+```
+[Conversation Flow]
+ ↓
+[Handle Request]
+├── AI can resolve → Continue flow
+├── Needs human → [Transfer Call: Support]
+└── VIP customer → [Transfer Call: Premium Line]
+```
+
+---
+
+## Transfer Call Node Configuration
+
+Click a Transfer Call node to configure it.
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Name** | Yes | Identifier (e.g., `transfer_to_sales`) |
+| **Description** | Yes | Internal note about when this transfer triggers |
+| **Phone Number** | Yes | Transfer destination with country code |
+| **Transfer Type** | Yes | Cold or Warm |
+
+---
+
+## Transfer Types
+
+
+
+ **Immediate handoff.** The caller is connected directly to the destination without any briefing to the receiving agent.
+
+ | Pros | Cons |
+ |------|------|
+ | Fast | No context for receiving agent |
+ | Simple | Caller may repeat themselves |
+
+ **Best for:**
+ - Simple escalations
+ - When context isn't needed
+ - Time-sensitive transfers
+ - High call volume scenarios
+
+
+
+ **AI briefs the agent first.** The receiving agent gets context before the caller joins.
+
+ | Pros | Cons |
+ |------|------|
+ | Human has context | Slightly longer |
+ | Better experience | More configuration |
+
+ **Best for:**
+ - Complex issues needing context
+ - VIP callers
+ - When continuity matters
+
+ ### Warm Transfer Options
+
+ | Setting | Description |
+ |---------|-------------|
+ | **On-hold Music** | What the caller hears while waiting for connection |
+ | **Transfer if Human** | Skip transfer if voicemail detected (coming soon) |
+ | **Whisper Message** | Private message only the agent hears before connecting |
+ | **Handoff Message** | What the AI says to brief the receiving agent |
+ | **Three-way Message** | Message both parties hear when connected |
+
+
+
+---
+
+## Warm Transfer Messages
+
+### Whisper Message
+
+Only the agent hears this — give them everything they need:
+
+```
+Incoming transfer: Customer {{customer_name}} calling about
+a billing dispute. They've been charged twice for order #{{order_id}}.
+Identity already verified.
+```
+
+### Handoff Message
+
+What the AI says to brief the agent (can include variables):
+
+```
+Hi, I'm transferring a customer who needs help with a technical
+issue. They've tried restarting their device without success.
+```
+
+### Three-way Message
+
+Both parties hear this — use it for smooth introductions:
+
+```
+I've connected you with Sarah from our billing team.
+Sarah, {{customer_name}} is calling about a duplicate charge.
+```
+
+---
+
+## Multiple Transfer Destinations
+
+Create multiple Transfer Call nodes for different scenarios:
+
+| Transfer Node | Destination | When |
+|---------------|-------------|------|
+| `Transfer - Sales` | Sales team | Purchase interest, demo requests |
+| `Transfer - Support` | Support team | Technical issues |
+| `Transfer - Billing` | Billing team | Payment questions |
+| `Transfer - Manager` | Manager line | Escalations, complaints |
+
+---
+
+## Examples
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_sales` |
+ | **Description** | "Transfer when caller expresses strong purchase intent" |
+ | **Phone Number** | +1-555-SALES |
+ | **Type** | Cold |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_support` |
+ | **Description** | "Transfer when issue requires manual intervention" |
+ | **Phone Number** | +1-555-SUPPORT |
+ | **Type** | Warm |
+ | **Whisper** | "Technical issue: {{issue_type}}. Customer: {{customer_name}}" |
+
+
+
+ | Field | Value |
+ |-------|-------|
+ | **Name** | `transfer_manager` |
+ | **Description** | "Transfer when caller is upset and requests a manager" |
+ | **Phone Number** | +1-555-MANAGER |
+ | **Type** | Warm |
+ | **Whisper** | "Escalation: Customer is frustrated about {{issue_summary}}" |
+
+
+
+---
+
+## Best Practices
+
+
+ Tell the caller what's happening:
+
+ ```
+ I'm going to connect you with one of our billing specialists
+ who can help resolve this. It may take just a moment to connect.
+ Is that okay?
+ ```
+
+
+
+ When context matters, always use warm transfer:
+
+ - The caller has explained a complex problem
+ - You've already verified their identity
+ - The issue requires sensitive handling
+ - The caller is frustrated
+
+
+
+ Make whisper messages actionable:
+
+ | Good | Bad |
+ |------|-----|
+ | "Billing dispute: double-charged $150, order #12345" | "Billing issue" |
+ | "Technical: Can't log in, tried password reset 3x" | "Login problem" |
+ | "VIP customer, account value $50k/year" | "Important customer" |
+
+
+
+ What happens if the transfer line is busy or doesn't answer?
+
+ Consider adding a branch that handles transfer failure:
+ - Offer to schedule a callback
+ - Provide an alternative contact method
+ - Return to AI handling with apology
+
+
+---
+
+## Related
+
+
+
+ Complete node reference
+
+
+ Configure call termination
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/variables.mdx b/fern/products/atoms/pages/platform/convo-flow/config/variables.mdx
new file mode 100644
index 0000000..baa145d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/variables.mdx
@@ -0,0 +1,76 @@
+---
+title: "Variables"
+sidebarTitle: "Variables"
+description: "Use dynamic values throughout your conversation flow."
+---
+
+Variables let you personalize conversations with dynamic data — caller information, API responses, or values you define.
+
+**Location:** Workflow tab → **{ } Variables** button (top right)
+
+
+ 
+
+
+---
+
+## Variable Types
+
+| Type | Source | Example |
+|------|--------|---------|
+| **User Defined** | Variables you create | `{{company_name}}`, `{{promo_code}}` |
+| **System** | Platform-provided (read-only) | `{{caller_phone}}`, `{{call_duration}}` |
+| **API** | Extracted from API responses | `{{customer_name}}`, `{{account_tier}}` |
+
+---
+
+## Syntax
+
+Use double curly braces anywhere in prompts or conditions:
+
+```
+Hello {{customer_name}}! Thanks for calling {{company_name}}.
+```
+
+### Default Values
+
+Handle missing variables with the pipe syntax:
+
+```
+Hello {{customer_name|there}}!
+```
+
+If `customer_name` is empty → "Hello there!"
+
+---
+
+## System Variables
+
+| Variable | Description |
+|----------|-------------|
+| `{{caller_phone}}` | Caller's phone number |
+| `{{call_time}}` | When call started |
+| `{{call_duration}}` | Elapsed seconds |
+| `{{call_direction}}` | "inbound" or "outbound" |
+| `{{agent_id}}` | This agent's ID |
+| `{{call_id}}` | Unique call identifier |
+
+---
+
+## Creating Variables
+
+1. Click **{ } Variables** in the workflow tab
+2. Go to **User Defined** tab
+3. Click **+ Add Variable**
+4. Enter name and default value
+
+---
+
+## Extracting from APIs
+
+In API nodes, use **Extract Response Data** to create variables from responses:
+
+| JSONPath | Variable |
+|----------|----------|
+| `$.data.name` | `customer_name` |
+| `$.data.tier` | `account_tier` |
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/voice-settings.mdx b/fern/products/atoms/pages/platform/convo-flow/config/voice-settings.mdx
new file mode 100644
index 0000000..a740f5e
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/voice-settings.mdx
@@ -0,0 +1,170 @@
+---
+title: "Voice Settings"
+sidebarTitle: "Voice Settings"
+description: "Fine-tune speech behavior, pronunciation, and voice detection."
+---
+
+Voice Settings give you precise control over how your agent sounds and listens. From speech speed to background ambiance, pronunciation rules to turn-taking — this is where you shape the audio experience.
+
+**Location:** Settings tab → Voice
+
+
+ 
+
+
+---
+
+## Voice
+
+Select the voice for your agent. Click the dropdown to browse available voices — you can preview each one before selecting.
+
+---
+
+## Speech Settings
+
+### Speech Speed
+
+Control how fast your agent speaks.
+
+| Control | Range | Default |
+|---------|-------|---------|
+| Slider | Slow ↔ Fast | 1 |
+
+Slide left for a more measured, deliberate pace. Slide right for quicker delivery. Find the sweet spot that matches your use case — slower often works better for complex information, faster for simple confirmations.
+
+---
+
+## Pronunciation & Background
+
+### Pronunciation Dictionaries
+
+Add custom pronunciations for words that aren't pronounced correctly by the default voice.
+
+This is especially useful for:
+- Brand names
+- Technical terms
+- Proper nouns
+- Industry-specific jargon
+
+**To add a pronunciation:** Click **Add Pronunciation** to open the modal.
+
+
+ 
+
+
+| Field | Description |
+|-------|-------------|
+| **Word** | The word as written |
+| **Pronunciation** | How it should sound |
+
+### Background Sound
+
+Add ambient audio behind your agent's voice for a more natural feel.
+
+| Option | Description |
+|--------|-------------|
+| **None** | Silent background (default) |
+| **Office** | Subtle office ambiance |
+| **Call Center** | Busy call center sounds |
+| **Static** | Light static noise |
+| **Cafe** | Coffee shop atmosphere |
+
+---
+
+## Advanced Voice Settings
+
+### Mute User Until First Bot Response
+
+When enabled, the user's audio is muted until the agent's first response is complete. Useful for preventing early interruptions during the greeting.
+
+### Voicemail Detection
+
+Detects when a call goes to voicemail instead of reaching a live person.
+
+
+Voicemail detection may not work as expected if **Release Time** is less than 0.6 seconds.
+
+
+### Personal Info Redaction (PII)
+
+Automatically redacts sensitive personal information from transcripts and logs.
+
+### Denoising
+
+Filters out background noise and improves voice clarity before processing. This helps reduce false detections caused by environmental sounds — useful when callers are in noisy environments.
+
+---
+
+## Voice Detection
+
+Fine-tune how your agent recognizes when someone is speaking.
+
+### Confidence
+
+Defines how strict the system is when deciding if detected sound is speech.
+
+- **Higher values** → Less likely to trigger on background noise
+- **Lower values** → More sensitive to quiet speech
+
+| Default | Range |
+|---------|-------|
+| 0.70 | 0 – 1 |
+
+### Min Volume
+
+The minimum volume level required to register as speech.
+
+| Default | Range |
+|---------|-------|
+| 0.60 | 0 – 1 |
+
+### Trigger Time (Seconds)
+
+How long the system waits after detecting the start of user speech (and after the bot has finished speaking) before processing. This helps avoid overlapping speech and false triggers.
+
+| Default | Range |
+|---------|-------|
+| 0.10 | 0 – 1 |
+
+### Release Time (Seconds)
+
+How long the system waits after the user stops speaking before the bot begins its response. This ensures the user has completely finished their thought.
+
+| Default | Range |
+|---------|-------|
+| 0.30 | 0 – 1+ |
+
+
+**Start with defaults.** Only adjust these if you're experiencing specific issues like missed words or premature responses.
+
+
+---
+
+## Smart Turn Detection
+
+Intelligent detection of when the caller is done speaking. When enabled, the agent uses context and speech patterns — not just silence — to determine when it's time to respond.
+
+---
+
+## Interruption Backoff Timer
+
+Time in seconds to prevent interruptions after the bot starts speaking (default: 0, disabled).
+
+This helps prevent conversation loops when the user and bot interrupt each other — the agent will wait this duration before allowing itself to be interrupted again.
+
+
+For per-node interruption control, use the **Uninterruptible** toggle on Default nodes.
+
+
+---
+
+## Next
+
+
+
+ Configure AI model, Global Prompt, and Knowledge Base
+
+
+ Set timeout behavior
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/config/webhooks.mdx b/fern/products/atoms/pages/platform/convo-flow/config/webhooks.mdx
new file mode 100644
index 0000000..635e526
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/config/webhooks.mdx
@@ -0,0 +1,29 @@
+---
+title: "Webhooks"
+sidebarTitle: "Webhooks"
+description: "Connect your agent to webhook endpoints."
+---
+
+Webhooks push real-time data to your systems when call events happen — starts, ends, analytics ready. Use them to update CRMs, create tickets, trigger workflows, or feed analytics pipelines.
+
+**Location:** Settings tab → Webhooks
+
+---
+
+## Adding to Your Agent
+
+Once a webhook endpoint exists, connect it to your agent here.
+
+
+ 
+
+
+Select your webhook from the dropdown. The agent will now send events to that endpoint.
+
+---
+
+## Next
+
+
+ Create endpoints, manage subscriptions, and view payload details
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/from-template.mdx b/fern/products/atoms/pages/platform/convo-flow/from-template.mdx
new file mode 100644
index 0000000..4053bdf
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/from-template.mdx
@@ -0,0 +1,78 @@
+---
+title: "From Template"
+sidebarTitle: "Start with Template"
+description: "Jumpstart your Conversational Flow agent with pre-built templates."
+---
+
+Templates give you a proven starting point. Pick one that matches your use case, customize it, and you're ready to go.
+
+---
+
+## Getting There
+
+
+
+ From your dashboard, click the green **Create Agent** button in the top right.
+
+
+
+ Select the second option in the modal.
+
+
+
+
+
+
+
+ Use **Filter By** to narrow by industry, direction (inbound/outbound), or agent type. Click any template to select it, then hit **Create**.
+
+
+
+
+
+
+
+The editor opens with a complete workflow — nodes, branches, and settings ready to customize.
+
+---
+
+## What Templates Include
+
+Each template comes with a complete starting point:
+
+| Component | What You Get |
+|-----------|--------------|
+| **Complete Workflow** | Nodes and branches for the entire conversation flow |
+| **Node Prompts** | Pre-written prompts for each step |
+| **Branch Conditions** | Logic already configured for common responses |
+| **Voice Selection** | A voice that fits the use case |
+
+Templates follow proven conversation patterns for their use case. The structure is designed — you just need to customize the details.
+
+---
+
+## Customizing Your Template
+
+Templates are starting points. Always replace the placeholders with your specifics:
+
+- **Company name and details** — Replace placeholder names with your actual business
+- **Policies and rules** — Update return windows, hours, pricing, etc.
+- **Node prompts** — Adjust the tone to match your brand
+- **Branch conditions** — Add or modify paths for your specific needs
+
+
+**Keep the structure.** Templates are organized intentionally. Replace the content, but keep the overall flow — it's designed for that use case.
+
+
+---
+
+## What's Next
+
+
+
+ Understand the canvas and make changes
+
+
+ Validate before deploying
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/manual-setup.mdx b/fern/products/atoms/pages/platform/convo-flow/manual-setup.mdx
new file mode 100644
index 0000000..ff6eaa6
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/manual-setup.mdx
@@ -0,0 +1,56 @@
+---
+title: "Manual Setup"
+sidebarTitle: "Start from Scratch"
+description: "Build a Conversational Flow agent from a blank canvas."
+---
+
+Starting from scratch gives you complete control. You'll land in an empty workflow builder ready for your design.
+
+---
+
+## Getting There
+
+
+
+ From your dashboard, click the green **Create Agent** button in the top right.
+
+
+
+ Select the first option in the modal.
+
+
+
+
+
+
+
+ Choose **Conversational Flow** as your agent type.
+
+
+
+The editor opens with an empty canvas — ready for you to build your workflow.
+
+---
+
+## What's Next
+
+You're now in the editor. Here's where to go from here:
+
+
+
+ Learn the canvas and start adding nodes
+
+
+ Every node type and how to use them
+
+
+ Create paths based on caller responses
+
+
+ Voice, model, and agent settings
+
+
+
+
+**First time?** Start by dragging a Default node onto the canvas, writing a greeting, and hitting **Test Agent** (top right). You can build out the full flow as you go.
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/node-types.mdx b/fern/products/atoms/pages/platform/convo-flow/node-types.mdx
new file mode 100644
index 0000000..6e54832
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/node-types.mdx
@@ -0,0 +1,446 @@
+---
+title: "Node Types"
+sidebarTitle: "Node Types"
+description: "Complete reference for every node type in Conversational Flow."
+---
+
+Nodes are the building blocks of your conversation flow. Each type serves a specific purpose in guiding the conversation from start to finish.
+
+---
+
+## Node Types at a Glance
+
+| Node | Purpose | When to Use |
+|------|---------|-------------|
+| [Default](#default-node) | Conversation step | Each conversation point where the agent speaks and listens |
+| [API Call](#api-call-node) | External data | Fetch or send data mid-conversation |
+| [Transfer Call](#transfer-call-node) | Handoff to human | Connect caller to a live agent |
+| [End Call](#end-call-node) | Terminate call | Natural conversation endings |
+| [Pre-Call API](#pre-call-api-node) | Load context | Get data before the call starts |
+| [Post-Call API](#post-call-api-node) | Save data | Send data after the call ends |
+
+---
+
+## Default Node
+
+The workhorse of your flow. Each Default node represents one step in the conversation where your agent speaks and waits for a response.
+
+
+ 
+
+
+### Configuration
+
+Click a Default node to open its settings panel.
+
+| Field | Description |
+|-------|-------------|
+| **Name** | Identifier shown on the canvas |
+| **Prompt** | What the agent says at this step |
+| **Branches** | Output paths based on caller response |
+
+### Uninterruptible Mode
+
+When enabled, the user cannot interrupt the bot while it is speaking on this node. This ensures the bot completes its message before any user interaction is allowed.
+
+| Setting | Behavior |
+|---------|----------|
+| **OFF** (default) | Caller can interrupt at any time |
+| **ON** | Bot must finish speaking before caller input is processed |
+
+
+Use Uninterruptible mode for critical messages like legal disclaimers, confirmation summaries, or important instructions that shouldn't be cut off.
+
+
+### Example Prompts
+
+
+
+ ```
+ Hi! Thanks for calling Acme Support. My name is Alex.
+ How can I help you today?
+ ```
+
+
+
+ ```
+ I'd be happy to help with that. First, could you tell
+ me your account number or the email on file?
+ ```
+
+
+
+ ```
+ Just to confirm — you'd like to schedule a demo for
+ next Tuesday at 2pm. Is that correct?
+ ```
+
+
+
+---
+
+## API Call Node
+
+Connect your agent to external systems mid-conversation. Fetch data, book appointments, update records — anything your APIs can do.
+
+
+ 
+
+
+### Requirements
+
+
+**API Call nodes have connection requirements:**
+- Must have at least one incoming connection
+- Must have at least one outgoing connection
+- Must have an endpoint URL configured
+
+
+### Configuration
+
+Click an API Call node to configure the request.
+
+
+
+ Select the HTTP method and enter the full API endpoint URL you want to call.
+
+ | Field | Description |
+ |-------|-------------|
+ | **Method** | HTTP method (GET, POST, PUT, PATCH, DELETE) |
+ | **URL** | Full endpoint URL (e.g., `https://api.example.com/customers`) |
+
+ Use variables in the URL for dynamic requests:
+
+ ```
+ https://api.example.com/customers/{{caller_phone}}
+ ```
+
+
+
+ Add custom headers to your API request. These are key-value pairs, often used for things like Content-Type or API keys.
+
+ | Common Headers | Example Value |
+ |----------------|---------------|
+ | `Content-Type` | `application/json` |
+ | `Authorization` | `Bearer {{api_key}}` |
+ | `X-API-Key` | `your-api-key-here` |
+
+ Click **+ Add Header** to add each header.
+
+
+
+ Construct the data payload for your request. This is typically required for POST, PUT, or PATCH methods.
+
+ ```json
+ {
+ "phone": "{{caller_phone}}",
+ "name": "{{customer_name}}",
+ "action": "lookup"
+ }
+ ```
+
+ Variables are replaced with actual values at runtime.
+
+
+
+ Specify a variable name and a JSONPath expression to extract a specific value from the API response. This value is then stored in the variables for use in subsequent steps.
+
+ | Field | Description |
+ |-------|-------------|
+ | **Variable Name** | Name to store the extracted value (e.g., `customer_name`) |
+ | **JSONPath** | Path to the value in the response (e.g., `$.data.name`) |
+
+ **Example:**
+
+ If your API returns:
+ ```json
+ {
+ "data": {
+ "name": "John Smith",
+ "tier": "premium",
+ "balance": 1500
+ }
+ }
+ ```
+
+ Extract mappings:
+ | Variable | JSONPath |
+ |----------|----------|
+ | `customer_name` | `$.data.name` |
+ | `account_tier` | `$.data.tier` |
+ | `balance` | `$.data.balance` |
+
+ Use in later nodes: `"Hi {{customer_name}}, I see you're a {{account_tier}} member."`
+
+
+
+### Branching on Results
+
+After extracting response data, you can branch based on the results:
+
+```
+[API Call: Check Account]
+├── Success ({{account_tier}} == "premium") → VIP Flow
+├── Success ({{account_tier}} == "basic") → Standard Flow
+├── Error → Fallback / Transfer
+```
+
+---
+
+## Transfer Call Node
+
+Hand the conversation to a human when needed — for escalations, complex issues, or high-value opportunities.
+
+
+ 
+
+
+### Configuration
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Name** | Yes | Identifier (e.g., `transfer_to_sales`) |
+| **Description** | Yes | When this transfer should trigger |
+| **Phone Number** | Yes | Transfer destination with country code |
+| **Transfer Type** | Yes | Cold or Warm |
+
+### Transfer Types
+
+
+
+ **Immediate handoff.** The caller is connected directly to the destination without any briefing to the receiving agent.
+
+ | Pros | Cons |
+ |------|------|
+ | Fast | No context for receiving agent |
+ | Simple | Caller may repeat themselves |
+
+ **Best for:**
+ - Simple escalations
+ - When context isn't needed
+ - Time-sensitive transfers
+ - High call volume scenarios
+
+
+
+ **AI briefs the agent first.** The receiving agent gets context before the caller joins.
+
+ | Pros | Cons |
+ |------|------|
+ | Human has context | Slightly longer |
+ | Better experience | More configuration |
+
+ **Best for:**
+ - Complex issues needing context
+ - VIP callers
+ - When continuity matters
+
+ ### Warm Transfer Options
+
+ | Setting | Description |
+ |---------|-------------|
+ | **On-hold Music** | What the caller hears while waiting for connection |
+ | **Transfer if Human** | Skip transfer if voicemail detected (coming soon) |
+ | **Whisper Message** | Private message only the agent hears before connecting |
+ | **Handoff Message** | What the AI says to brief the receiving agent |
+ | **Three-way Message** | Message both parties hear when connected |
+
+ **Example Whisper Message:**
+ ```
+ Incoming transfer: Customer calling about a billing dispute.
+ They've been charged twice for order #12345.
+ Identity already verified.
+ ```
+
+ **Example Three-way Message:**
+ ```
+ I've connected you with Sarah from our billing team.
+ Sarah, this customer is calling about a duplicate charge.
+ ```
+
+
+
+---
+
+## End Call Node
+
+Gracefully conclude the conversation when the interaction is complete.
+
+
+ 
+
+
+### Configuration
+
+| Field | Description |
+|-------|-------------|
+| **Name** | Identifier for this ending |
+| **Closing Message** | Final words before hanging up |
+
+### Example Closings
+
+
+
+ ```
+ Great! You're all set. Is there anything else I can
+ help you with today? ... Perfect, thank you for calling
+ Acme. Have a wonderful day!
+ ```
+
+
+
+ ```
+ I'm connecting you now. Thanks for calling Acme, and
+ have a great day!
+ ```
+
+
+
+ ```
+ Thanks so much for your interest. I'll have someone
+ send over some resources that might be helpful. Take care!
+ ```
+
+
+
+
+**Every path must end.** Make sure all branches in your flow eventually reach an End Call or Transfer Call node.
+
+
+---
+
+## Pre-Call API Node
+
+Execute API calls *before* your agent says hello. Perfect for loading personalized data that shapes the entire conversation.
+
+
+ 
+
+
+### When It Runs
+
+The Pre-Call API executes immediately when the call connects, before any conversation:
+
+1. Phone rings / Call connects
+2. **Pre-Call API executes** ← Here
+3. Data available in variables
+4. Conversation starts (first Default node)
+
+### Configuration
+
+Pre-Call API uses the same configuration as the [API Call node](#api-call-node):
+
+- **Request:** Method + URL
+- **Headers:** Key-value pairs
+- **Body:** JSON payload (for POST requests)
+- **Extract Response Data:** Variable name + JSONPath
+
+### Use Cases
+
+| Scenario | What to Fetch |
+|----------|---------------|
+| **CRM Lookup** | Customer history before greeting |
+| **Account Status** | Check for open issues or alerts |
+| **Personalization** | Load name, preferences, language |
+| **Routing Logic** | VIP status, time zone, special handling |
+
+### Example
+
+```
+GET https://crm.example.com/lookup?phone={{caller_phone}}
+
+Response Mapping:
+ $.customer_name → customer_name
+ $.last_ticket → last_issue
+ $.tier → account_tier
+```
+
+Your greeting node can now say:
+
+```
+"Hi {{customer_name}}! Thanks for calling back.
+Are you still having trouble with {{last_issue}}?"
+```
+
+---
+
+## Post-Call API Node
+
+Trigger actions *after* the call ends. Perfect for logging outcomes, updating CRMs, and triggering follow-ups.
+
+
+ 
+
+
+### When It Runs
+
+The Post-Call API executes after the conversation ends:
+
+1. Conversation ends (End Call node reached)
+2. Call terminates
+3. **Post-Call API executes** ← Here
+4. Data saved externally
+
+### Configuration
+
+Post-Call API uses the same configuration as the [API Call node](#api-call-node):
+
+- **Request:** Method + URL
+- **Headers:** Key-value pairs
+- **Body:** JSON payload (typically POST)
+- **Extract Response Data:** Variable name + JSONPath
+
+### Use Cases
+
+| Scenario | What to Send |
+|----------|--------------|
+| **CRM Logging** | Call summary, outcome, duration |
+| **Ticket Creation** | Issue details, priority level |
+| **Follow-up Triggers** | Send email confirmations, SMS receipts |
+| **Analytics** | Custom metrics, conversion tracking |
+
+### Example
+
+```
+POST https://crm.example.com/calls
+
+Body:
+{
+ "phone": "{{caller_phone}}",
+ "duration": "{{call_duration}}",
+ "outcome": "{{disposition}}",
+ "notes": "{{call_summary}}",
+ "agent_id": "{{agent_id}}",
+ "collected": {
+ "name": "{{collected_name}}",
+ "budget": "{{collected_budget}}"
+ }
+}
+```
+
+---
+
+## Choosing the Right Node
+
+| If you need to... | Use |
+|-------------------|-----|
+| Ask a question or give information | Default Node |
+| Make the bot uninterruptible for a message | Default Node with Uninterruptible ON |
+| Get external data mid-conversation | API Call Node |
+| Transfer to a human | Transfer Call Node |
+| End the conversation | End Call Node |
+| Load data before the call starts | Pre-Call API Node |
+| Save data after the call ends | Post-Call API Node |
+
+---
+
+## Next
+
+
+
+ Create dynamic conversation paths
+
+
+ Use dynamic data in your nodes
+
+
diff --git a/fern/products/atoms/pages/platform/convo-flow/overview.mdx b/fern/products/atoms/pages/platform/convo-flow/overview.mdx
new file mode 100644
index 0000000..2ae0840
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/overview.mdx
@@ -0,0 +1,124 @@
+---
+title: "Conversational Flow Agents"
+sidebarTitle: "Overview"
+description: "Build structured, goal-oriented agents with visual workflows."
+tag: "Legacy"
+---
+
+
+Conversational Flow is the original agent type. For most use cases, we now recommend [Single Prompt agents](/atoms/atoms-platform/single-prompt-agents/overview) — they're faster to set up and more flexible. Conversational Flow remains ideal for structured, multi-step processes like lead qualification, booking, and intake forms.
+
+
+A Conversational Flow agent guides callers through a designed path. You create a visual workflow of nodes — each representing a step in the conversation — and connect them with branches that determine where the conversation goes based on what the caller says.
+
+---
+
+## When to Use
+
+Conversational Flow is ideal for **structured, goal-oriented conversations** — lead qualification, appointment booking, surveys, intake forms. Choose it when you need specific data collected in a specific order, or when different responses should lead to fundamentally different paths.
+
+For **open-ended, flexible conversations** like general support or FAQs, consider [Single Prompt](/atoms/atoms-platform/single-prompt-agents/overview) instead.
+
+---
+
+## How It Works
+
+Think of your workflow as a roadmap. Each node represents a step where the agent takes action — asking a question, making an API call, or transferring the caller. Branches connect these steps, and the caller's responses determine which path to take.
+
+Unlike Single Prompt agents that interpret instructions dynamically, Conversational Flow agents follow your designed structure. This gives you predictable, consistent conversations — every caller gets the same thorough experience.
+
+---
+
+## Capabilities
+
+**Visual workflow design.** Drag nodes onto a canvas, connect them with branches, and see your entire conversation flow at a glance. Complex logic becomes manageable when you can see it.
+
+**Precise data collection.** Each node can collect specific information. You control exactly what gets asked, in what order, and what happens based on the answers.
+
+**Mid-conversation API calls.** Nodes can fetch external data, check availability, update CRMs, or trigger any API — and branch based on the results.
+
+**Multiple paths to multiple outcomes.** Different caller responses lead to different experiences. Qualified leads go to sales, support issues go to technicians, everyone gets the right path.
+
+---
+
+## Building a Conversational Flow Agent
+
+You'll create three things:
+
+**1. The Workflow**
+
+This is the core. Your workflow includes:
+- **Nodes** — Each step: greetings, questions, API calls, transfers, endings
+- **Branches** — Conditions that route callers based on their responses
+- **Variables** — Dynamic data used throughout the conversation
+
+**2. Global Prompt** (optional)
+
+Set personality and behavior guidelines that apply across all nodes. This keeps your agent consistent without repeating instructions in every node.
+
+**3. Voice and Model**
+
+Pick the voice your agent speaks with and the AI model that powers its understanding.
+
+---
+
+## The Editor
+
+Once you create a Conversational Flow agent, you land in the editor with two main tabs.
+
+
+
+
+ 
+
+
+ | Area | Location | What It Does |
+ |------|----------|--------------|
+ | **Node Palette** | Left panel | Drag nodes onto your workflow |
+ | **Canvas** | Center | Where you build and visualize your flow |
+ | **Variables** | Top right button | Manage flow-wide variables |
+ | **Node Config** | Right panel | Configure selected node |
+
+
+
+
+ 
+
+
+ | Section | What It Configures |
+ |---------|-------------------|
+ | **Languages** | Supported languages for your agent |
+ | **Voice** | Speech speed, pronunciation, turn detection |
+ | **Model** | AI model, Global Prompt, Knowledge Base |
+ | **Phone Number** | Assigned phone number |
+ | **Webhooks** | Event notifications |
+ | **General** | Timeout settings |
+
+
+
+---
+
+## After You Launch
+
+Once your agent is live, refinement happens in a few places:
+
+**Flow adjustments.** Review call logs, find where callers drop off or get stuck, and refine your nodes and branches.
+
+**Prompt updates.** Tweak individual node prompts or the global prompt to improve how the agent sounds and responds.
+
+**Voice tuning.** Adjust speech speed, add pronunciation rules, tweak turn-taking behavior.
+
+**Branch refinement.** Add new conditions, adjust thresholds, handle edge cases you discover.
+
+---
+
+## Get Started
+
+
+
+ Blank canvas with full control over your workflow
+
+
+ Pre-built flows for common use cases
+
+
\ No newline at end of file
diff --git a/fern/products/atoms/pages/platform/convo-flow/workflow-builder.mdx b/fern/products/atoms/pages/platform/convo-flow/workflow-builder.mdx
new file mode 100644
index 0000000..94ed2eb
--- /dev/null
+++ b/fern/products/atoms/pages/platform/convo-flow/workflow-builder.mdx
@@ -0,0 +1,108 @@
+---
+title: "Workflow Builder"
+sidebarTitle: "Workflow Builder"
+description: "The visual canvas for designing conversation flows."
+---
+
+The workflow builder is where you design your conversation. Drag nodes onto the canvas, connect them with branches, and see your entire flow at a glance.
+
+---
+
+## The Interface
+
+
+ 
+
+
+| Area | Location | Purpose |
+|------|----------|---------|
+| **Node Palette** | Left panel | All available node types to drag onto canvas |
+| **Canvas** | Center | Your visual workspace |
+| **Node Config** | Right panel | Settings for the selected node |
+| **Variables** | Top right button | Manage flow-wide variables |
+| **Controls** | Bottom | Auto-layout, zoom, feedback |
+
+---
+
+## Adding Nodes
+
+1. Find the node type in the left palette
+2. Drag it onto the canvas
+3. Release where you want it placed
+
+Every flow starts with a **Start** node (the green pill). Connect your first node to Start to begin the conversation.
+
+---
+
+## Connecting Nodes
+
+1. Hover over a node to see connection handles (small circles)
+2. Drag from an output handle
+3. Drop onto another node's input handle
+
+Connections show conversation flow. When a node finishes, the conversation moves to the connected node.
+
+---
+
+## Configuring Nodes
+
+Click any node to open its settings in the right panel. Each node type has different options:
+
+| Node | Key Settings |
+|------|--------------|
+| **Default** | Name, Prompt, Branches, Uninterruptible toggle |
+| **API Call** | Method, URL, Headers, Body, Response extraction |
+| **Transfer Call** | Phone number, Transfer type, Warm transfer messages |
+| **End Call** | Closing message |
+
+---
+
+## Variables Panel
+
+Click **{ } Variables** (top right) to manage variables:
+
+| Tab | Contents |
+|-----|----------|
+| **User Defined** | Variables you create |
+| **System** | Platform-provided (caller_phone, call_duration, etc.) |
+| **API** | Values extracted from API responses |
+
+Use variables in any prompt with `{{variable_name}}` syntax.
+
+---
+
+## Canvas Controls
+
+| Control | Function |
+|---------|----------|
+| **Auto-layout** | Automatically organize nodes |
+| **Zoom +/-** | Adjust view |
+| **Pan** | Click and drag empty space |
+
+
+Use **Auto-layout** often. It keeps your flow readable as it grows.
+
+
+---
+
+## Keyboard Shortcuts
+
+| Shortcut | Action |
+|----------|--------|
+| `Delete` | Delete selected |
+| `Cmd/Ctrl + Z` | Undo |
+| `Cmd/Ctrl + Shift + Z` | Redo |
+| `Escape` | Deselect |
+
+---
+
+## Next
+
+
+
+ Every node and how to configure it
+
+
+ Create paths based on responses
+
+
diff --git a/fern/products/atoms/pages/platform/cookbooks/using-cookbooks.mdx b/fern/products/atoms/pages/platform/cookbooks/using-cookbooks.mdx
new file mode 100644
index 0000000..f643a5a
--- /dev/null
+++ b/fern/products/atoms/pages/platform/cookbooks/using-cookbooks.mdx
@@ -0,0 +1,45 @@
+---
+title: "Cookbooks"
+sidebarTitle: "Cookbooks"
+description: "Code examples, templates, and demos for common voice AI use cases."
+---
+
+Explore ready-to-use examples and see what's possible with Atoms.
+
+---
+
+## Code Examples
+
+The [Atoms Cookbook](https://github.com/smallest-inc/cookbook) on GitHub has runnable examples for common use cases — clone, configure, and deploy.
+
+
+ Text-to-speech demos, agent templates, and integration examples.
+
+
+---
+
+## Showcase
+
+See real projects built with Atoms by the community and our team.
+
+
+ Browse live demos and project galleries.
+
+
+---
+
+## SDK Examples
+
+For developer-focused examples with full source code and deployment guides:
+
+
+ End-to-end agent examples — from hello world to multi-agent orchestration.
+
+
+---
+
+## Community
+
+
+ Share your projects, get feedback, and see what others are building.
+
\ No newline at end of file
diff --git a/fern/products/atoms/pages/platform/deployment/audiences.mdx b/fern/products/atoms/pages/platform/deployment/audiences.mdx
new file mode 100644
index 0000000..0902b57
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/audiences.mdx
@@ -0,0 +1,161 @@
+---
+title: "Audiences"
+description: "Create and manage contact lists for outbound campaigns"
+---
+
+Audiences are your contact lists — the people your agents will call during campaigns. Each audience contains phone numbers and any additional information you want your agent to reference during conversations.
+
+---
+
+## Your Audiences
+
+
+
+
+
+The Audiences page shows all your contact lists at a glance.
+
+| Column | Description |
+|--------|-------------|
+| Name | Audience name and ID |
+| Campaigns | Campaigns using this audience |
+| Members | Number of contacts |
+| Created on | When the audience was created |
+| Last modified | Last update time |
+| Actions | Three-dot menu for options |
+
+**Sorting Options:**
+- Created on
+- Total members
+- Last modified
+
+**Filter Options:**
+- All Audiences
+- With Campaigns
+- Without Campaigns
+
+---
+
+## Creating an Audience
+
+Click **Create Audience** (green button, top right) to start a three-step process.
+
+
+
+
+
+
+
+
+ All recipients must have explicit consent to be contacted. Atoms prohibits purchased, rented, or third-party phone lists.
+
+
+ Upload a CSV with your contacts (max 10 MB). Your CSV needs a phone number column—everything else is flexible.
+
+ ```csv
+ phoneNumber,Name,Email,CustomerID
+ 919999900000,John,john@example.com,CUST001
+ 919999900001,Alice,alice@example.com,CUST002
+ ```
+
+ Phone numbers should be in international format (`+919999900000` or `919999900000`).
+
+
+
+ Tell us which column contains the phone numbers.
+
+
+
+
+
+ You'll see a preview of your CSV data. Select the column that contains valid phone numbers from the dropdown.
+
+
+ Only the phone number column needs to be mapped—everything else is up to you. Include any additional information you want available during calls (names, order IDs, account numbers, etc.).
+
+
+
+
+ Give your audience a name and optional description.
+
+
+
+
+
+ | Field | Required | Example |
+ |-------|----------|---------|
+ | Audience Name | Yes | VIP Customers List |
+ | Description | No | High-value customers for premium promotions |
+
+ Click **Create Audience** to finish.
+
+
+
+---
+
+## Managing Audience Members
+
+Click any audience to view and manage its contacts.
+
+
+
+
+
+Here you can:
+- **Search** for specific members
+- **Select contacts** using checkboxes
+- **Delete** selected contacts with the Delete button
+- **Add new** contacts with the Add New button
+
+---
+
+## Adding Members to Existing Audiences
+
+Click **Add New** to add contacts to an existing audience. You have two options:
+
+
+
+
+
+
+
+ Fill in the contact details one at a time:
+ - **phoneNumber** (required) — in international format
+ - Plus any other fields defined in your audience
+
+ Click **Add Member** to save.
+
+
+
+
+
+
+
+ Upload another CSV file to add contacts in bulk.
+
+ - CSV headers should match your audience fields
+ - Maximum file size: 10 MB
+ - Click to upload or drag and drop
+
+
+
+---
+
+## Using Audience Data in Calls
+
+The columns you upload become available as variables during campaigns. If your CSV has a "Name" column, your agent can greet callers by name.
+
+See [Variables](/atoms/atoms-platform/single-prompt-agents/configuration-panel/variables) for more.
+
+---
+
+## Related
+
+
+
+ Create outbound calling programs
+
+
+ Manage your phone numbers
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/audiences/creating-audiences.mdx b/fern/products/atoms/pages/platform/deployment/audiences/creating-audiences.mdx
new file mode 100644
index 0000000..0f428d0
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/audiences/creating-audiences.mdx
@@ -0,0 +1,140 @@
+---
+title: "Creating Audiences"
+sidebarTitle: "Creating Audiences"
+description: "Build contact lists for your outbound campaigns."
+---
+
+Audiences are contact lists used for campaigns. Create an Audience with phone numbers and optional data, then use it across multiple campaigns.
+
+---
+
+## Location
+
+**Left Sidebar → Deploy → Audiences**
+
+---
+
+## Creating an Audience
+
+→ **NEEDS PLATFORM INFO:** Audience creation interface
+
+### Step 1: Start Creation
+
+Click **"Create Audience"** button.
+
+### Step 2: Basic Details
+
+| Field | Description | Example |
+|-------|-------------|---------|
+| **Name** | Audience identifier | "Q4 Leads" |
+| **Description** | Optional notes | "Leads from October event" |
+
+### Step 3: Add Contacts
+
+Two methods:
+
+**Upload File:**
+- CSV or Excel
+- Must include phone column
+- Can include any custom fields
+
+**Manual Entry:**
+- Add contacts one by one
+- Good for small lists
+
+### Step 4: Map Fields
+
+After upload, map columns to fields:
+
+| Your Column | Maps To |
+|-------------|---------|
+| "Phone Number" | phone (required) |
+| "First Name" | name |
+| "Account ID" | account_id |
+| "Amount" | amount |
+
+Custom fields become variables: `{{account_id}}`, `{{amount}}`
+
+### Step 5: Save
+
+Click **Save** to create the Audience.
+
+---
+
+## File Format Requirements
+
+### Required Column
+
+- **Phone number** — In any standard format
+
+### Optional Columns
+
+Any additional data you want to use as variables:
+- Name
+- Email
+- Appointment date
+- Account number
+- Custom fields
+
+### Example CSV
+
+```csv
+phone,name,appointment_date,amount
++15551234567,John Smith,2024-07-20,150.00
++15559876543,Jane Doe,2024-07-21,225.00
++15555555555,Bob Johnson,2024-07-22,175.00
+```
+
+---
+
+## Using Variables from Audiences
+
+Audience data populates agent variables:
+
+**In your agent prompt:**
+```
+Hi {{name}}, this is a reminder about your appointment on {{appointment_date}}.
+Your balance is ${{amount}}.
+```
+
+**During the call:**
+```
+Hi John Smith, this is a reminder about your appointment on July 20th.
+Your balance is $150.00.
+```
+
+---
+
+## Best Practices
+
+### Data Quality
+
+| Do | Don't |
+|----|-------|
+| Verify phone numbers | Use invalid numbers |
+| Keep data current | Use stale lists |
+| Standardize formatting | Mix formats |
+
+### Phone Number Formatting
+
+Include country code when possible:
+- Good: +15551234567
+- Okay: 5551234567
+- Bad: 555-1234 (incomplete)
+
+### Consent
+
+Ensure you have appropriate consent to contact everyone in your Audience.
+
+---
+
+## What's Next
+
+
+
+ Connect to campaigns
+
+
+ Start calling
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/audiences/using-with-campaigns.mdx b/fern/products/atoms/pages/platform/deployment/audiences/using-with-campaigns.mdx
new file mode 100644
index 0000000..7c2471d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/audiences/using-with-campaigns.mdx
@@ -0,0 +1,113 @@
+---
+title: "Using Audiences with Campaigns"
+sidebarTitle: "Using with Campaigns"
+description: "Connect your contact lists to outbound campaigns."
+---
+
+Once you have an Audience, you can use it with multiple campaigns. This page covers how Audiences and Campaigns work together.
+
+---
+
+## Connecting to Campaigns
+
+When creating or editing a campaign:
+
+1. Navigate to the Audience selection step
+2. Choose from available Audiences
+3. All contacts in that Audience become campaign targets
+
+---
+
+## One Audience, Multiple Campaigns
+
+An Audience can be used in multiple campaigns:
+
+| Audience: "October Leads" | |
+|---------------------------|---|
+| Campaign 1 | Follow-up calls |
+| Campaign 2 | Event invitation |
+| Campaign 3 | Survey collection |
+
+Each campaign tracks its own progress independently.
+
+---
+
+## Filtering Audiences
+
+When using an Audience in a campaign, you may be able to filter:
+
+| Filter | Example |
+|--------|---------|
+| **By field value** | Only contacts where `status = "active"` |
+| **By date** | Contacts added after specific date |
+| **By previous campaigns** | Exclude contacts from other campaigns |
+
+→ **NEEDS PLATFORM INFO:** Filtering capabilities
+
+---
+
+## Data Flow
+
+Audience data flows to your agent during calls:
+
+```
+Audience: "October Leads"
+├── Contact: John Smith, +15551234567, amount: $150
+│ └── Agent receives: {{name}}, {{phone}}, {{amount}}
+│
+├── Contact: Jane Doe, +15559876543, amount: $225
+│ └── Agent receives: {{name}}, {{phone}}, {{amount}}
+│
+└── ...
+```
+
+Each call gets that contact's specific data.
+
+---
+
+## Updating Audiences
+
+What happens when you update an Audience that's in use:
+
+| Change | Active Campaign | Future Campaigns |
+|--------|-----------------|------------------|
+| Add contacts | Added to queue | Included |
+| Remove contacts | Removed from queue (if pending) | Not included |
+| Update data | Uses new data | Uses new data |
+
+---
+
+## Best Practices
+
+### Organize by Purpose
+
+Create Audiences for specific purposes:
+- "Appointment Reminders - December"
+- "Past Customers - Reactivation"
+- "Event Attendees - 2024"
+
+### Keep Current
+
+Regularly update Audiences:
+- Remove invalid numbers
+- Update contact information
+- Remove unsubscribed contacts
+
+### Track Usage
+
+Know which campaigns used which Audiences:
+- Avoid over-contacting
+- Analyze performance by Audience
+
+---
+
+## What's Next
+
+
+
+ Start a new campaign
+
+
+ Track performance
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns.mdx b/fern/products/atoms/pages/platform/deployment/campaigns.mdx
new file mode 100644
index 0000000..7a8f928
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns.mdx
@@ -0,0 +1,134 @@
+---
+title: "Campaigns"
+description: "Create and manage outbound calling campaigns"
+---
+
+Campaigns let you reach out to your audiences automatically. Set up an agent, pick an audience, and let Atoms call through your contact list.
+
+---
+
+## Your Campaigns
+
+
+
+
+
+The Campaigns page shows all your outbound calling programs.
+
+| Column | Description |
+|--------|-------------|
+| Campaign name | Name and ID |
+| Created on | When the campaign was created |
+| Last modified | Last update time |
+| Contact list | Linked audience |
+| Connected agent | Agent making the calls |
+| Status | Draft, Scheduled, Active, Paused, Completed, or Failed |
+
+**Sorting:** Created on, Last modified
+
+**Filters:** All, Draft, Scheduled, Active, Paused, Completed
+
+---
+
+## Creating a Campaign
+
+Click **Create Campaign** (green button, top right).
+
+
+
+
+
+| Field | Required | Description |
+|-------|----------|-------------|
+| **Campaign name** | Yes | Max 40 characters |
+| **Description** | No | Notes about this campaign's purpose |
+| **Select Audience** | Yes | Which contact list to call |
+| **Select Agent** | Yes | Which agent makes the calls |
+| **Max Retries** | No | Times to retry unanswered calls (0-10). Set to 0 to disable. |
+| **Retry Delay** | No | Wait time before retrying (1-1440 minutes) |
+| **Schedule Campaign** | No | Set timezone + date/time to start automatically. Leave empty to save as draft. |
+
+Click **Create Campaign** when done.
+
+
+Leave scheduling empty to save as a draft. You can start it manually later.
+
+
+---
+
+## Campaign Analytics
+
+Click any campaign to view its performance. You'll see summary cards at the top:
+
+| Metric | Description |
+|--------|-------------|
+| Total Participants | Contacts in the audience |
+| Contacts Called | How many were attempted (% of total) |
+| Contacts Connected | Successful connections (% success rate) |
+
+Below that, three tabs show detailed analytics:
+
+
+
+
+
+
+
+ Individual call records for this campaign. Same interface as [Conversation Logs](/atoms/atoms-platform/analytics-logs/conversation-logs)—click any call to see the full transcript, events, and metrics.
+
+
+
+
+
+
+
+ Timeline of campaign lifecycle events.
+
+ | Column | Description |
+ |--------|-------------|
+ | Date | When the event occurred |
+ | Trigger Source | What triggered the event (system, manual) |
+ | Event Action | What happened (started, paused, completed, etc.) |
+
+
+
+
+
+
+
+ Execution runs and their results.
+
+ **Summary:** Total Executions, Completed, Processing, Failed
+
+ **Execution History** shows each run with:
+ - Start and completion time
+ - Progress bar
+ - Total Members, Processed, Failed, Duration
+
+
+
+---
+
+## Campaign Statuses
+
+| Status | Meaning |
+|--------|---------|
+| Draft | Saved but not scheduled or started |
+| Scheduled | Set to start at a future time |
+| Active | Currently making calls |
+| Paused | Temporarily stopped |
+| Completed | All contacts processed |
+| Failed | Encountered an error |
+
+---
+
+## Related
+
+
+
+ Create contact lists for campaigns
+
+
+ Get numbers for outbound calls
+
+
diff --git a/fern/products/atoms/pages/dev/build/campaigns/campaign-analytics.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/analytics.mdx
similarity index 58%
rename from fern/products/atoms/pages/dev/build/campaigns/campaign-analytics.mdx
rename to fern/products/atoms/pages/platform/deployment/campaigns/analytics.mdx
index d71ec5c..fe22c99 100644
--- a/fern/products/atoms/pages/dev/build/campaigns/campaign-analytics.mdx
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/analytics.mdx
@@ -1,6 +1,7 @@
---
title: "Campaign Analytics"
-description: "Track campaign performance"
---
# Campaign Analytics
+
+*Content coming soon.*
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns/campaign-analytics.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/campaign-analytics.mdx
new file mode 100644
index 0000000..ca1c1c0
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/campaign-analytics.mdx
@@ -0,0 +1,110 @@
+---
+title: "Campaign Analytics"
+sidebarTitle: "Campaign Analytics"
+description: "Track and analyze campaign performance."
+---
+
+Campaign analytics help you understand how your outbound calling campaigns are performing. Monitor in real-time and analyze after completion.
+
+---
+
+## Location
+
+**Deploy → Campaigns → [Your Campaign] → Analytics**
+
+---
+
+## Key Metrics
+
+→ **NEEDS PLATFORM INFO:** Campaign analytics interface
+
+### Volume Metrics
+
+| Metric | Description |
+|--------|-------------|
+| **Total Contacts** | Number of contacts in campaign |
+| **Calls Made** | Number of call attempts |
+| **Contacts Reached** | Successful connections |
+| **Pending** | Remaining to call |
+
+### Performance Metrics
+
+| Metric | Description |
+|--------|-------------|
+| **Connection Rate** | % of calls that connected |
+| **Completion Rate** | % of conversations completed |
+| **Avg Call Duration** | Average length of calls |
+| **Success Rate** | % achieving desired outcome |
+
+### Outcome Breakdown
+
+| Outcome | Count |
+|---------|-------|
+| Successful | Calls achieving goal |
+| Unsuccessful | Calls not achieving goal |
+| Voicemail | Messages left |
+| No Answer | Couldn't reach |
+| Failed | Technical failures |
+
+---
+
+## Real-Time Monitoring
+
+During active campaigns:
+
+- Current calls in progress
+- Queue remaining
+- Today's progress
+- Estimated completion time
+
+---
+
+## Post-Campaign Analysis
+
+After campaign completes:
+
+### Overall Summary
+
+- Total reach rate
+- Goal completion rate
+- Time to complete
+- Cost per contact
+
+### Trend Analysis
+
+- Performance over time
+- Best times to call
+- Day-of-week patterns
+
+### Export Data
+
+Download detailed data for deeper analysis:
+- Contact-level results
+- Call transcripts
+- Custom metrics extracted
+
+---
+
+## Improving Performance
+
+Use analytics to improve future campaigns:
+
+| Finding | Action |
+|---------|--------|
+| Low connection rate | Adjust calling times |
+| Short calls | Improve opening |
+| High hang-ups | Refine value proposition |
+| Low conversion | Optimize script/flow |
+
+---
+
+## What's Next
+
+
+
+ Build better contact lists
+
+
+ Platform-wide analytics
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns/creating-campaign.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/creating-campaign.mdx
new file mode 100644
index 0000000..a0a6204
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/creating-campaign.mdx
@@ -0,0 +1,102 @@
+---
+title: "Creating a Campaign"
+sidebarTitle: "Creating a Campaign"
+description: "Set up an outbound calling campaign."
+---
+
+This guide walks you through creating your first outbound calling campaign.
+
+---
+
+## Location
+
+**Left Sidebar → Deploy → Campaigns**
+
+---
+
+## Steps to Create
+
+→ **NEEDS PLATFORM INFO:** Campaign creation interface
+
+### Step 1: Start Creation
+
+Click **"Create Campaign"** button.
+
+### Step 2: Basic Details
+
+| Field | Description | Example |
+|-------|-------------|---------|
+| **Name** | Campaign identifier | "Q4 Appointment Reminders" |
+| **Description** | Optional notes | "Reminder calls for scheduled appointments" |
+
+### Step 3: Select Agent
+
+Choose which agent will make the calls. This should be an agent designed for outbound conversations.
+
+### Step 4: Select Audience
+
+Choose the contact list to call:
+- Select from existing Audiences
+- Or create a new Audience
+
+→ See: [Creating Audiences](/atoms/atoms-platform/deployment/audiences)
+
+### Step 5: Configure Schedule
+
+| Setting | Description |
+|---------|-------------|
+| **Start Date** | When to begin calling |
+| **End Date** | When to stop |
+| **Calling Hours** | Time window for calls (respects time zones) |
+| **Days** | Which days to call |
+
+### Step 6: Configure Settings
+
+| Setting | Description |
+|---------|-------------|
+| **Caller ID** | Number shown to recipients |
+| **Retry Rules** | How many times to retry unanswered |
+| **Call Spacing** | Minimum time between calls |
+| **Voicemail** | Leave message or skip |
+
+### Step 7: Review and Launch
+
+Review all settings, then:
+- **Save as Draft** — Save for later
+- **Launch** — Start the campaign
+
+---
+
+## Campaign States
+
+| State | Description |
+|-------|-------------|
+| **Draft** | Created but not started |
+| **Active** | Currently making calls |
+| **Paused** | Temporarily stopped |
+| **Completed** | All contacts called |
+| **Cancelled** | Manually stopped |
+
+---
+
+## Before Launching
+
+Verify:
+- [ ] Agent is tested and locked
+- [ ] Audience is complete and accurate
+- [ ] Schedule is appropriate for your contacts
+- [ ] Caller ID is set correctly
+- [ ] Retry rules make sense for your use case
+
+---
+
+## What's Next
+
+
+
+ Work with campaign contacts
+
+
+ Track performance
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns/creating.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/creating.mdx
new file mode 100644
index 0000000..07c749d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/creating.mdx
@@ -0,0 +1,7 @@
+---
+title: "Creating Campaign"
+---
+
+# Creating Campaign
+
+*Content coming soon.*
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns/managing-contacts.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/managing-contacts.mdx
new file mode 100644
index 0000000..fa1674b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/managing-contacts.mdx
@@ -0,0 +1,107 @@
+---
+title: "Managing Campaign Contacts"
+sidebarTitle: "Managing Contacts"
+description: "Work with contacts in your campaigns."
+---
+
+After launching a campaign, you can manage contacts — view their status, add new contacts, or remove contacts from the queue.
+
+---
+
+## Location
+
+**Deploy → Campaigns → [Your Campaign] → Contacts**
+
+---
+
+## Contact Statuses
+
+Each contact in a campaign has a status:
+
+| Status | Meaning |
+|--------|---------|
+| **Pending** | Not yet called |
+| **In Progress** | Currently being called |
+| **Completed** | Successfully reached |
+| **Failed** | Could not connect |
+| **Voicemail** | Left voicemail |
+| **No Answer** | No answer after retries |
+| **Skipped** | Manually skipped |
+
+---
+
+## Viewing Contacts
+
+→ **NEEDS PLATFORM INFO:** Contact list interface
+
+The contact list shows:
+
+| Column | Description |
+|--------|-------------|
+| **Phone** | Contact phone number |
+| **Name** | Contact name (if provided) |
+| **Status** | Current call status |
+| **Attempts** | Number of call attempts |
+| **Last Attempt** | When last called |
+| **Outcome** | Final disposition |
+
+---
+
+## Adding Contacts
+
+During a campaign, you can add more contacts:
+
+1. Navigate to campaign contacts
+2. Click **"Add Contacts"**
+3. Upload file or select from Audience
+4. New contacts enter the queue
+
+---
+
+## Removing Contacts
+
+To remove contacts from the queue:
+
+1. Find the contact(s)
+2. Select them
+3. Click **"Remove"** or **"Skip"**
+
+Removed contacts won't be called.
+
+---
+
+## Retrying Failed Contacts
+
+For contacts that failed:
+
+1. Filter by "Failed" status
+2. Review failure reasons
+3. Select contacts to retry
+4. Click **"Retry"**
+
+They re-enter the queue.
+
+---
+
+## Exporting Results
+
+After campaign completion:
+
+1. Go to campaign contacts
+2. Click **"Export"**
+3. Download CSV with all contact data and outcomes
+
+Use for follow-up or analysis.
+
+---
+
+## What's Next
+
+
+
+ Analyze performance
+
+
+ Build contact lists
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/campaigns/what-are-campaigns.mdx b/fern/products/atoms/pages/platform/deployment/campaigns/what-are-campaigns.mdx
new file mode 100644
index 0000000..c1c096d
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/campaigns/what-are-campaigns.mdx
@@ -0,0 +1,115 @@
+---
+title: "What Are Campaigns"
+sidebarTitle: "What Are Campaigns"
+description: "Run outbound calling programs at scale with your voice AI agent."
+---
+
+Campaigns let your agent make outbound calls — proactively reaching out to customers rather than waiting for them to call. Upload a contact list, configure your agent, and let Atoms handle the calling at scale.
+
+---
+
+## How Campaigns Work
+
+1. **Create a campaign** — Name, agent, and settings
+2. **Add contacts** — Upload or create an Audience
+3. **Configure** — Timing, retry rules, variables
+4. **Launch** — Atoms starts calling
+5. **Monitor** — Track progress and results
+
+---
+
+## Use Cases
+
+### Appointment Reminders
+
+```
+"Hi {{name}}, this is a reminder about your appointment
+tomorrow at {{time}}. Would you like to confirm or reschedule?"
+```
+
+### Payment Reminders
+
+```
+"Hello {{name}}, this is a courtesy call about your payment
+of {{amount}} due on {{date}}."
+```
+
+### Survey Collection
+
+```
+"Hi, we're reaching out to get your feedback on your
+recent experience with {{company}}."
+```
+
+### Sales Follow-Up
+
+```
+"Hi {{name}}, this is {{agent_name}} following up on your
+interest in {{product}}. Do you have a few minutes?"
+```
+
+### Lead Nurturing
+
+```
+"Hi {{name}}, I'm calling to share some information about
+{{topic}} that I thought you'd find valuable."
+```
+
+---
+
+## Campaign Components
+
+| Component | Purpose |
+|-----------|---------|
+| **Agent** | The AI that makes calls |
+| **Audience** | Contact list to call |
+| **Schedule** | When to make calls |
+| **Settings** | Retry rules, caller ID, etc. |
+
+---
+
+## Outbound vs Inbound
+
+| Aspect | Inbound | Outbound (Campaigns) |
+|--------|---------|----------------------|
+| Who initiates | Customer calls you | You call customer |
+| Timing | Customer's choice | Your schedule |
+| Context | Unknown until call | Known (from contact list) |
+| Personalization | Limited | High (use contact data) |
+
+---
+
+## Contact Data
+
+Campaigns use contact lists (Audiences) with:
+
+| Field | Usage |
+|-------|-------|
+| **Phone number** | Required — who to call |
+| **Name** | Personalization `{{name}}` |
+| **Custom fields** | Any data for variables |
+
+This data populates variables in your prompts.
+
+---
+
+## Getting Started
+
+1. **Create an agent** for outbound calls
+2. **Create an Audience** with your contacts
+3. **Create a Campaign** connecting them
+4. **Configure** timing and rules
+5. **Launch** and monitor
+
+---
+
+## What's Next
+
+
+
+ Set up your first campaign
+
+
+ Build your contact lists
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/images/README.md b/fern/products/atoms/pages/platform/deployment/images/README.md
new file mode 100644
index 0000000..dfd02a9
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/images/README.md
@@ -0,0 +1,43 @@
+# Deployment — Image Guide
+
+Drop screenshots here. Name them exactly as listed below.
+
+---
+
+## Phone Numbers
+
+| Filename | What to capture |
+|----------|-----------------|
+| `phone-numbers.png` | Main Phone Numbers page with list of numbers and details panel |
+| `rent-number.png` | Rent Number modal |
+| `import-sip.png` | Import SIP Number modal |
+
+---
+
+## Campaigns
+
+| Filename | What to capture |
+|----------|-----------------|
+| (to be added) | |
+
+---
+
+## Audiences
+
+| Filename | What to capture |
+|----------|-----------------|
+| `audiences.png` | Main Audiences list page with table showing Name, Campaigns, Members, Created on, Last modified |
+| `upload-csv.png` | Step 1: Upload CSV page with drag-drop area and consent warning |
+| `map-phone.png` | Step 2: Map Phone Number page with dropdown and CSV preview table |
+| `add-contacts.png` | Step 3: Add Contacts page with Audience Name and Description fields |
+| `audience-members.png` | Individual audience view showing members table with search, delete, and Add New buttons |
+| `add-manually.png` | Add new members modal — "Add Manually" tab with form fields |
+| `import-csv.png` | Add new members modal — "Import CSV" tab with upload area |
+
+---
+
+## Notes
+
+- **Format:** PNG preferred, keep under 500KB each
+- **Size:** Capture at 2x resolution if possible for retina displays
+- **Sensitive data:** Blur or use fake data for any real phone numbers
diff --git a/fern/products/atoms/pages/platform/deployment/overview.mdx b/fern/products/atoms/pages/platform/deployment/overview.mdx
new file mode 100644
index 0000000..a163d92
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/overview.mdx
@@ -0,0 +1,106 @@
+---
+title: "Deployment Overview"
+sidebarTitle: "Overview"
+description: "Make your voice AI agents live and accessible."
+---
+
+After building and testing your agent, it's time to deploy. Atoms offers multiple deployment options depending on how you want users to interact with your agent.
+
+---
+
+## Deployment Options
+
+| Method | Description | Best For |
+|--------|-------------|----------|
+| **Phone Numbers** | Assign a phone number for inbound calls | Customer support, hotlines |
+| **Widget** | Embed on your website | Web visitors, integrated support |
+| **Campaigns** | Outbound calling at scale | Reminders, sales outreach |
+
+---
+
+## Phone Numbers
+
+Get a phone number and assign it to your agent. When customers call that number, your agent answers.
+
+### Use Cases
+
+- Customer support hotline
+- Sales inquiry line
+- Information line
+- After-hours support
+
+→ See: [Phone Numbers](/atoms/atoms-platform/deployment/phone-numbers)
+
+---
+
+## Widget Deployment
+
+Embed a voice widget on your website. Visitors can click to talk with your agent directly in their browser.
+
+### Use Cases
+
+- Website support
+- Sales assistance
+- Product demos
+- Lead capture
+
+→ See: [Widget Deployment](/atoms/atoms-platform/features/widget)
+
+---
+
+## Campaigns
+
+Have your agent proactively call customers. Create contact lists, schedule calls, and run outreach at scale.
+
+### Use Cases
+
+- Appointment reminders
+- Payment reminders
+- Survey collection
+- Sales follow-up
+- Lead nurturing
+
+→ See: [Campaigns](/atoms/atoms-platform/deployment/campaigns)
+
+---
+
+## Choosing a Deployment Method
+
+| If You Want To... | Use |
+|-------------------|-----|
+| Receive inbound calls | Phone Numbers |
+| Support website visitors | Widget |
+| Make outbound calls | Campaigns |
+| Multiple channels | Combine methods |
+
+Many organizations use multiple methods — a phone number for inbound support and campaigns for outbound reminders.
+
+---
+
+## Pre-Deployment Checklist
+
+Before making an agent live:
+
+- [ ] Tested all conversation paths
+- [ ] Tested edge cases
+- [ ] Reviewed conversation logs
+- [ ] Locked the agent (if in production)
+- [ ] Configured all necessary settings
+- [ ] Set up webhooks (if using)
+- [ ] Team is prepared for any escalations
+
+---
+
+## What's Next
+
+
+
+ Set up inbound calling
+
+
+ Embed on your website
+
+
+ Run outbound calls
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers.mdx
new file mode 100644
index 0000000..4894ce6
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers.mdx
@@ -0,0 +1,107 @@
+---
+title: "Phone Numbers"
+sidebarTitle: "Phone Numbers"
+description: "Get and manage phone numbers for your agents."
+---
+
+Phone Numbers let your agents make and receive real phone calls. Rent numbers directly through Atoms, or import your own via SIP.
+
+---
+
+## Your Numbers
+
+
+
+
+
+The main view shows all your phone numbers with key details:
+
+| Field | Description |
+|-------|-------------|
+| **Number** | The phone number |
+| **Provider** | Telephony provider (e.g., Plivo) |
+| **Connected Agent** | Which agent is assigned |
+| **Agent Name** | Name of the connected agent |
+| **Rent Date** | When you acquired the number |
+| **Monthly Cost** | Recurring cost |
+| **Status** | Active or inactive |
+
+Click any number in the list to see its details and manage it.
+
+---
+
+## Adding a Number
+
+Click **Add Number** in the top right. You have two options:
+
+
+
+
+ 
+
+
+ Rent a new phone number directly through Atoms.
+
+ 1. Click **Add Number** → **Rent Number**
+ 2. Select your country and preferences
+ 3. Choose from available numbers
+ 4. Complete the rental
+
+ The number appears in your list immediately, ready to assign to an agent.
+
+
+
+
+ 
+
+
+ Bring your own number via SIP trunking.
+
+ | Field | Required | Description |
+ |-------|----------|-------------|
+ | **Phone Number** | Yes | Your existing number |
+ | **SIP Termination URL** | Yes | Where to send calls |
+ | **Display Name** | No | Friendly name for the number |
+ | **Username** | No | For SIP authentication |
+ | **Password** | No | For SIP authentication |
+ | **SIP Origination URL** | — | Provided by Atoms (copy this to your provider) |
+
+ Click **Add Custom Number** when done.
+
+
+
+---
+
+## Assigning to an Agent
+
+Once you have a number, assign it to an agent:
+
+1. Open your agent
+2. Go to **Agent Settings** → **Phone Number** tab
+3. Select the number from the dropdown
+4. Save
+
+Now calls to that number will be handled by your agent.
+
+---
+
+## Releasing a Number
+
+To stop using a number, click it in the list and click **Release**.
+
+
+Releasing a number expires it at the end of the month and **cannot be undone**. The number cannot be reused.
+
+
+---
+
+## Related
+
+
+
+ Manage contact lists for campaigns
+
+
+ Use numbers for outbound calling
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers/buying.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers/buying.mdx
new file mode 100644
index 0000000..7b956f1
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers/buying.mdx
@@ -0,0 +1,7 @@
+---
+title: "Buying Phone Numbers"
+---
+
+# Buying Phone Numbers
+
+*Content coming soon.*
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers/configuring-inbound.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers/configuring-inbound.mdx
new file mode 100644
index 0000000..2287c4b
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers/configuring-inbound.mdx
@@ -0,0 +1,92 @@
+---
+title: "Configuring Inbound Calls"
+sidebarTitle: "Configuring Inbound"
+description: "Set up how your phone number handles incoming calls."
+---
+
+After getting a phone number, you need to configure how it handles incoming calls. This includes assigning an agent and setting up call handling options.
+
+---
+
+## Assigning an Agent
+
+The most important configuration: which agent answers calls to this number.
+
+### Method 1: From the Agent
+
+1. Open your agent
+2. Go to Agent Settings → Phone Number Tab
+3. Select your number from the dropdown
+4. Save
+
+### Method 2: From Phone Numbers
+
+1. Go to Deploy → Phone Numbers
+2. Find your number
+3. Click to configure
+4. Select the agent
+5. Save
+
+Each number can only be assigned to one agent at a time.
+
+---
+
+## Call Handling Options
+
+→ **NEEDS PLATFORM INFO:** Specific call handling configuration options
+
+### Greeting Behavior
+
+Configure what happens when a call connects:
+- Immediate greeting
+- Brief pause before speaking
+- Wait for caller to speak first
+
+### Recording Settings
+
+- Call recording enabled/disabled
+- Recording disclosure message
+- Storage and retention
+
+### Hours of Operation
+
+- Always active
+- Scheduled hours
+- After-hours behavior
+
+---
+
+## After-Hours Handling
+
+What happens when calls come outside business hours:
+
+| Option | Description |
+|--------|-------------|
+| **Voicemail** | Take a message |
+| **Different Agent** | Route to after-hours agent |
+| **Message Only** | Play message and disconnect |
+| **Same Agent** | 24/7 operation |
+
+---
+
+## Testing Your Configuration
+
+After configuring:
+
+1. Call your number from a different phone
+2. Verify the correct agent answers
+3. Have a test conversation
+4. Check call logs for any issues
+
+---
+
+## What's Next
+
+
+
+ View and manage numbers
+
+
+ Run outbound calls
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers/getting-number.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers/getting-number.mdx
new file mode 100644
index 0000000..add61a1
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers/getting-number.mdx
@@ -0,0 +1,100 @@
+---
+title: "Getting a Phone Number"
+sidebarTitle: "Getting a Number"
+description: "Acquire a phone number for your voice AI agent."
+---
+
+To receive inbound calls, your agent needs a phone number. Atoms makes it easy to acquire and configure phone numbers.
+
+---
+
+## Location
+
+**Left Sidebar → Deploy → Phone Numbers**
+
+---
+
+## Getting a Number
+
+→ **NEEDS PLATFORM INFO:** Phone number acquisition interface and process
+
+### Step 1: Navigate to Phone Numbers
+
+In the left sidebar, under "Deploy," click **Phone Numbers**.
+
+### Step 2: Click to Get Number
+
+Click **"Get Number"** or **"Add Phone Number"**.
+
+### Step 3: Select Options
+
+| Option | Description |
+|--------|-------------|
+| **Country** | Where you want the number |
+| **Type** | Local, toll-free, mobile |
+| **Area Code** | Specific region (if available) |
+
+### Step 4: Purchase
+
+Select a number and complete the purchase.
+
+### Step 5: Number is Ready
+
+Your number appears in the list, ready to assign to an agent.
+
+---
+
+## Number Types
+
+| Type | Description | Best For |
+|------|-------------|----------|
+| **Local** | Geographic area code | Regional businesses |
+| **Toll-Free** | 800/888/etc numbers | National businesses, no caller cost |
+| **Mobile** | Mobile format | SMS-enabled (if supported) |
+
+---
+
+## Pricing
+
+→ **NEEDS PLATFORM INFO:** Phone number pricing
+
+Phone numbers typically have:
+- **Monthly fee** — Cost to maintain the number
+- **Per-minute charges** — Cost per minute of calls
+
+Check your plan details for specific pricing.
+
+---
+
+## Country Availability
+
+Atoms supports phone numbers in multiple countries:
+- United States
+- Canada
+- United Kingdom
+- And more...
+
+→ **NEEDS PLATFORM INFO:** Complete country list
+
+---
+
+## After Getting a Number
+
+Once you have a number:
+
+1. **Assign to agent** — In the agent's Phone Number Tab
+2. **Configure settings** — Call handling options
+3. **Test** — Call your number to verify
+
+---
+
+## What's Next
+
+
+
+ Set up call handling
+
+
+ View and manage your numbers
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers/management.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers/management.mdx
new file mode 100644
index 0000000..caaa774
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers/management.mdx
@@ -0,0 +1,7 @@
+---
+title: "Number Management"
+---
+
+# Number Management
+
+*Content coming soon.*
diff --git a/fern/products/atoms/pages/platform/deployment/phone-numbers/managing-numbers.mdx b/fern/products/atoms/pages/platform/deployment/phone-numbers/managing-numbers.mdx
new file mode 100644
index 0000000..c863f88
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/phone-numbers/managing-numbers.mdx
@@ -0,0 +1,103 @@
+---
+title: "Managing Phone Numbers"
+sidebarTitle: "Managing Numbers"
+description: "View, configure, and manage your phone numbers."
+---
+
+Once you have phone numbers, you'll need to manage them over time — reassigning agents, checking usage, and maintaining your phone infrastructure.
+
+---
+
+## Location
+
+**Left Sidebar → Deploy → Phone Numbers**
+
+---
+
+## Phone Numbers List
+
+→ **NEEDS PLATFORM INFO:** Phone numbers management interface
+
+The list shows all your numbers with:
+
+| Column | Description |
+|--------|-------------|
+| **Number** | The phone number |
+| **Status** | Active, Inactive, Pending |
+| **Assigned Agent** | Which agent handles calls |
+| **Calls** | Call volume statistics |
+| **Actions** | Configure, release |
+
+---
+
+## Common Actions
+
+### Reassigning an Agent
+
+To change which agent answers:
+
+1. Find the number in the list
+2. Click to configure
+3. Select a different agent
+4. Save changes
+
+### Viewing Call Statistics
+
+For each number, you can see:
+- Total calls received
+- Average call duration
+- Peak calling times
+- Success/failure rates
+
+### Releasing a Number
+
+If you no longer need a number:
+
+1. Find the number in the list
+2. Click to manage
+3. Select "Release" or "Delete"
+4. Confirm
+
+
+Releasing a number is permanent. You may not be able to get the same number back.
+
+
+---
+
+## Multiple Numbers
+
+Many organizations use multiple numbers:
+
+| Number | Purpose |
+|--------|---------|
+| Sales line | Sales inquiries |
+| Support line | Customer support |
+| After-hours | Emergency support |
+| Campaign number | Outbound caller ID |
+
+Each number can have a different agent assigned.
+
+---
+
+## Number Health
+
+Monitor your numbers for issues:
+
+| Issue | Indication |
+|-------|------------|
+| High failure rate | Connectivity problems |
+| Low answer rate | Consider timing or call frequency |
+| Complaints | May affect number reputation |
+
+---
+
+## What's Next
+
+
+
+ Add voice to your website
+
+
+ Run outbound calls
+
+
diff --git a/fern/products/atoms/pages/platform/deployment/widget/adding-to-website.mdx b/fern/products/atoms/pages/platform/deployment/widget/adding-to-website.mdx
new file mode 100644
index 0000000..1fe54ce
--- /dev/null
+++ b/fern/products/atoms/pages/platform/deployment/widget/adding-to-website.mdx
@@ -0,0 +1,173 @@
+---
+title: "Adding Widget to Your Website"
+sidebarTitle: "Adding to Website"
+description: "Install the voice widget on your website."
+---
+
+Once you have your embed code, adding it to your website is straightforward. This page covers common installation methods.
+
+---
+
+## Basic Installation
+
+Add the embed code just before the closing `