v2: Introducing TextIt's new API

API v1 is now deprecated and will be removed on March 1st 2017

A new version of the TextIt API is now available. The purpose of this release is to ensure our operations are performant at scale. TextIt needs an API that is always fast.

We also cleaned it up, providing an interface that's now more consistent across different endpoints. We even put some thought into ensuring this version will be future-proof. 

Changes to look out for...

If you're migrating code that uses our API, be sure to reference the API v2 documentation. Below are the general changes to look out for:

  • All operations which list objects use cursor pagination rather than the typical Django page=1,... etc pagination. This means we do not return a total count value for result sets. Count values tend to be expensive to calculate on very large datasets so this was not sustainable as databases grow.
  • Filtering options are limited to single values. For example, in v1 you could fetch runs like runs.json?id=1131241,436364,464363... but now the 'id' parameter can only contain a single value. If you find yourself needing to fetching lots of objects repeatedly, then it may be better to restructure your code so that you fetch all objects of that type as they are created or modified.
  • When updating objects, the identifier is sent as a query string parameter rather than a field in the JSON body. This is more RESTful and makes POSTs more consistent with GETs and DELETEs, e.g. changing a contact's name:

    POST contacts.json
      "uuid": "1c904f04-af6f-4f2b-89e1-9ebf0c5aef73",
      "name": "Bob"


    POST contacts.json?uuid=1c904f04-af6f-4f2b-89e1-9ebf0c5aef73
      "name": "Bob"
  • Status code usage is more consistent. In v1, the status code 201 was used for both successful create operations and update operations. Trying to update a non-existent object returned 400 but trying to delete the same object returned 404. In v2, the rules for status codes are more explicit:
    • 200: A list or update request was successful.
    • 201: A resource was successfully created (only returned for POST requests).
    • 204: An empty response - used for both successful DELETE requests and POST requests that update multiple resources.
    • 400: The request failed due to invalid parameters. Do not retry with the same values, and the body of the response will contain details.
    • 403: You do not have permission to access this resource.
    • 404: The resource was not found (returned by POST and DELETE methods).
  • Objects are referenced in more consistent ways:
    • messages, runs and broadcasts are always referenced by their id value.
    • contact fields by their key.
    • groups and labels by name or UUID.
    • everything else is referenced by its UUID.
  • Datetime values are always returned with microsecond accuracy (v1 used only millisecond accuracy).
  • Phone numbers must now always include country codes, i.e. we won't accept a URN like "tel:0964153001" but we will accept "tel:+260964153001". 
  • The message bulk action endpoint is limited to 100 messages, so if you need to update more messages than that, make sure you batch your requests.
  • Some vocabulary has been removed. In v1 messages could sometimes be sms and channels could be relayers. In v2 it's always messages and channels.
  • All endpoints are rate-limited. If you're making lots of requests then expect to get some 429 responses. These will include a Retry-After header which provides a number of seconds to wait before retrying.

API Explorer

You can use the API Explorer to test these new operations against your account's data. 

If you have any questions about migrating to v2, don't hesitate to ping us here.

Automatically Add Flow Responses to Google Sheets with Google Apps Script

If you're using TextIt, you're likely interested in analyzing the results of each interaction your contacts have with your messaging bot. You probably also want to streamline the process of viewing and analyzing them. You can do so by sending the results of each flow run to a Google Sheet as your contacts finish them. There, you can visualize your data as it's being updated and even build a custom dashboard.

It's possible to set this up with a service called Zapier, but you can also use Google's powerful, built-in, JavaScript-based scripting language Apps Script. In this tutorial, you'll learn how to use Apps Script to add the results of a run down the 'Satisfaction Survey' sample flow to a Google Sheet. Feel free to follow along with the copy in your account, 'Sample Flow - Satisfaction Survey'.


  • TextIt account
  • Google account 

Let's Begin

Our goal: To send flow responses to a Google Sheet.

This messages in this flow run will be sent to a Google Sheet. A new row will be created for each run. 

Create your Spreadsheet

First, we’ll create a new spreadsheet and set up the rows that will hold our data. To make these columns easier to interact with, we’re going to make use of Named Ranges. This allows us to give each column a name that we can reference in our script. To name a range, double-click the column, then select 'Define named range...'. Give it a one-word name. It's vital that all rows are selected, e.g. 'Sheet1!B:B'. 

Go ahead and name all 7 of your new columns.

Create a Script

Now we'll start scripting. From the Tools menu, select Script Editor. Give your script a name. 

Erase the existing code in the editor and add the following code: 

Let’s look at the first 3 lines of code:

  • Line 1: we create a doPost() function so that our script can receive flow results via POST requests. These POST requests will be made when the active contact reaches a Call Webhook RuleSet. This function, unique to Apps Script web apps, will process any new POST request from our flow once we’ve deployed our script as a web app.
  • Line 2: we're gaining access to our spreadsheet file. Google Apps Script differentiates between a spreadsheet and a sheet (a spreadsheet is a file that may have one or more sheets–or worksheets or tabs). We can gain access to the entire sheet by referencing its ID (the long string of characters in the spreadsheet’s URL after '/d/'). Replace the placeholder in the code with your spreadsheet ID.
  • Line 3: the request object will contain the entire payload of the incoming POST request. We're assigning it to a variable in order to conveniently access its parameters.

Publish your Script

Select Deploy as Web App from the Publish menu in the script editor, then choose the following options:

  • Execute the app as: Me
  • Who has access to the app: Anyone, even anonymous

Click Deploy, then copy the address of the Current web app URL to your clipboard. You’ll need that for your webhook. Congradulations, you've just published a web app!

Add a Webhook to your Flow

Add a 'Call Webhook' RuleSet to the end of your 'Satisfaction Survey' flow. Select POST and paste the URL provided in the previous step: 

Before you click Ok, make sure to add a query string to the end of the URL to include the flow variables that represent the responses your flow has collected. Not familiar with flow variables? Learn about them here.

Here's mine: 


The query string represents everything from the '?' to the end of the URL. It allows you to create parameters to be sent to your web app. We're simply adding flow fields to the URL so that TextIt knows to send them to our web app and the Google Sheet knows to add them to its columns. The names you give these values should be one word and describe them accurately as you'll be referencing them in your script. 

Finish your Script

First, we'll need to add a function that crawls the rows in each column. The nextRow() function will do just that. Copy this code, replacing the parameter in SpreadsheetApp.openById() with the ID after the /d/ in your Google Sheet's URL. I've highlighted its location below:


The final step is to map the incoming data–represented by TextIt variables–to the columns in the your Google Sheet. Copy the code below (starting from the comment '// Isolate flow field values...') and replace the parameter and column names in the code above. For example, consider these two separate but related lines:

var date = request.parameters.date;

sheets.getRangeByName('date').getCell(nextRow, 1).setValue(date);

In this case, date in request.parameters.date and .getCell(nextRow, 1).setValue(date) should be changed to the name you gave your date flow field (if other than @flow.date), and 'date' in  sheets.getRangeByName('date') should be changed to the name you gave your date column in your Google Sheet (if other than 'date').

Test your Service

Nice job, you're ready to test your web app with the simulator. Complete your flow and watch your responses appear in your Google Sheet

Questions? Comments? Let us know. We love hearing from you.

Add Features to your Chatbot with Webhooks

webhook is a handy tool that you can use to transfer information into and out of a web app through simple HTTP requests containing data in a structured format (JSON, in TextIt's case). Better yet, you don't need to have extensive coding experience to make use of them. 

In TextIt, we make webhooks available to you through the Call Webhook RuleSet, which sends the phone number of the active contact, their state in the flow, and the flow's name to the URL you specify. See the Flow Event webhook documentation for a full list of the values included in that request. This RuleSet can be used to send information to other service's APIs, like Zapier (see this guide to get started with the TextIt Zapier app), Google Maps, Google Sheets, and really any other service that provides a JSON API. Use this guide to learn how to add functionality to your bot by making use of other services' APIs. It only takes a few clicks. 

Whereas TextIt's 'Wait for Response' RuleSet allows you to evaluate incoming responses according to various response rules, the 'Call Webhook' RuleSet allows you to send responses to an external service and either evaluate or reply with that service's response. For example, you can use a 'Call Webhook' RuleSet to POST a message to the Google Translate API, then reply with the translated message using a 'Send Message' action that contains a variable–starting with the '@extra' prefix*–that matches the translated message's key in the returned JSON object. 

*As the image above demonstrates, you can access keys stashed in arrays (between '{[' and ']}') by placing '.0.' in front of the key. 

See for Yourself

Search the following bots on Telegram to interact with flows that make use of other services' APIs: 

Oxford Wordsly, a bot that tests your English and Spanish vocabulary using a collection of APIs. 

Purrington, a bot that provides cat facts. 

Bandito, a bot that provides Spanish translations.

Using Webhooks

To get started, you'll need an API, a key to access it, and a sample request from that API's documentation. In the example below, we'll be using Google's geocoding API to verify addresses submitted by our contacts. Instructions for acquiring a key are usually front and center in the API's documentation:  

The documentation states that we'll need to structure the request like so: 


The request above dictates that, aside from our key, we'll just need to provide an address. To do so, we'll need to create a flow that asks the active contact for their address. We'll be using an open-ended 'Wait for Response' RuleSet labeled 'Address' to handle that response. 

Next, we'll connect the 'Address' RuleSet to a 'Call Webhook' RuleSet. We can place the variable created by the 'Address' RuleSet in our request to ensure that it represents the address each contact submits. 

Now we can use the simulator to inspect Google's response. 

Google responded with a 200, meaning that our request was successful. Now we'll need to parse it's response for the fully formatted address. We can do so by clicking the highlighted 'webhook event' link in the simulator. The key we're looking for is 'formatted_address'. 

Since this key is actually housed in an array under a key called 'results' (the 'results' array isn't visible in the image above), we'll need to place '.0.' in front of it to access it: 


Finally, we'll need to account for failures. We can do so by connecting the 'Failure' category that the 'Call Webhook' RuleSet automatically creates to a message that prompts the active contact to try again. 

Voilà, we've created a flow that collects and verifies our contacts' addresses using Google's Geocoding API. What will you build? 


  • If an API responds with minified JSON, you can expand it using this tool
  • This page is a great resource for publicly-available JSON APIs

Questions? Comments? Let us know! We love hearing from you. 

Mult-Tier Accounts: Child Accounts & Credit Distribution

Customers who purchase 1,000,000 or more credits unlock multi-tier account privileges, which allow you to add multiple child accounts and distribute credits to them through the originating, or parent, account. This feature is intended for organizations with multiple use cases across multiple countries, where it's useful to be able to create accounts for specific organizational branches and manage them from a central account. 

Adding Child Accounts

To add a child account, first navigate to your account's home page. 

Scroll to the 'Your organization is...' section and click the 'Manage Organizations' button.

Click the 'New' button in the top right corner of the page. 

Distributing Credits

Select the 'Transfer Credits' option from the gear icon menu in the top right corner of the page. 

On the resulting modal, select the origin and destination accounts, then enter the amount of credits you'd like to transfer. 

Managing Accounts

To enter one of your child accounts, simply click the new account icon in the top right corner of the screen and select the account you'd like to enter. 

Questions? Comments? Let us know. We love hearing from you.

Multi-User Support: Adding, Editing & Removing Multiple Account Users

Customers who purchase 100,000 or more credits unlock multi-user support, which allows them to add multiple users of varying roles to the account. This feature is intended for enterprise accounts, where multiple users may need to oversee your flows, campaigns, scheduled broadcasts and contacts, or routinely export information from the account. 

To add additional users to your account, first navigate to your account's home page. 

Scroll to the bottom and click the 'User Accounts..." icon. 

Here, you can choose to manage account users via the 'Manage Accounts' button or, if you're using the TextIt Surveyor app to collect information offline in the field, create a password that other Surveyor users can enter into the app to be able to submit responses to your account. Click the 'Manage Accounts' button. 

The 'Manage User Accounts' page is where you'll add, edit and remove additional users of various roles. To add a users, simply enter their email address and select the permission you'd like to give them.

Account Roles


Surveyors have no administrative privileges, nor can they access the account. They may only submit flow results via our offline flow-based data collection mobile app, TextIt Surveyor


Viewers can see every aspect of the account, but may not modify anything. 


Editors can edit flows, campaigns, triggers and contacts; send messages; start flows; export flows, contacts and messages; and export/import flows. Editors cannot make changes to the account's home page, including managing account roles, changing language or timezone settings, and adding and removing channels. 


In addition to editing privileges, admins may make the above-mentioned changes to the account's home page.

Questions? Comments? Let us know. We love hearing from you. 

Feature Update: Group Membership Evaluation

Groups are a great way to track and manage users, and they can mean many different things: perhaps a group represents active users, completion of a flow, participation in a campaign, a particular response to a question, or an attribute that some of your contacts might share. Whatever their purpose, groups are an important to getting the most out of TextIt. For this reason, we simplified the process of checking if the active contact is a member of a particular group. 

Simply select the 'Split by group membership' option from the RuleSet menu and add the groups you'd like to check for membership. Each will become its own category. 

Evaluating Membership in Multiple Groups

If you need to check for membership in multiple groups, you can chain multiple 'Split by group membership' RuleSets. 


The 'Split by group membership' RuleSet evaluates the groups you enter from left to right, so order matters if it's possible the contact could be in more than one of the groups entered. If they are, they'll be matched with the group that appears first. The order the groups are evaluated in can be changed by dragging the groups from left to right in the 'Group Membership' modal. 

Questions? Comments? Let us know! We love hearing from you. 

Introducing First Class Zapier Support

We’re excited to announce first class Zapier support through the new ‘Call Zapier’ RuleSet. For those who aren’t yet familiar, Zapier allows anyone to integrate TextIt with over 750 other apps like Google Sheets and Slack without writing a single line of code. 

Specifically, it enables you to create connections that pass information fro one app to another. For example, you might use Zapier to:

  • Distribute and verify coupons and vouchers via Google Sheets.

  • Alert your Slack channel of a flow response.

  • Add contacts who complete a Typeform embedded in your website to a flow.

  • Add new Salesforce contacts to flows.

  • Use HookPress to trigger flows from actions taken on your Wordpress site.

How it Works

Zapier watches your apps for new data and kicks off triggers and actions based on the rules you set. Each trigger and action pairing is called a 'zap'. Here are some examples:

Supported Zaps

The TextIt Zapier app currently has one action and one trigger, though we're happy to explore additions based on your feedback.

The action, 'Start Flow', allows you to start one or more contacts in a flow using data from another app. Check out this video for a quick tutorial:

The trigger, 'Flow Event', sends all of the responses collected by a flow up to the 'Call Zapier' step to the app of your choice. Check out this video for a quick tutorial:

Try it Out

If you haven't already, head over to Zapier to discover more use cases and sign up for a free account. Have a workflow you need to automate, but aren't sure how? We're happy to help

Questions? Comments? Let us know! We love hearing from you. 

Transfer Airtime with TextIt

On over 400 mobile networks in more than 100 countries, TextIt users can now transfer airtime to help power their business operations, messaging services, community outreach initiatives, and mobile marketing campaigns. Using the popular airtime and mobile money transfer service TransferTo, you can use flows to send airtime to over 4.5 billion prepaid mobile users around the world.

Regulated by the Financial Conduct Authority in the UK, TransferTo is a B2B mobile payment network interconnecting financial institutions and mobile operators globally. Thousands of leading companies, including Vodafone’s M-Pesa, Tigo Money, Orange, Western Union, PayPal and Xoom rely on TransferTo’s Mobile Money and Airtime Hub.

Among the factors that led us to integrate with TransferTo are its reliability and ubiquity among top financial institutions and mobile operators. To date, its Money and Airtime Hub has processed more than 50 million transactions. 

Airtime Primer

Airtime is the time during which a cellular phone is in use, including calls made and received by extensions. It typically covers SMS and data usage. Airtime transfer is the process of remotely adding airtime to a prepaid mobile phone. Also called a Top-Up, Recharge, Reload, E-load, Fa, Nap, Kontor, or Refill.

Use Cases

  • If you use the Nyaruka TextIt Android app to send messages and receive messages with a prepaid SIM card, you can now add airtime directly from your TextIt account instead of physically purchasing airtime from a local vendor.
  • Your can now offer airtime as a reward for flow completion, as sending airtime to your respondents encourages participation, and reimbursement for the cost of sending SMS ensures they’ll participate in the future.

Getting Started

First, you'll need to open a denominational account with TransferTo. To do so, send a note through TransferTo's contact form including your company name, address and currency. You'll be assigned an account and account manager to help you navigate the service. 

Locating your API Token

Once you've acquired an account, navigate to the developer portal. 

Enable two factor authentication to access your API token, then copy it to your clipboard.

Connecting TransferTo to TextIt

Finally, navigate to your TextIt account’s home page, select the TransferTo icon at the bottom of the page, then paste your TransferTo API token and enter your TransferTo username.

How it Works

Once you’ve integrated your TransferTo account with TextIt, you’ll be able to send money in the currencies used in the countries for which your account has channels. To add airtime transfer to one of your flows, simply open the ‘RuleSet’ modal in the flow editor and select the ‘Transfer Airtime’ option. Then, select the amount of money you’d like the step to send.

Finally, add branches that account for successful and failed transfer attempts.

Troubleshooting Transfers

You can click the TransferTo icon on your account's home page to access your transfer logs. 

Get in Touch 

Question? Comments? Let us know. We love hearing from you!

Monitor your Twilio Channels with Email Alerts

We understand that error tracking is an important part of managing your Twilio-powered TextIt SMS application. To ensure that you're constantly abreast of channel errors–like the commonly-encountered blacklist error–we recommending setting up a trigger alert in your Twilio account portal. 

Once configured, a trigger alert can send you daily emails if one or more errors has occurred. Luckily, that process is easy: To set one up, simply log into your Twilio account, click on the 'Developer Center' icon and select 'Trigger Alerts' from the resulting menu. 

Here, you can create an alert that sends you daily, monthly or yearly alerts when 1 or more errors occur. Feel free to forward the email to our support channel once you've received it and we can walk you through the troubleshooting process. 

Get in Touch 

Question? Comments? Let us know. We love hearing from you!

TextIt, 3 Years Later

It’s been 3 years since we officially launched TextIt in Kigali, Rwanda. TextIt 1.0 was the culmination of 3 years’ work building custom SMS products for governments, NGOs and private companies across East Africa. Our goal was to enable every organization in the world to inexpensively leverage SMS to better accomplish their mission, and we introduced our solution in the form of a flow engine to manage automated messaging and the world's first Android phone channel–an application that turns your Android phone into an SMS modem that relays messages to an HTTP server and vice versa.

Since then, TextIt has grown to support research, polling and Bots through short codes, virtual phone numbers, Android phones, Facebook Messenger, Telegram, Twitter and, by the end of 2016, Viber and Kik.

A Commitment to Affordability and Transparency

Through it all, we’ve maintained a commitment to providing a universally accessible service–both financially and technically. We switched to a pay-as-you-go pricing model, and pre-loaded each new account with 1,000 complimentary credits to allow you to test your service before committing.

We didn't stop there: we open sourced TextIt in 2014 to improve its accessibility and facilitate UNICEF's adoption of the platform. UNICEF's investment didn't end at open sourcing the platform; with their cooperation we’ve continued to add features that make TextIt even more dynamic and powerful. When you decide to incorporate TextIt into your organization’s communication systems, you can do so knowing that the software isn’t going anywhere. It's supported by a robust, global community of developers and providers. What’s more, we make our work public, allowing you to view our roadmap and track our progress.

In addition to an open code base, we provide world-class hosting. We’ve scaled considerably over the past two years, going from millions of messages per month to millions per day. When you host with TextIt, performance isn’t a question.

Drip Messaging Campaigns

We introduced campaigns, a powerful feature that enables you to schedule messages and flows around a date and time unique to each of your contacts. It’s since been adopted for post-purchase messaging, maternal reminders, and a variety of treatment-adherence programs and studies.

Comprehensive API

We built out our API to enable you to integrate with and/or build on top of each of TextIt’s core features: flows, contacts, message broadcasts and campaigns. Now, anyone can plug TextIt into their existing systems with ease. 

White Labeling

We introduced white-labeling-as-a-service, enabling any organization to leverage our hosting expertise and adopt TextIt’s software with their own branding.

IP Messaging Channels

TextIt now supports three different IP based channels which are playing an ever greater role in programs around the world. We provide first class support for Twitter, Telegram and Facebook Messenger, letting you use all the same tools we initially built for text messaging to automate other messaging channels. These IP platforms also support receipt of rich content, enabling you to collect pictures, videos, audio clips and GPS coordinates. We have plans to add Viber and Kik by the end of the year, and we’re anxiously waiting for WhatsApp to release a Bot API.

Flow Engine Enhancements

We recently added the ability to use flows as subroutines, enabling you to launch a child flow to collect variables and then return control to the parent flow. This approach greatly simplifies complicated systems in that you can centralize particular pieces of functionality. For example, you can create one registration flow and call it from any other flow, removing the need to build registration into each flow.

We also added timers to RuleSets, allowing you to send reminder messages to flow participants after a certain amount of time has elapsed without a response, or add a 'pause' in a flow to stagger messages.

An Offline Surveyor Tool

Late last year we introduced our offline surveying tool, Surveyor. Think of it as ODK Collect with a chat interface and much quicker setup process. You can use the same authoring tools we initially created for SMS to build flows that can be run offline on any Android device, allowing enumerators to collect rich data such as pictures, video, GPS coordinates, etc. in branching questionnaires. Surveyor is currently being used at scale in Nigeria to survey health clinics.

Platform Roadmap

We’re always adding and updating features based on your feedback. In the coming weeks, we’ll be launching some big ones:

  • A first class integration with TransferTo to enable airtime and mobile money transfers around the world.

  • A first class Zapier integration, extending the functionality our private Zapier app, which will enable you to use events in Flows as triggers to over 500 other apps and, conversely, trigger Flow starts through triggers in other apps.

  • The ability to pause a flow for a brief period and/or route a flow differently if a certain amount of time has elapsed without a response.

  • Outgoing MMS support for Twilio, Android and IP messaging channels.

Sign up for a free account to take advantage of these developments. Each new account is given 1,000 complimentary messages to help you get a feel for the platform. You'll also gain access to our newsletter, which provides updates on our progress and links to the articles we're reading. 

Already a user? Send us a note about your experience with the platform. We love hearing from you.