curl --request POST \
--url https://api.helloannie.com/v1/sms \
--header 'Content-Type: application/json' \
--data '
{
"fromNumber": "+15551234567",
"toNumber": "+15559876543",
"message": "Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.",
"patientInfo": {
"firstName": "Sarah",
"lastName": "Johnson",
"dateOfBirth": "1988-03-22T00:00:00.000Z",
"patientId": "PAT-10432"
},
"appointmentInfo": {
"startTime": "2025-03-10T15:00:00-06:00",
"endTime": "2025-03-10T15:30:00-06:00",
"appointmentTypeId": "apt-type-cleaning",
"appointmentDescription": "6-month routine cleaning and exam",
"appointmentId": "81260683"
},
"context": "Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM"
}
'import requests
url = "https://api.helloannie.com/v1/sms"
payload = {
"fromNumber": "+15551234567",
"toNumber": "+15559876543",
"message": "Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.",
"patientInfo": {
"firstName": "Sarah",
"lastName": "Johnson",
"dateOfBirth": "1988-03-22T00:00:00.000Z",
"patientId": "PAT-10432"
},
"appointmentInfo": {
"startTime": "2025-03-10T15:00:00-06:00",
"endTime": "2025-03-10T15:30:00-06:00",
"appointmentTypeId": "apt-type-cleaning",
"appointmentDescription": "6-month routine cleaning and exam",
"appointmentId": "81260683"
},
"context": "Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
fromNumber: '+15551234567',
toNumber: '+15559876543',
message: 'Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.',
patientInfo: {
firstName: 'Sarah',
lastName: 'Johnson',
dateOfBirth: '1988-03-22T00:00:00.000Z',
patientId: 'PAT-10432'
},
appointmentInfo: {
startTime: '2025-03-10T15:00:00-06:00',
endTime: '2025-03-10T15:30:00-06:00',
appointmentTypeId: 'apt-type-cleaning',
appointmentDescription: '6-month routine cleaning and exam',
appointmentId: '81260683'
},
context: 'Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM'
})
};
fetch('https://api.helloannie.com/v1/sms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.helloannie.com/v1/sms",
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([
'fromNumber' => '+15551234567',
'toNumber' => '+15559876543',
'message' => 'Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.',
'patientInfo' => [
'firstName' => 'Sarah',
'lastName' => 'Johnson',
'dateOfBirth' => '1988-03-22T00:00:00.000Z',
'patientId' => 'PAT-10432'
],
'appointmentInfo' => [
'startTime' => '2025-03-10T15:00:00-06:00',
'endTime' => '2025-03-10T15:30:00-06:00',
'appointmentTypeId' => 'apt-type-cleaning',
'appointmentDescription' => '6-month routine cleaning and exam',
'appointmentId' => '81260683'
],
'context' => 'Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM'
]),
CURLOPT_HTTPHEADER => [
"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://api.helloannie.com/v1/sms"
payload := strings.NewReader("{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.helloannie.com/v1/sms")
.header("Content-Type", "application/json")
.body("{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.helloannie.com/v1/sms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}Start outbound SMS conversation
Initiate an outbound SMS conversation from an Annie phone number to a destination number. Production SMS requires the sending organization’s business verification and A2P 10DLC campaign to be approved. The sender phone number must also be attached to the approved Messaging Service. SMS is subject to legal hours (9 AM–8 PM org timezone) and per-number rate limits. Rate limits per destination number: max 6 SMS per rolling 30 days, min 24 hours between attempts, 30-day cooldown after 3 consecutive failed attempts, and max 3 attempts per rolling 7 days. Returns 409 Conflict if a send to the same number is already in progress. Returns a conversation ID for tracking the SMS conversation.
curl --request POST \
--url https://api.helloannie.com/v1/sms \
--header 'Content-Type: application/json' \
--data '
{
"fromNumber": "+15551234567",
"toNumber": "+15559876543",
"message": "Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.",
"patientInfo": {
"firstName": "Sarah",
"lastName": "Johnson",
"dateOfBirth": "1988-03-22T00:00:00.000Z",
"patientId": "PAT-10432"
},
"appointmentInfo": {
"startTime": "2025-03-10T15:00:00-06:00",
"endTime": "2025-03-10T15:30:00-06:00",
"appointmentTypeId": "apt-type-cleaning",
"appointmentDescription": "6-month routine cleaning and exam",
"appointmentId": "81260683"
},
"context": "Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM"
}
'import requests
url = "https://api.helloannie.com/v1/sms"
payload = {
"fromNumber": "+15551234567",
"toNumber": "+15559876543",
"message": "Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.",
"patientInfo": {
"firstName": "Sarah",
"lastName": "Johnson",
"dateOfBirth": "1988-03-22T00:00:00.000Z",
"patientId": "PAT-10432"
},
"appointmentInfo": {
"startTime": "2025-03-10T15:00:00-06:00",
"endTime": "2025-03-10T15:30:00-06:00",
"appointmentTypeId": "apt-type-cleaning",
"appointmentDescription": "6-month routine cleaning and exam",
"appointmentId": "81260683"
},
"context": "Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
fromNumber: '+15551234567',
toNumber: '+15559876543',
message: 'Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.',
patientInfo: {
firstName: 'Sarah',
lastName: 'Johnson',
dateOfBirth: '1988-03-22T00:00:00.000Z',
patientId: 'PAT-10432'
},
appointmentInfo: {
startTime: '2025-03-10T15:00:00-06:00',
endTime: '2025-03-10T15:30:00-06:00',
appointmentTypeId: 'apt-type-cleaning',
appointmentDescription: '6-month routine cleaning and exam',
appointmentId: '81260683'
},
context: 'Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM'
})
};
fetch('https://api.helloannie.com/v1/sms', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.helloannie.com/v1/sms",
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([
'fromNumber' => '+15551234567',
'toNumber' => '+15559876543',
'message' => 'Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.',
'patientInfo' => [
'firstName' => 'Sarah',
'lastName' => 'Johnson',
'dateOfBirth' => '1988-03-22T00:00:00.000Z',
'patientId' => 'PAT-10432'
],
'appointmentInfo' => [
'startTime' => '2025-03-10T15:00:00-06:00',
'endTime' => '2025-03-10T15:30:00-06:00',
'appointmentTypeId' => 'apt-type-cleaning',
'appointmentDescription' => '6-month routine cleaning and exam',
'appointmentId' => '81260683'
],
'context' => 'Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM'
]),
CURLOPT_HTTPHEADER => [
"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://api.helloannie.com/v1/sms"
payload := strings.NewReader("{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}")
req, _ := http.NewRequest("POST", url, payload)
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://api.helloannie.com/v1/sms")
.header("Content-Type", "application/json")
.body("{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.helloannie.com/v1/sms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromNumber\": \"+15551234567\",\n \"toNumber\": \"+15559876543\",\n \"message\": \"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment.\",\n \"patientInfo\": {\n \"firstName\": \"Sarah\",\n \"lastName\": \"Johnson\",\n \"dateOfBirth\": \"1988-03-22T00:00:00.000Z\",\n \"patientId\": \"PAT-10432\"\n },\n \"appointmentInfo\": {\n \"startTime\": \"2025-03-10T15:00:00-06:00\",\n \"endTime\": \"2025-03-10T15:30:00-06:00\",\n \"appointmentTypeId\": \"apt-type-cleaning\",\n \"appointmentDescription\": \"6-month routine cleaning and exam\",\n \"appointmentId\": \"81260683\"\n },\n \"context\": \"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM\"\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"conversationId": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}{
"success": false,
"data": {},
"message": "<string>"
}Body
Request body for starting an outbound SMS conversation
The Annie phone number to send SMS from (must be configured in the system)
"+15551234567"
The phone number to send SMS to
"+15559876543"
The initial SMS message to send to the patient
1 - 500"Hi Sarah, this is Annie from Bright Smiles Dental. We wanted to reach out about scheduling your next cleaning appointment. Would you like to set something up?"
Patient information for the call
Show child attributes
Show child attributes
{
"firstName": "Sarah",
"lastName": "Johnson",
"dateOfBirth": "1988-03-22T00:00:00.000Z",
"patientId": "PAT-10432"
}Appointment information for context during the call
Show child attributes
Show child attributes
{
"startTime": "2025-03-10T15:00:00-06:00",
"endTime": "2025-03-10T15:30:00-06:00",
"appointmentTypeId": "apt-type-cleaning",
"appointmentDescription": "6-month routine cleaning and exam",
"appointmentId": "81260683"
}Context about the SMS conversation being initiated
500"Confirming upcoming cleaning appointment scheduled for March 10th at 3:00 PM"