# Create account connection Source: https://docs.fluents.ai/api-reference/account_connections/create-account-connection openapi.yml post /v1/account_connections/create # Get account connection Source: https://docs.fluents.ai/api-reference/account_connections/get-account-connection openapi.yml get /v1/account_connections # List account connections Source: https://docs.fluents.ai/api-reference/account_connections/list-account-connections openapi.yml get /v1/account_connections/list # Update account connection Source: https://docs.fluents.ai/api-reference/account_connections/update-account-connection openapi.yml post /v1/account_connections/update # Create action Source: https://docs.fluents.ai/api-reference/actions/create-action openapi.yml post /v1/actions/create # Get action Source: https://docs.fluents.ai/api-reference/actions/get-action openapi.yml get /v1/actions # List actions Source: https://docs.fluents.ai/api-reference/actions/list-actions openapi.yml get /v1/actions/list # Update action Source: https://docs.fluents.ai/api-reference/actions/update-action openapi.yml post /v1/actions/update # Create agent Source: https://docs.fluents.ai/api-reference/agents/create-agent openapi.yml post /v1/agents/create # Get agent Source: https://docs.fluents.ai/api-reference/agents/get-agent openapi.yml get /v1/agents # List agents Source: https://docs.fluents.ai/api-reference/agents/list-agents openapi.yml get /v1/agents/list # Update agent Source: https://docs.fluents.ai/api-reference/agents/update-agent openapi.yml post /v1/agents/update # Create call Source: https://docs.fluents.ai/api-reference/calls/create-call openapi.yml post /v1/calls/create # End call Source: https://docs.fluents.ai/api-reference/calls/end-call openapi.yml post /v1/calls/end # Create call feedback Source: https://docs.fluents.ai/api-reference/calls/feedbacks/create-call-feedback openapi.yml post /v1/calls/{call_id}/feedbacks # Delete call feedback Source: https://docs.fluents.ai/api-reference/calls/feedbacks/delete-call-feedback openapi.yml delete /v1/calls/{call_id}/feedbacks/{id} # Get call feedback Source: https://docs.fluents.ai/api-reference/calls/feedbacks/get-call-feedback openapi.yml get /v1/calls/{call_id}/feedbacks/{id} # List call feedbacks Source: https://docs.fluents.ai/api-reference/calls/feedbacks/list-call-feedbacks openapi.yml get /v1/calls/{call_id}/feedbacks # Update call feedback Source: https://docs.fluents.ai/api-reference/calls/feedbacks/update-call-feedback openapi.yml patch /v1/calls/{call_id}/feedbacks/{id} # Get call Source: https://docs.fluents.ai/api-reference/calls/get-call openapi.yml get /v1/calls # Get call recording Source: https://docs.fluents.ai/api-reference/calls/get-call-recording openapi.yml get /v1/calls/{id}/recording_url # Get recording Source: https://docs.fluents.ai/api-reference/calls/get-recording openapi.yml get /v1/calls/recording # List calls Source: https://docs.fluents.ai/api-reference/calls/list-calls openapi.yml get /v1/calls/list # Add multiple phone numbers to DNC list Source: https://docs.fluents.ai/api-reference/dnc_numbers/bulk-add-dnc-numbers openapi.yml post /v1/dnc_numbers/bulk Add multiple phone numbers to the Do Not Call list for a specific user in a single request. Maximum 1000 phone numbers per request. # Add a phone number to DNC list Source: https://docs.fluents.ai/api-reference/dnc_numbers/create-dnc-number openapi.yml post /v1/dnc_numbers/create Add a phone number to the Do Not Call list for a specific user. # Remove a phone number from DNC list Source: https://docs.fluents.ai/api-reference/dnc_numbers/delete-dnc-number openapi.yml delete /v1/dnc_numbers/{id} Remove a phone number from the Do Not Call list for a specific user. # Get DNC numbers Source: https://docs.fluents.ai/api-reference/dnc_numbers/list-dnc-numbers openapi.yml get /v1/dnc_numbers/list Retrieve DNC numbers with filtering by type (global or user-specific) and pagination. # Create knowledge base Source: https://docs.fluents.ai/api-reference/knowledge_bases/create-knowledge-base openapi.yml post /v1/knowledge_bases # Delete knowledge base Source: https://docs.fluents.ai/api-reference/knowledge_bases/delete-knowledge-base openapi.yml delete /v1/knowledge_bases/{id} # Delete knowledge base file Source: https://docs.fluents.ai/api-reference/knowledge_bases/delete-knowledge-base-file openapi.yml delete /v1/knowledge_bases/{kbId}/files/{fileId} # Get knowledge base Source: https://docs.fluents.ai/api-reference/knowledge_bases/get-knowledge-base openapi.yml get /v1/knowledge_bases/{id} # Get knowledge base file Source: https://docs.fluents.ai/api-reference/knowledge_bases/get-knowledge-base-file openapi.yml get /v1/knowledge_bases/{kbId}/files/{fileId} # List knowledge base files Source: https://docs.fluents.ai/api-reference/knowledge_bases/list-knowledge-base-files openapi.yml get /v1/knowledge_bases/{kbId}/files # List knowledge bases Source: https://docs.fluents.ai/api-reference/knowledge_bases/list-knowledge-bases openapi.yml get /v1/knowledge_bases # Upload knowledge base file Source: https://docs.fluents.ai/api-reference/knowledge_bases/upload-knowledge-base-file openapi.yml post /v1/knowledge_bases/{kbId}/files # Create message Source: https://docs.fluents.ai/api-reference/messages/create-message openapi.yml post /v1/messages # List messages Source: https://docs.fluents.ai/api-reference/messages/list-messages openapi.yml get /v1/messages # Activate number Source: https://docs.fluents.ai/api-reference/numbers/activate-number openapi.yml post /v1/numbers/activate # Buy number Source: https://docs.fluents.ai/api-reference/numbers/buy-number openapi.yml post /v1/numbers/buy # Cancel number Source: https://docs.fluents.ai/api-reference/numbers/cancel-number openapi.yml post /v1/numbers/cancel # Detach number Source: https://docs.fluents.ai/api-reference/numbers/detach-number openapi.yml post /v1/numbers/detach # Get number Source: https://docs.fluents.ai/api-reference/numbers/get-number openapi.yml get /v1/numbers # Get number tags Source: https://docs.fluents.ai/api-reference/numbers/get-number-tags openapi.yml get /v1/numbers/tags # Link number Source: https://docs.fluents.ai/api-reference/numbers/link-number openapi.yml post /v1/numbers/link # List available numbers Source: https://docs.fluents.ai/api-reference/numbers/list-available-numbers openapi.yml get /v1/numbers/available # List numbers Source: https://docs.fluents.ai/api-reference/numbers/list-numbers openapi.yml get /v1/numbers/list # Update number Source: https://docs.fluents.ai/api-reference/numbers/update-number openapi.yml post /v1/numbers/update # Create prompt Source: https://docs.fluents.ai/api-reference/prompts/create-prompt openapi.yml post /v1/prompts/create # Get prompt Source: https://docs.fluents.ai/api-reference/prompts/get-prompt openapi.yml get /v1/prompts # List prompts Source: https://docs.fluents.ai/api-reference/prompts/list-prompts openapi.yml get /v1/prompts/list # Update prompt Source: https://docs.fluents.ai/api-reference/prompts/update-prompt openapi.yml post /v1/prompts/update # Run simulation Source: https://docs.fluents.ai/api-reference/simulation/run-simulation openapi.yml post /v1/simulation/run # Create tag Source: https://docs.fluents.ai/api-reference/tags/create-tag openapi.yml post /v1/tags # Delete tag Source: https://docs.fluents.ai/api-reference/tags/delete-tag openapi.yml delete /v1/tags/{id} # Get tag Source: https://docs.fluents.ai/api-reference/tags/get-tag openapi.yml get /v1/tags/{id} # List tags Source: https://docs.fluents.ai/api-reference/tags/list-tags openapi.yml get /v1/tags # Update tag Source: https://docs.fluents.ai/api-reference/tags/update-tag openapi.yml patch /v1/tags/{id} # Create transcriber Source: https://docs.fluents.ai/api-reference/transcribers/create-transcriber openapi.yml post /v1/transcribers/create # Delete transcriber Source: https://docs.fluents.ai/api-reference/transcribers/delete-transcriber openapi.yml delete /v1/transcribers/{id} # Get transcriber Source: https://docs.fluents.ai/api-reference/transcribers/get-transcriber openapi.yml get /v1/transcribers # List transcribers Source: https://docs.fluents.ai/api-reference/transcribers/list-transcribers openapi.yml get /v1/transcribers/list # Update transcriber Source: https://docs.fluents.ai/api-reference/transcribers/update-transcriber openapi.yml post /v1/transcribers/update # Create voice Source: https://docs.fluents.ai/api-reference/voices/create-voice openapi.yml post /v1/voices/create # Get voice Source: https://docs.fluents.ai/api-reference/voices/get-voice openapi.yml get /v1/voices # List voices Source: https://docs.fluents.ai/api-reference/voices/list-voices openapi.yml get /v1/voices/list # Update voice Source: https://docs.fluents.ai/api-reference/voices/update-voice openapi.yml post /v1/voices/update # Create webhook Source: https://docs.fluents.ai/api-reference/webhooks/create-webhook openapi.yml post /v1/webhooks/create # Get webhook Source: https://docs.fluents.ai/api-reference/webhooks/get-webhook openapi.yml get /v1/webhooks # List webhooks Source: https://docs.fluents.ai/api-reference/webhooks/list-webhooks openapi.yml get /v1/webhooks/list # Update webhook Source: https://docs.fluents.ai/api-reference/webhooks/update-webhook openapi.yml post /v1/webhooks/update # How a call runs Source: https://docs.fluents.ai/product/concepts/agent/advanced What happens between the caller finishing a sentence and the agent replying, and why that gap is the thing you tune. A voice agent is three systems in a chain. Understanding the chain explains most of what feels wrong on a bad call. *** ## The chain **Speech to text** turns what the caller said into words. **A language model** decides what to say back, following your prompt. **Text to speech** turns that reply into audio. Each link takes time, and the caller experiences the total as the pause before the agent answers. Every provider choice you make is a trade between how good a link is and how fast. *** ## Latency is the thing callers notice People forgive an agent that says something slightly wrong. They do not forgive an agent that leaves a two second silence, because silence on a phone call reads as a dropped connection. Fluents records timings per link on every call, so when an agent feels sluggish you can see which part of the chain is responsible rather than guessing. See **[Calls](/product/features/call)**. If an agent has to do something slow, such as calling your own systems mid conversation, let it say something first. A filled pause is fine. An unexplained one is not. *** ## Knowing when the caller has finished The agent has to decide when a caller has stopped speaking rather than merely paused. Too eager and it interrupts. Too patient and it feels unresponsive. There is a related question of what to do when nobody says anything at all. The agent waits, checks in, and eventually ends the call rather than holding an open line forever. Both are tunable. See **[Agents](/product/features/agent)**. *** ## Calls have a ceiling A call has a maximum length, so a conversation that goes nowhere cannot run indefinitely and bill you for it. Separately, each environment has a **concurrency limit**, which is how many calls can run at once. This is the constraint people hit and misdiagnose most often. A campaign that appears to be dialing slowly is usually queued against this number rather than malfunctioning. See **[Settings](/product/features/account/settings)**. *** ## Models are a choice, not a given You can change which language model runs the conversation. Larger models reason better about complicated instructions. Smaller ones reply faster. For most phone conversations, faster wins. The reasoning demands of a well written prompt are usually modest, and the latency cost of a large model is paid on every single turn. *** ## Recording and privacy Recording is a setting, not a default, and it interacts with your obligations rather than replacing them. Compliance modes restrict what is retained. Compliance settings restrict what Fluents stores. They do not tell you what you are legally required to do, and they are not a substitute for consent where consent is required. *** ## Where to go next * **[Agents](/product/features/agent)** for the settings themselves. * **[Calls](/product/features/call)** for per-call timings. * **[What happens after a call](./post-call)** for what the platform does once the conversation ends. # What the agent says Source: https://docs.fluents.ai/product/concepts/agent/basic How the prompt, the opening line, the voice and the skills combine into a conversation. Four things shape what a caller actually hears. They interact, which is why changing one and being surprised is so common. *** ## The opening line The first thing the agent says is set separately from the prompt, and it matters out of proportion to its length. On an outbound call it decides whether the person stays on the line. On an inbound call it sets what they think they are allowed to ask for. It can include values from the call's context, such as a name, so the same line reads differently per contact. If you change one thing about an underperforming agent, change this. It is one sentence and it gates everything after it. *** ## The prompt The prompt is the agent's standing instructions. It is read before every conversation and it is where behaviour actually lives. Some things that hold true regardless of what you are building: **Simple instructions beat complex ones.** A short prompt that the agent follows is worth more than a thorough one it approximates. **Structure helps.** A long prompt split into sections is followed more reliably than the same content as prose. **Examples beat description.** Showing the agent a good exchange does more than describing one. **Write for speech.** The agent reads this aloud. Unusual words and proper nouns need spelling out phonetically, or they come out mangled. Prompts can be saved and reused across agents. See **[Prompts](/product/features/prompts)**. *** ## The voice A voice has a provider, and usually a speaking speed. Language is set separately, on the agent. Voices differ in more than timbre. Some handle interruption and pacing better than others, and the only reliable test is hearing one read your own opening line rather than a sample. You can also bring in a voice from a provider you already use. See **[Voices](/product/features/voice)**. *** ## Skills Skills are the difference between an agent that talks and an agent that does things. Each one adds an ability and, usually, some instructions of its own that the agent follows alongside your prompt. They cover roughly four jobs: * **Ending the conversation well**, by hanging up cleanly or agreeing a callback. * **Getting to the right person**, by transferring, handling a screener, or working through a phone menu. * **Doing something concrete**, such as booking an appointment or sending a message. * **Knowing things**, by searching content you have stored. Skills add instructions to the agent, so switching on several at once can crowd your prompt. If behaviour changes after adding a skill, that is why. Add them one at a time and test between. See **[Agents](/product/features/agent)** for the full list and their settings. *** ## Context A call can start with values already known, such as the person's name or an order number. Those are available to the prompt and to the opening line. On a campaign they come from your contact list. On a test call you set them by hand. Personalisation only works when they are actually present, which is why a test call with empty context sounds worse than the real thing. *** ## Where to go next * **[How a call runs](./advanced)** for the machinery underneath. * **[Agents](/product/features/agent)** for every setting. * **[Testing an agent](/product/features/agent-testing)** for changing a prompt safely. # What an agent is Source: https://docs.fluents.ai/product/concepts/agent/intro The unit everything else in Fluents attaches to, and the four things that decide how it behaves. An **agent** is a configured voice assistant that holds a phone or browser conversation. It is the unit everything else attaches to. Numbers ring an agent, campaigns call through an agent, and every call in your history belongs to one. You can have as many as you like, and most teams end up with several. One agent per job works better than one agent that does everything, because the instructions stay short and the failures stay obvious. *** ## The four things that decide behaviour **The prompt** is the instructions. It is the largest influence on what the agent actually does, and most problems are prompt problems. **The voice** is how it sounds, including language and speaking speed. **Skills** are discrete abilities you switch on, such as transferring a call, booking an appointment, or texting during the conversation. An agent without skills can only talk. **Settings** are the machinery underneath, such as which models run the conversation and how long the agent waits before deciding you have stopped speaking. Everything you configure falls into one of those four. *** ## Inbound and outbound are the same object There is no separate inbound agent type. An agent becomes inbound when a number points at it, and outbound when something places a call through it. The same agent can do both. In practice you usually want different ones, because the opening line of a call you placed and a call you received have almost nothing in common. *** ## What an agent produces Every conversation leaves a record: a transcript, an outcome, timings, and whatever structured information you asked the agent to extract. That record is the point. An agent that handles calls but tells you nothing about them is a call centre with worse reporting. *** ## Where to go next * **[What the agent says](./basic)** for how the prompt, voice and skills interact. * **[How a call runs](./advanced)** for what happens between the caller speaking and the agent replying. * **[What happens after a call](./post-call)** for turning conversations into data. * **[Agents](/product/features/agent)** for the settings themselves. # What happens after a call Source: https://docs.fluents.ai/product/concepts/agent/post-call How a conversation becomes structured data you can filter, chart and act on. A conversation is not useful as a conversation. It becomes useful when it turns into something you can count. That is what post-call processing does. When a call ends, the platform reads what happened and produces structured results. *** ## Insights An **insight** is a question asked of your calls, answered automatically afterwards. "Were they interested?" "Which product did they ask about?" "What is their renewal date?" Answers can be yes or no, a number, a value from a list you define, or free text. Insights are only extracted from calls longer than **20 seconds**. Very short calls produce no insights at all, which is usually right, but it does mean a wall of blank results is often a wall of hang-ups rather than a fault. This is the mechanism that turns a pile of transcripts into something you can filter in **[Calls](/product/features/call)** or chart in **[Reports](/product/features/reports)**. Write insights as questions you would actually act on. "Was the caller satisfied" is interesting. "Did they ask for a callback" changes what somebody does next. *** ## Deciding whether a call went well Insights describe a call. A **result** judges it. You define what success means as conditions over your insights, and every call is marked accordingly. Without this, a thousand calls tell you nothing at a glance, because you have to read them. Getting this right takes a couple of passes. The first definition of success is usually too generous. *** ## Acting on the outcome Once a call is understood, the platform can act: * **Send a message**, by text or email, to the person or to your team. * **Update your own systems**, by syncing the outcome to a CRM. * **Notify anything**, by sending the result to a URL you control. See **[Post-call](/product/features/post-call)** for setting these up and **[Webhooks](/product/features/webhook)** for the notification path. *** ## Timing matters more than people expect Post-call processing is not instant. A call ending and a call being understood are two different moments, separated by however long the analysis takes. If you are reacting to calls programmatically, wait for post-call processing to finish rather than for the call to end. Reading results at the moment the call stops gets you empty fields. *** ## Where to go next * **[Post-call](/product/features/post-call)** for configuring insights and results. * **[Reports](/product/features/reports)** for charting what you extracted. * **[Webhooks](/product/features/webhook)** for pushing results to your systems. # How campaigns work Source: https://docs.fluents.ai/product/concepts/campaigns When to reach out to a list rather than wait for the phone to ring, and the shapes campaigns usually take. A **campaign** works a list of contacts for you. Each contact enters, moves through a sequence you define, and leaves when something conclusive happens. The word to hold on to is **sequence**. A campaign is not a bulk dial. It is a set of steps applied to each contact independently, at their own pace. *** ## Campaign or inbound agent You do not always need a campaign. Use an **inbound agent alone** when people call you. A support line, an after-hours line, a main business number. Use a **campaign** when you are reaching out. Sales outreach, appointment reminders, payment reminders, re-engagement. > If your team would otherwise work a call list by hand, you want a campaign. *** ## What a campaign is made of **Contacts** are who to reach, imported from a file or pulled from a CRM. **A sequence** is what happens to each of them, one or more steps with waits between. **An agent** does the talking on each call step. **A schedule** decides which days and hours contacts may be reached, in a timezone you set. This is separate from the campaign so several campaigns can share one set of calling hours. **A caller number** is what shows up on the recipient's phone. **Exit criteria** decide when a contact is done and should stop receiving steps. *** ## Contacts leave, and that is the point The most common surprise is a contact who stops receiving steps. A contact leaves when they answer, when they ask to stop being contacted, or when their number turns out to be unreachable. Answering counts as an exit, which is usually what you want. The campaign existed to reach them, and it did. If you are expecting a follow-up that never arrives, this is almost always why. *** ## Common shapes **One call.** Reach a list once. Import contacts, one phone step, business hours. The right place to start, and often enough. **Try more than once.** A phone step, a wait of a day, another phone step. Contacts who answered on the first attempt have already exited, so the second step only reaches the ones you missed. **Call, then follow up in writing.** A phone step followed by a message step, for when a conversation needs something in writing afterwards. Build the one-step version first even if you know you want three. The failures you find in a single step are the same failures that would have been three times harder to see. *** ## Where campaigns touch everything else Campaigns place calls, so they consume your **concurrency limit**. A campaign that seems slow is often queued behind that ceiling rather than broken. They dial from your **numbers**, and calling too hard from one number gets it flagged as spam by carriers. Pacing exists for this and is worth setting before volume, not after. Every call a campaign places lands in your call history like any other, and post-call processing applies to them in the usual way. *** ## Where to go next * **[Campaigns](/product/features/campaigns)** for building one. * **[Campaign schedules](/product/features/campaign-schedules)** for calling hours. * **[Numbers](/product/features/numbers)** for caller IDs and pacing. * **[Set up your first campaign](/product/quickstart/first-campaign)** for a worked example. # How numbers work Source: https://docs.fluents.ai/product/concepts/numbers Why a number belongs to one environment, what it means to point one at an agent, and why spreading traffic matters. A phone number is what connects your agents to the telephone network. Outbound calls need one to call from. Inbound calls need one pointed at an agent to arrive at. *** ## Numbers belong to an environment A number lives in one environment and is invisible everywhere else. This is deliberate. It means a test environment cannot accidentally dial from your production caller ID. It is also the reason a number you are certain you bought appears to be missing, when you are simply looking at a different environment. *** ## Inbound is a pointer Buying a number does not make anything answer it. A number answers when it points at an agent. Until then it can still place outbound calls perfectly well, which is why an unassigned number is not necessarily a mistake. It just means nothing happens when somebody rings it. *** ## Outbound is a choice per call On the way out, the number is the caller ID the recipient sees. Campaigns can select numbers by tag rather than one at a time, which is what makes regional caller IDs practical. Tagging by area or purpose when you buy costs seconds and saves an afternoon later. *** ## One number is not a strategy Carriers watch how numbers behave. A number that dials fast and often, and rarely gets answered, starts being labelled as spam on recipients' handsets. Once that happens the number is worth much less, and it does not recover quickly. Two things follow. **Pace each number.** There are controls for how frequently a single number is used, and they exist precisely to avoid this. Roughly a hundred calls a day per number is a reasonable ceiling. **Spread across several.** More volume should mean more numbers, not harder use of one. Deliverability is easier to protect than to repair. Set pacing before you scale volume, not after the first number gets flagged. *** ## Numbers and the do not call list Numbers your agents must not dial are held separately and apply regardless of which campaign or agent is calling. Some entries you add. Others are recorded automatically when someone asks to be left alone. See **[DNC List](/product/features/dnc-list)**. *** ## Where to go next * **[Numbers](/product/features/numbers)** for buying, linking and pacing. * **[Campaigns](/product/features/campaigns)** for choosing caller IDs by tag. * **[Settings](/product/features/account/settings)** for environment caps. # How voices work Source: https://docs.fluents.ai/product/concepts/voices What actually makes a voice work on a phone call, and why the pleasant one is not always the right one. The voice is the part of your agent people form an opinion about in the first two seconds. It is also the setting most often chosen badly, because it is chosen by listening to a sample rather than to a conversation. *** ## A voice comes from a provider Fluents does not generate voices itself. It connects to speech providers, each with its own catalogue and its own character. You can use the voices already available to you, or bring in one from a provider account you already have, including a cloned or custom voice. *** ## What matters on a phone call Sample quality is the least useful signal. **Speed of first sound** matters more than fidelity. A voice that begins speaking promptly feels responsive. One that is fractionally richer but slower feels broken, because the caller reads the gap as a dropped line. **Behaviour under interruption** matters. People talk over agents constantly. Voices differ in how gracefully they stop. **Pacing on numbers and names** matters. Phone numbers, order references and email addresses are where a voice either helps or forces the caller to ask twice. Preview with your own opening line, not the provider's sample. A voice reading marketing copy tells you nothing about the same voice reading your booking reference back. *** ## Speed belongs to the voice How fast the agent speaks is saved on the voice itself, not on the agent, and not every provider supports it. Change to a voice from a provider that does not, and the control disappears. Slightly slower than feels natural to you is usually right. You know what the agent is about to say. The caller does not. *** ## Language Language is set on the agent, separately from the voice. They should agree. Mismatching them produces the uncanny result of correct words in the wrong accent and rhythm. *** ## Where to go next * **[Voices](/product/features/voice)** for the library and importing. * **[Agents](/product/features/agent)** for setting voice, language and speed. * **[Testing an agent](/product/features/agent-testing)** for hearing it in context. # Get API key Source: https://docs.fluents.ai/product/features/account/get-api-key Where the key is, what it is scoped to, and the one thing people get wrong about it. Every **environment** has its own API key. There is no account-wide key. *** ## Where it is Open **Settings**, go to the **Environments** tab, and find your environment in the list. The **API Key** column shows it masked. The eye icon reveals it and the other icon copies it.