---
title: "Fluents AI Integration"
description: "Place and manage AI voice-agent phone calls with the Fluents Hosted API, starting outbound calls, ending live calls, and pulling transcripts. Agents run phone work and keep the transcript with the record."
url: https://flowrunner.ai/integrations/fluents-ai
date_modified: 2026-08-07T17:20:23-07:00
---

# Fluents AI

[Voice & Telephony](https://flowrunner.ai/integrations/category/voice-telephony)

Place and manage AI voice-agent phone calls with the Fluents Hosted API, starting outbound calls, ending live calls, and pulling transcripts. Agents run phone work and keep the transcript with the record.

[Verified](https://flowrunner.ai/integrations/verified "What does verified mean?") · 1 trigger · 11 actions · API key · available

[Fluents AI website](https://fluents.ai/) · [Platform Documentation](https://docs.fluents.ai) · Capability data verified 2026-08-01

1.  On New Call fires as a call lands on the account, oldest first
2.  Agent runs Get Call and reads status, stage and stage outcome alongside the transcript
3.  Agent separates the calls that never connected from the conversations that connected and then went wrong
4.  Agent writes the transcript and the stage outcome onto the matching record, so the reason is stored rather than inferred
5.  Agent posts every transfer\_unanswered result into the channel that owns the handoff, because that is a person who did not pick up
6.  When a call is still in\_progress well past the expected duration, the agent asks the owner before End Call hangs up on a live conversation

## What This Integration Enables

Fluents AI is a deliberately narrow surface, and the narrowness is the point. Place a call with an agent configuration, retrieve it with its transcript, list what happened, hang one up, and register webhooks. There is no contact book, no tagging layer and no campaign object. It expects to sit inside something else, which is exactly the shape a [connector](https://flowrunner.ai/concepts/connectors) should have when the orchestration lives above it.

What Fluents does give you, which most AI calling APIs do not, is an explicit vocabulary for how a call ended. Status is one of not\_started, in\_progress, error or ended. Stage is one of created, picked\_up, transfer\_started or transfer\_successful. Stage outcome is one of human\_unanswered, call\_did\_not\_connect, human\_disconnected, bot\_disconnected, transfer\_unanswered or transfer\_disconnected. Those distinctions carry real operational weight. A human\_unanswered is worth retrying tomorrow. A call\_did\_not\_connect points at the number. A transfer\_unanswered is not a telephony problem at all, it is a teammate who did not pick up, and it belongs in a channel where somebody owns it. Building retry and escalation logic on that vocabulary produces behaviour that matches what actually happened rather than a blanket rule applied to everything that did not succeed.

The connector is also honest about what it does not validate. Create Call models agent, telephony provider, context and telephony params as free-form JSON, because the Fluents API documents them as untyped objects with no inner fields, so they pass through exactly as supplied. That means the first dial with a new configuration is also the first time it is checked, which is worth knowing before the flow points it at a list.

### Without FlowRunner

**"The call failed"**: The outcome is a single failed flag that covers a voicemail, a wrong number and a dropped transfer

**Transcripts stay in the dashboard**: Reading what the voice agent actually said means opening another tool

**Stuck calls run on**: A call that never ends keeps running and nobody sees it until the bill arrives

### With FlowRunner

**The failure has a name**: Each call carries a stage and a stage outcome, so retry logic can tell one failure from another

**Transcripts land on the record**: The conversation is stored with the customer it was about, as it lands

**Long-running calls escalate**: A call past its expected duration is raised to a person while it is still connected

## Use Case Scenarios

### Retry logic that reads the actual outcome

An agent handles the aftermath of every outbound call the same way it landed: through On New Call, oldest first. It runs Get Call, reads the stage and stage outcome, and branches on them rather than on a single success flag. human\_unanswered schedules another attempt inside the contact's calling window. call\_did\_not\_connect flags the number for verification instead of burning three more attempts on a line that does not exist. human\_disconnected, where the person picked up and then hung up, is written to the record as exactly that and excluded from automatic retries entirely, because dialling someone again who just ended the call is the fastest way to earn a complaint.

### Transcripts posted where the handoff lives

Get Call returns the transcript along with the timing, stage and action history. For calls that reached transfer\_successful, the agent posts the transcript into the [Slack](https://flowrunner.ai/integrations/slack) channel that owns the handoff so the person who took the transfer has the first half of the conversation in front of them. For calls that reached transfer\_started and ended at transfer\_unanswered, it posts a different message, naming the call, the customer and the fact that the transfer went unanswered, because that outcome is a staffing signal and not a telephony fault.

### Dialling from the system of record

A newly qualified lead in [HubSpot](https://flowrunner.ai/integrations/hubspot) is ready for a call. The agent runs List Agents to select the configuration matched to that segment and its language, List Phone Numbers to pick a number that is active and permitted for outbound, and assembles the context object with the fields the voice agent should know. Because Fluents passes those objects through unchanged, the agent validates the payload against a stored known-good shape before it dials rather than discovering a malformed context in a live conversation. Create Call returns the record and its ID, and the flow waits for On New Call to bring the result back around.

## Human-in-Loop Highlight

End Call is a blunt instrument, and that is exactly why a flow should not be allowed to reach for it alone. It hangs up an in-progress call by ID, and the person on the other end experiences that as being cut off mid-sentence. There is one situation where an agent genuinely needs it: a call sitting at status in\_progress far past any reasonable duration for that conversation, which is either a stuck session burning telephony spend or a voice agent stuck in a loop with a real person on the line. The agent detects that from Get Call rather than guessing, then stops. It posts what it can see to the owner: "Call 8f2a to +1 512 555 0148 has been in\_progress for 19 minutes against an expected 4. Stage is picked\_up, no transfer started. Transcript so far attached. End the call, or leave it running?" The owner reads the transcript, which is usually enough to tell a genuine long conversation from a loop, and answers. Nothing hangs up on a customer because a threshold fired. That is the [digital andon cord](https://flowrunner.ai/concepts/digital-andon-cord) working the way it should: the agent recognises the anomaly and pulls the cord, and the judgment call stays with a person.

Agent processes routinely

Detects that from Get Call rather than guessing

Clear match Continues automatically

Ambiguous Routes to human via preferred channel

Human decides

Agent resumes with decision

## Agent Capabilities

11 actions

### Calls

4

-   **Create Call** Places an outbound call to a given number using the supplied agent configuration and telephony provider. The Fluents API models agent, telephony provider, context, telephony params, telephony metadata and telephony account connection as free-form JSON with no published inner fields, so each is passed through exactly as supplied. Returns the created call record with its ID and status.
-   **Get Call** Retrieves one call by ID with its transcript, recording availability, timing, stage and action history. Status is one of not\_started, in\_progress, error or ended. Stage is one of created, picked\_up, transfer\_started or transfer\_successful. Stage outcome is one of human\_unanswered, call\_did\_not\_connect, human\_disconnected, bot\_disconnected, transfer\_unanswered or transfer\_disconnected.
-   **List Calls** Returns a paginated list of calls with status, stage, stage outcome, numbers, timing and transcript availability. The Fluents API marks every pagination parameter as required, so page, size, sort column, sort direction and filters are always sent with sensible defaults applied.
-   **End Call** Ends an in-progress call by ID and returns the updated record. Used to hang up a call that is still connected, and only after a person has approved, because the other party experiences it as being cut off.

### Agents and Numbers

3

-   **Get Agent** Retrieves one agent by ID with its prompt, voice, language, actions, transcriber and post-call configuration. Agent language is one of en, es, de, hi, pt, fr, nl, id, it, ja or ko.
-   **List Agents** Returns a paginated list of agents with their prompts, voices, languages and call settings. Used to select the configuration matched to a segment before dialling.
-   **List Phone Numbers** Returns a paginated list of numbers on the account including whether each is active, whether it is outbound-only, and which inbound agent answers it. Used to pick a permitted caller ID.

### Webhooks

4

-   **Create Webhook** Registers a webhook that Fluents posts call events to. Documented subscription tokens are event\_message, event\_action, event\_transcript and event\_post\_call\_processing\_completed, with further event types selectable in the Fluents dashboard. Fluents webhooks are unsigned, so a secret, unguessable receiving URL is used.
-   **Get Webhook** Retrieves one registered webhook by ID with its target URL, delivery method, label and subscribed event types.
-   **List Webhooks** Returns a paginated list of registered webhooks with their URLs, delivery methods and event subscriptions. Used to audit what the account is already sending and where.
-   **Update Webhook** Updates an existing webhook by ID, changing the target URL, delivery method, label or event subscriptions. The Fluents API exposes no delete-webhook endpoint, so webhooks are removed from the Fluents dashboard.

## Triggers

1 triggers

### Event Triggers

1

-   **On New Call** Polls the account's call list and fires for each newly seen call, oldest first. The first poll only records the calls that already exist, so history is never replayed. Fluents publishes no delete-webhook endpoint, which is why this is a polling trigger rather than a registered subscription that could not be cleanly removed. Used to run post-call handling as calls land, branching on the stage outcome rather than on a single success flag.

## Frequently Asked Questions

### What can FlowRunner do with Fluents AI?

FlowRunner agents can run Create Call, Get Call, and List Calls in Fluents AI, plus 8 more actions.

### Does connecting Fluents AI to FlowRunner require OAuth?

No. Fluents AI connects to FlowRunner with an API key, no OAuth flow required.

### Can Fluents AI trigger a FlowRunner workflow automatically?

Yes. Fluents AI supports 1 trigger that can start a FlowRunner workflow automatically.

**Work at Fluents AI?** This integration exposes Fluents AI to AI agents on every FlowRunner plan, including through MCP, at no cost to you. [See what FlowRunner offers integration partners](https://flowrunner.ai/integrations/partners), including how to keep this page current.

---
Markdown version of https://flowrunner.ai/integrations/fluents-ai. Site index: https://flowrunner.ai/llms.txt
