cURL
curl "https://app.tatango.com/api/v2/lists/ID/subscribers" -d '{"subscriber":{"phone_number":"2141234567","first_name":"John","last_name":"Doe"}}' -X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-u emailaddress@mydomain.com:my_api_key \
-H "Host: example.org" \
-H "Cookie: "require 'net/http'
require 'uri'
uri = URI.parse('https://app.tatango.com/api/v2/lists/ID/subscribers')
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_url)
request.basic_auth("emailaddress@mydomain.com", "my_api_key")
request.body = {"subscriber":{"phone_number":"2141234567","first_name":"John","last_name":"Doe"}}.to_json
response = http.request(request)var request = new XMLHttpRequest();
request.open('POST', 'https://app.tatango.com/api/v2/lists/ID/subscribers', false);
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Authorization', 'Basic ' + btoa('emailaddress@mydomain.com:my_api_key'));
var data = JSON.stringify({ subscriber: { phone_number: '2141234567', first_name: 'John', last_name: 'Doe' } });
request.send(data);import requests
url = "https://app.tatango.com/api/v2/lists/{ID}/subscribers"
payload = { "subscriber": {
"phone_number": "2141234567",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"birthdate": "19900101",
"zip_code": "75201",
"gender": "Male",
"bypass_opt_in_process": True,
"bypass_opt_in_response": False,
"tags": "vip,customer",
"custom_field_key": "custom_value"
} }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.tatango.com/api/v2/lists/{ID}/subscribers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'subscriber' => [
'phone_number' => '2141234567',
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'john.doe@example.com',
'birthdate' => '19900101',
'zip_code' => '75201',
'gender' => 'Male',
'bypass_opt_in_process' => true,
'bypass_opt_in_response' => false,
'tags' => 'vip,customer',
'custom_field_key' => 'custom_value'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.tatango.com/api/v2/lists/{ID}/subscribers"
payload := strings.NewReader("{\n \"subscriber\": {\n \"phone_number\": \"2141234567\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"birthdate\": \"19900101\",\n \"zip_code\": \"75201\",\n \"gender\": \"Male\",\n \"bypass_opt_in_process\": true,\n \"bypass_opt_in_response\": false,\n \"tags\": \"vip,customer\",\n \"custom_field_key\": \"custom_value\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.tatango.com/api/v2/lists/{ID}/subscribers")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"subscriber\": {\n \"phone_number\": \"2141234567\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"birthdate\": \"19900101\",\n \"zip_code\": \"75201\",\n \"gender\": \"Male\",\n \"bypass_opt_in_process\": true,\n \"bypass_opt_in_response\": false,\n \"tags\": \"vip,customer\",\n \"custom_field_key\": \"custom_value\"\n }\n}")
.asString();{
"status": "Subscriber added",
"subscriber": {
"phone_number": "2141234567",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"birthdate": "19900101",
"zip_code": "75201",
"gender": "Male",
"cleaned_at": null,
"subscribed_at": "2025-06-18T15:36:07Z",
"opted_out_at": null,
"opt_in_method": "api",
"keyword_name": null,
"carrier": 383,
"carrier_name": "Verizon Wireless",
"global_carrier_id": "12345",
"global_carrier_name": "Verizon",
"tags": [
"vip",
"customer"
]
}
}Subscribers
Adding a Subscriber
This endpoint adds a subscriber to a list.
POST
/
api
/
v2
/
lists
/
{ID}
/
subscribers
cURL
curl "https://app.tatango.com/api/v2/lists/ID/subscribers" -d '{"subscriber":{"phone_number":"2141234567","first_name":"John","last_name":"Doe"}}' -X POST \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-u emailaddress@mydomain.com:my_api_key \
-H "Host: example.org" \
-H "Cookie: "require 'net/http'
require 'uri'
uri = URI.parse('https://app.tatango.com/api/v2/lists/ID/subscribers')
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Post.new(uri.request_url)
request.basic_auth("emailaddress@mydomain.com", "my_api_key")
request.body = {"subscriber":{"phone_number":"2141234567","first_name":"John","last_name":"Doe"}}.to_json
response = http.request(request)var request = new XMLHttpRequest();
request.open('POST', 'https://app.tatango.com/api/v2/lists/ID/subscribers', false);
request.setRequestHeader('Content-Type', 'application/json');
request.setRequestHeader('Authorization', 'Basic ' + btoa('emailaddress@mydomain.com:my_api_key'));
var data = JSON.stringify({ subscriber: { phone_number: '2141234567', first_name: 'John', last_name: 'Doe' } });
request.send(data);import requests
url = "https://app.tatango.com/api/v2/lists/{ID}/subscribers"
payload = { "subscriber": {
"phone_number": "2141234567",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"birthdate": "19900101",
"zip_code": "75201",
"gender": "Male",
"bypass_opt_in_process": True,
"bypass_opt_in_response": False,
"tags": "vip,customer",
"custom_field_key": "custom_value"
} }
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.tatango.com/api/v2/lists/{ID}/subscribers",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'subscriber' => [
'phone_number' => '2141234567',
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'john.doe@example.com',
'birthdate' => '19900101',
'zip_code' => '75201',
'gender' => 'Male',
'bypass_opt_in_process' => true,
'bypass_opt_in_response' => false,
'tags' => 'vip,customer',
'custom_field_key' => 'custom_value'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.tatango.com/api/v2/lists/{ID}/subscribers"
payload := strings.NewReader("{\n \"subscriber\": {\n \"phone_number\": \"2141234567\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"birthdate\": \"19900101\",\n \"zip_code\": \"75201\",\n \"gender\": \"Male\",\n \"bypass_opt_in_process\": true,\n \"bypass_opt_in_response\": false,\n \"tags\": \"vip,customer\",\n \"custom_field_key\": \"custom_value\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.tatango.com/api/v2/lists/{ID}/subscribers")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/json")
.body("{\n \"subscriber\": {\n \"phone_number\": \"2141234567\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"email\": \"john.doe@example.com\",\n \"birthdate\": \"19900101\",\n \"zip_code\": \"75201\",\n \"gender\": \"Male\",\n \"bypass_opt_in_process\": true,\n \"bypass_opt_in_response\": false,\n \"tags\": \"vip,customer\",\n \"custom_field_key\": \"custom_value\"\n }\n}")
.asString();{
"status": "Subscriber added",
"subscriber": {
"phone_number": "2141234567",
"first_name": "John",
"last_name": "Doe",
"email": "john.doe@example.com",
"birthdate": "19900101",
"zip_code": "75201",
"gender": "Male",
"cleaned_at": null,
"subscribed_at": "2025-06-18T15:36:07Z",
"opted_out_at": null,
"opt_in_method": "api",
"keyword_name": null,
"carrier": 383,
"carrier_name": "Verizon Wireless",
"global_carrier_id": "12345",
"global_carrier_name": "Verizon",
"tags": [
"vip",
"customer"
]
}
}The following parameters can be used to bypass the opt-in process:
bypass_opt_in_process- When true, adds phone number without double opt-inbypass_opt_in_response- When true, suppresses confirmation message
FAQs
What happens when we use the add subscriber API to add a home phone number (i.e. non-cellular)?- You will receive the message “Bad phone number: landline or unreachable carrier” with the status code 422.
- We will initiate the process of resubscribing the phone number to the list.
- A 200 OK is returned and no changes are made to the subscriber.
- No. The reply is currently configured to YES.
- Yes. The optional parameters are listed for this API endpoint.
- Yes. All optional parameters’ limitations are noted - see the JSON parameters above.
- The phone number should be a continuous string of ten digits - with no dashes and no country code (e.g. “2065551111”).
- Yes - each list is a separate entity.
Request URL
POST https://app.tatango.com/api/v2/lists/{ID}/subscribers
Authorizations
The momoGood Messaging API v2 authenticates requests by validating an API key passed via HTTP Basic Authentication. Use your login email as the username and your API key as the password.
Path Parameters
ID of the list
Body
application/json
Show child attributes
Show child attributes
Response
200 - application/json
Subscriber created successfully
Examples:
"Subscriber added"
"Subscriber being added to campaign pending confirmation"
"Subscriber has been added - no opt-in message was sent due to list settings."
"Subscriber has already been sent opt-in message for this campaign."
"Subscriber is already subscribed to this campaign."
Show child attributes
Show child attributes
⌘I