Send and receive SMS with a simple, intuitive API

Textbelt is a no-nonsense SMS API built for developers who just want to send SMS. There is a free version and a paid version:

Thousands of clients prefer Textbelt over other SMS providers for our ease of setup, simple, predictable pricing packages, and personal support.

Send a text message with an HTTP request

Try it now. No client libraries, recurring billing, or account logins:

$ curl -X POST \
       --data-urlencode phone='5555555555' \
       --data-urlencode message='Hello world' \
       -d key=textbelt
Using the popular requests library:
import requests
resp ='', {
  'phone': '5555555555',
  'message': 'Hello world',
  'key': 'textbelt',
require 'net/http'
require 'uri'

uri = URI.parse("")
Net::HTTP.post_form(uri, {
  :phone => '5555555555',
  :message => 'Hello world',
  :key => 'textbelt',
Using the popular request or axios libraries:
// Using request
const request = require('request');'', {
  form: {
    phone: '5555555555',
    message: 'Hello world',
    key: 'textbelt',
}, (err, httpResponse, body) => {

// Using axios
const axios = require('axios');'', {
  phone: '5555555555',
  message: 'Hello world',
  key: 'textbelt',
}).then(response => {
Using the browser Fetch API and a CORS request:
fetch('', {
  method: 'post',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    phone: '5555555555',
    message: 'Hello world',
    key: 'textbelt',
}).then(response => {
  return response.json();
}).then(data => {

using System;
using System.Collections.Specialized;
using System.Net;

using (WebClient client = new WebClient())
  byte[] response = client.UploadValues("", new NameValueCollection() {
    { "phone", "5555555555" },
    { "message", "Hello world" },
    { "key", "textbelt" },

  string result = System.Text.Encoding.UTF8.GetString(response);
$ch = curl_init('');
$data = array(
  'phone' => '5555555555',
  'message' => 'Hello world',
  'key' => 'textbelt',

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
Using the popular Apache HttpComponents library:
final NameValuePair[] data = {
    new BasicNameValuePair("phone", "5555555555"),
    new BasicNameValuePair("message", "Hello world"),
    new BasicNameValuePair("key", "textbelt")
HttpClient httpClient = HttpClients.createMinimal();
HttpPost httpPost = new HttpPost("");
httpPost.setEntity(new UrlEncodedFormEntity(Arrays.asList(data)));
HttpResponse httpResponse = httpClient.execute(httpPost);

String responseString = EntityUtils.toString(httpResponse.getEntity());
JSONObject response = new JSONObject(responseString);
$body = @{
  "message"="Hello World"
$submit = Invoke-WebRequest -Uri -Body $body -Method Post
import (

func main() {
  values := url.Values{
    "phone": {"5555555555"},
    "message": {"Hello world"},
    "key": {"textbelt"},

  http.PostForm("", values)

Use key=textbelt to send 1 free text per day. You'll need your own key to send more messages afterwards.

To text internationally, use the E.164 format (+ country code with numbers, no spaces). For example, a Brazilian phone number is +5511912345678 and a UK phone number is +447712345678.

The recipients of your texts should have opted in to receiving your messages. Textbelt shouldn't be used for bulk advertising or spam.

Success and Failure

Example success response:
{"success": true, "quotaRemaining":40, "textId": 12345}
Example out-of-quota or invalid key response:
{"success": false, "quotaRemaining": 0, "error": "Out of quota"}
Example response to request with phone, message, or key missing:
{"success": false, "error": "Incomplete request"}

Look up text delivery status

Using the textId given by a successful sent text, load /status/<textId>. For example, if your textId is 12345:
$ curl

{"status": "DELIVERED"}

Possible return values include DELIVERED (carrier has confirmed sending), SENT (sent to carrier but confirmation receipt not available), SENDING (queued or dispatched to carrier), FAILED (not received), and UNKNOWN (could not determine status).

Delivery statuses are not standardized between mobile carriers. For example, some carriers will report SMS as "delivered" when they attempt transmission to the handset while other carriers actually report delivery receipts from the handsets.

Receiving SMS replies

U.S. phone numbers only: Textbelt lets you receive replies after you've sent an SMS. Replies are sent by webhook, meaning you will have to set up an HTTP or HTTPS route on your website that will process inbound SMS.

Add a replyWebhookUrl parameter to your HTTP request. For example:

$ curl -X POST \
  --data-urlencode phone='5557727420' \
  --data-urlencode message='Hello?' \
  -d replyWebhookUrl='' \
  -d key=textbelt

Textbelt will POST the following JSON to your endpoint (in this case

  "fromNumber": "+1555123456",
  "text": "Here is my reply"

Read more for another example.

Checking your quota

Use /quota/<key> to view remaining quota. For example, if your key is abc123:
$ curl

{"success": true, "quotaRemaining": 98}

Testing your key

If you want to validate your key without actually using your text quota, append "_test" to your key and you will receive a response from the /text endpoint confirming that a text would send:
{"sending": true, "quotaRemaining": 40, "textId": -1, "inTestMode": true}

Get started

Now you're ready to go. Fill out the form below to generate a key.

Generate an API key to send texts

If you already have one, add funds to an existing key.

Get Key

Get in touch

Any questions? Email, text +1 (650) 332-4607, or read the FAQ.