FlowRunner
PricingContact
Theme
Start Free

TextIt

Messaging

Connect AI agents to TextIt, a flow based messaging and chatbot platform. Agents send messages and broadcasts, start flows, manage contacts and groups, schedule campaigns, and react to resthook events so conversational outreach runs across channels without manual dispatch.

Verified 1 trigger 63 actions API key available
TextIt website ↗ Platform Documentation ↗ Capability data verified 2026-08-12
On Resthook Event fires when a running flow reaches a Call Resthook step, delivering the flow, the contact, the channel, the run and every result collected so far
The contact's results are read out of the payload, which is the conversation's own state rather than a single inbound message
The outside systems are consulted, since a resthook is the point where a flow hands a decision to something that is not TextIt
Update Contact writes the answer back onto the contact record by UUID or by URN, and Add Contacts To Group moves them into the right cohort
Start Flow enrolls the contact in the next conversation, which then continues on its own across whatever channel the workspace has connected
List Runs and List Flow Starts report what actually happened to the enrollment rather than what was requested
Update Global waits for a person, because a global is read by flows already in progress and changes what they say mid conversation

What This Integration Enables

TextIt is a hosted RapidPro deployment, and it is not a gateway with a flow builder attached. The object model is the flow and the contact, and the message is a consequence of them. You address a contact by URN, a telephone number, a Telegram handle, an email address, and TextIt routes over whichever channel the workspace has connected, which may be an Android handset acting as a modem, a commercial carrier, or a social platform. There is no sender ID to choose, because the sending identity is the channel itself. For an operation running structured conversations at scale, health programs, field surveys, benefits enrollment, multi step onboarding, that inversion is the point: you build the conversation once, and the channel is a deployment detail rather than a rewrite.

Two properties of this API are worth designing around, and both are places where a naive integration fails silently rather than loudly. Broadcast content is translatable: the text, attachments and quick replies of a broadcast are dictionaries keyed by three letter language code with a base language naming the default, and TextIt delivers each contact the version matching their preferred language. This connector accepts either form on Send Broadcast, wrapping plain text under the base language and passing a dictionary through untouched. It also guarantees the named base language is one that actually exists, because naming a language you did not supply would leave the platform with no default text at all. A single message sent with Send Message is not translatable, and the two are kept deliberately distinct.

The second is that seven resources are updated with a POST to the same path as their create, distinguished only by a selector in the query string. An update that lost its selector would not error; it would create a duplicate object, which on a contact means a second copy of a real person quietly receiving everything. Create and update therefore ship as separate named actions here, every selector is required, and Update Contact refuses to run with neither selector or with both. TextIt also has something rare in this category: a real trigger with a real subscription API, where subscribers are a many per resthook collection so registering a callback cannot clobber one the customer built for their own systems. Duplicate risks, failed enrollments and interrupted runs surface as automation exceptions rather than as data drift nobody notices for a quarter.

Without FlowRunner

Language handled by branching A separate flow exists per language, and adding a third means copying the second and hoping the copies stay aligned
An update that quietly duplicates A write loses its selector, the platform treats it as a create, and a second copy of the same contact starts receiving everything
Shared wording edited in place Somebody fixes a phone number in a global, and conversations already running start saying the new thing halfway through

With FlowRunner

Language handled by the message itself Broadcast text is a dictionary keyed by language code with a base language behind it, and TextIt delivers each contact their version
Create and update are separate acts Every update carries a required selector that is asserted before the request, so a lost mapping fails rather than duplicating a person
Shared wording changed as a decision Who is currently inside the affected flows is counted first, and a person approves the edit knowing what it interrupts

Use Case Scenarios

A resthook that lets an outside system decide

A structured conversation reaches the point where it needs an answer TextIt does not hold: whether this person is eligible, whether the stock exists, whether the appointment slot is free. The flow calls a resthook, On Resthook Event fires, and the payload carries the contact, the channel, the run and every result collected so far. The agent looks the answer up in Postgres or Airtable, writes the outcome back with Update Contact addressed by URN, and either enrolls the contact in the follow up conversation with Start Flow or adds them to a group a campaign is already watching. The conversation continues on TextIt's side without the agent staying in it, which is the correct division of labor: TextIt drives the dialogue, the agent supplies the facts the dialogue needs.

Multilingual outreach that stays one message

A program messages a population that reads in three languages. Rather than three broadcasts and three audiences, the agent builds one Send Broadcast whose text is a dictionary keyed by language code with the base language named, and TextIt delivers each contact the version matching their own preference. Contact language lives on the contact record, so keeping it accurate is an Update Contact away rather than a segmentation exercise. List Broadcasts reports what went out, and Label Messages tags the resulting traffic so the next report can find it. The failure mode this design removes is the quiet one: three parallel broadcasts drifting apart over a year until the Portuguese version is saying something the English one stopped saying.

Campaigns keyed to a date the contact carries

A campaign event fires relative to a date field on the contact rather than to a calendar, which is what makes appointment reminders, course sequences and follow up schedules work per person. The agent maintains the field with Create Field and Update Contact, creates the campaign with Create Campaign, and attaches events with Create Campaign Event, which schedules future automated sends. Because those sends are scheduled rather than dispatched, changing the field on a contact moves their whole sequence. Tickets close the loop where a conversation needs a human: List Tickets, Assign Tickets by email address, Add Note To Tickets and Close Tickets give the escalation path, and the notes land in Slack so the assignee sees them where they already work.

Human-in-Loop Highlight

The gate on TextIt is Update Global, and it earns the gate for a reason that is specific to a flow platform and would make no sense on a gateway. A global is a named value that running flows read. Editing one does not schedule a change or queue a deployment. It changes what live flows say, on the next message they send, to every contact currently inside any flow that reads that value. There is no version, no staging, no preview and no rollback in this API, and the contacts affected are not a list anybody assembled: they are whoever happens to be mid conversation when the write lands. A support number, a clinic address, a deadline date, a program name, all the things a global usually holds, are exactly the values a person halfway through a dialogue is being told.

An agent can do all the preparation and still not be the right one to press it. It can read the current value with List Globals, find which flows reference it, and count who is currently inside them with List Runs filtered to active runs. Then it stops. Into Slack: "The clinic phone number in global support_line is changing from 0800 XXX 4412 to 0800 XXX 4470. That global is read by 3 flows, and 1,284 contacts are currently in an active run on those flows. Updating it changes what those conversations say from their next message onward, and there is no rollback for the messages already sent. Update now, or wait for the active runs to drain?"

That question is unanswerable from inside the API and takes a person about ten seconds. It is also a genuinely different shape of gate from the ones a messaging platform usually needs, because nothing is being sent and nothing is being deleted. What is being changed is the script of conversations already underway, which is the kind of consequence Orchestration as a Service exists to notice and a per message approval would never have caught. The digital andon cord belongs on the write that reaches backwards into work in progress. Two neighboring actions get the same treatment in their own descriptions rather than a second gate. Delete Contacts and Delete Messages are permanent bulk operations, and both refuse an empty or all blank selection before any request is issued, so a mapping that resolved to nothing fails where the mistake actually is.

Agent processes routinely
Detects exception requiring judgment
Clear match Continues automatically
Ambiguous Routes to human via Slack
Human decides
Agent resumes with decision

Agent Capabilities

63 actions

Messaging

5
  • Send Message Sends a single message to a contact addressed by UUID or by URN. Its text is a plain string and is not translatable, which is the deliberate difference between this and a broadcast.
  • List Messages Returns messages with their direction, status and labels, cursor paginated, which is the surface for reconciling what a flow actually said against what it was meant to say.
  • Send Broadcast Sends to many contacts, groups or URNs at once. Text, attachments and quick replies are translatable, given either as plain values wrapped under the base language or as dictionaries keyed by language code, and the base language is guaranteed to name a translation that exists.
  • List Broadcasts Returns the broadcasts sent from the workspace with their status and recipients, which is how a flow confirms a large send landed rather than assuming it.
  • Upload Media Fetches a file from a URL as binary and posts it to TextIt as multipart. Nothing is retained on the FlowRunner side, so this forwards rather than stores.

Message Actions

5
  • Label Messages Applies an existing label to up to a hundred messages by integer id. The existing label parameter is the one backed by a picker, because the alternative parameter creates a label when it is missing.
  • Unlabel Messages Removes a label from up to a hundred messages, with the same distinction between addressing an existing label and naming one.
  • Archive Messages Archives up to a hundred messages, which removes them from the active view without destroying them.
  • Restore Messages Returns archived messages to the active view, which is the reversible counterpart to archiving.
  • Delete Messages Permanently deletes up to a hundred messages. An empty or all blank selection is refused before any request is issued, because a mapped field that resolved to nothing should fail where the mistake is rather than where it lands.

Flows

4
  • Start Flow Enrolls contacts, groups or URNs in a flow, which then drives the conversation on its own. Whether contacts already in the flow are restarted, and whether active contacts are excluded, are both decisions made here rather than by the flow.
  • List Flow Starts Returns the enrollments that have been requested with their status, which is how a flow confirms an enrollment actually took rather than trusting the request.
  • List Flows Returns the workspace's flows with their type and current state, which is the read that turns a flow name in a brief into a UUID a start can use.
  • List Runs Returns individual contacts' journeys through flows with the results collected. Filtering by flow and by contact at once is forbidden by the platform and refused before the request.

Contacts

4
  • List Contacts Returns contacts with their URNs, fields, groups and language. There is deliberately no contact picker on this connector, because the endpoint has no name search and a picker would page blindly through an address book that may hold millions of records.
  • Create Contact Creates a contact with its URNs, name, language, fields and groups.
  • Update Contact Updates a contact addressed by UUID or by URN, with exactly one of the two required. Updating by a URN no contact holds creates one instead, which is the platform's own behavior and worth knowing before a flow uses URN addressing as a lookup.
  • Delete Contact Deletes one contact addressed by UUID or by URN.

Contact Actions

6
  • Add Contacts To Group Adds up to a hundred contacts to a group, which is the usual way a decision made outside TextIt becomes a cohort a campaign already watches.
  • Remove Contacts From Group Removes up to a hundred contacts from a group, which is how an enrollment ends without deleting anybody.
  • Block Contacts Blocks up to a hundred contacts so they receive nothing further, which is the reversible suppression to reach for on an opt out.
  • Unblock Contacts Unblocks up to a hundred contacts, returning them to receiving. Because this reverses a suppression that may have been the contact's own request, it deserves the same care as any consent write.
  • Interrupt Contacts Interrupts up to a hundred contacts' active flow runs, which is the exit from a conversation that has gone wrong and the counterpart to Start Flow.
  • Delete Contacts Permanently deletes up to a hundred contacts. An empty or all blank selection is refused before any request is issued.

Groups

4
  • List Groups Returns the workspace's contact groups with their counts, which is what a campaign or a broadcast is actually pointed at.
  • Create Group Creates a group, which is the unit that campaigns watch and broadcasts address.
  • Update Group Renames a group, addressed by UUID, with the selector required and asserted so an update cannot become a create.
  • Delete Group Deletes a group. Campaigns watching it lose their audience, so check what references it before removing it.

Fields

3
  • List Fields Returns the contact field definitions with their keys and types. Fields are addressed by key rather than by UUID, which is a distinction worth carrying through a flow.
  • Create Field Creates a contact field, which is what makes a date driven campaign or a personalized message possible in the first place.
  • Update Field Updates a field definition addressed by key, with the selector required.

Labels

4
  • List Labels Returns the message labels defined in the workspace, which the labeling actions take by identifier.
  • Create Label Creates a message label, for classifying traffic in a way reporting can find later.
  • Update Label Renames a label addressed by UUID, with the selector required and asserted.
  • Delete Label Deletes a label and removes it from the messages that carried it, so anything keyed on that label stops matching.

Globals

3
  • List Globals Returns the workspace's globals with their keys and current values. This is the read that has to happen before any global is changed, because it is the only way to see what the running flows are currently saying.
  • Create Global Creates a global, a named value that flows read at run time.
  • Update Global Changes a global's value, addressed by key. Running flows read globals at the moment they send, so an update changes what conversations already in progress say from their next message onward, with no version and no rollback.

Campaigns

7
  • List Campaigns Returns the workspace's campaigns and the groups they watch.
  • Create Campaign Creates a campaign against a group, which is the container the individual scheduled events belong to.
  • Update Campaign Updates a campaign addressed by UUID, with the selector required.
  • List Campaign Events Returns a campaign's events with their offsets, the date field they key on and what they send or start.
  • Create Campaign Event Creates an event that fires at an offset from a date field on the contact, which is what schedules future automated sends per person rather than per calendar date.
  • Update Campaign Event Updates an event addressed by UUID, with the selector required, which changes the schedule for everyone the campaign is watching.
  • Delete Campaign Event Deletes a scheduled event, which stops the future sends it would have made.

Opt-Ins

2
  • List Opt-Ins Returns the workspace's opt ins, which is the consent surface this platform models separately from blocking.
  • Create Opt-In Creates an opt in, for a channel or program that needs consent recorded as its own object rather than as a contact field.

Tickets

7
  • List Topics Returns the ticket topics configured in the workspace, which is how a ticket gets routed to the right queue.
  • Create Topic Creates a ticket topic, for a category of escalation that does not have one yet.
  • List Tickets Returns tickets with their contact, topic, assignee and state, which is the queue a human team works.
  • Assign Tickets Assigns up to a hundred tickets. Assignees are addressed by email address rather than by id, which is why the user picker here is valued by email.
  • Add Note To Tickets Adds a note to up to a hundred tickets, which is how context assembled by a flow reaches the person who will act on it.
  • Close Tickets Closes up to a hundred tickets.
  • Reopen Tickets Reopens up to a hundred tickets, which is the reversible counterpart to closing them.

Workspace

4
  • List Channels Returns the channels connected to the workspace, which is where the sending identity actually comes from since there is no sender ID to choose.
  • List Archives Returns the workspace's archives of older messages and runs, for retrieval beyond the live retention window.
  • List Users Returns the workspace's users with their roles and email addresses, which is what ticket assignment is keyed on.
  • Get Workspace Returns the workspace's name, country, languages and configuration. It is the cheapest proof that both the token and the workspace URL are right, which makes it the natural first call.

Resthooks

5
  • List Resthooks Returns the resthook slugs defined in the workspace. A slug comes into existence only when somebody adds a Call Resthook step to a flow in the TextIt interface, so an empty list is a workspace state rather than a broken connection.
  • List Resthook Subscribers Returns the subscribers registered against resthooks, each with its own id and target URL, which is what makes a many per resthook model safe to share with your own systems.
  • Create Resthook Subscriber Registers a target URL against a resthook slug. Because subscribers are a collection rather than a single slot, registering one cannot overwrite a subscription somebody else created.
  • Delete Resthook Subscriber Removes one subscriber by id, leaving every other subscriber on the same resthook untouched.
  • List Resthook Events Returns recent resthook events with their data, which is the surface for confirming the payload shape a receiver should expect before a flow depends on it.

Triggers

1 triggers

Event Triggers

1
  • On Resthook Event Fires when a running flow reaches a Call Resthook step, delivering the flow, the contact, the channel, the run, the contact's input and every result collected so far. It is a real subscription rather than a per message callback: TextIt exposes full create, read and delete on resthook subscribers, each with its own id and target URL, so the trigger registers its own and removes only its own. The replacement subscription is created before the previous one is removed, so a failure midway leaves the trigger subscribed rather than silently deaf.

Frequently Asked Questions

What can FlowRunner do with TextIt?

FlowRunner agents can run Send Message, List Messages, and Send Broadcast in TextIt, plus 60 more actions.

Does connecting TextIt to FlowRunner require OAuth?

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

Can TextIt trigger a FlowRunner workflow automatically?

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

Start building with TextIt

$100 in credits. No card required. Connect in minutes.