Send messages programmatically via REST API. Integrate with Make, Zapier, Claude, GPT, or your own code. No local server required. The API is fully cloud-hosted.
Text Your List's API is cloud-hosted. You send a request to https://textyourlist.com/api/make/send from anywhere, Make, Zapier, a Python script, an AI agent, and the message is delivered through your desktop app to your phone.
The flow is:
POST /api/make/send with your API key.All API endpoints require a Bearer token in the Authorization header.
To revoke a key, return to Developer → API Keys → Revoke. Any Make/Zapier scenario using the revoked key will stop working immediately.
Authorization: Bearer tbk_your_api_key_here Content-Type: application/json
Send a single text to one phone number: a follow-up, a reminder, a quick reply triggered by something in another app. The message goes out through your desktop app from your own number.
| Field | Type | Required | Description |
|---|---|---|---|
phone | string | Required | Recipient phone number. US format: +12125550100 or 2125550100. |
message | string | Required | Message text. Max 1,600 characters. |
image_url | string | Optional | Public URL of an image to attach as MMS. Must start with https:// or http://. Supported formats: JPEG, PNG, GIF, HEIC. The desktop app downloads the image at send time and attaches it, your URL just needs to stay publicly accessible until the message is processed. |
curl -X POST https://textyourlist.com/api/make/send \
-H "Authorization: Bearer tbk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"phone": "+12125550100",
"message": "Hey! Just wanted to follow up on your quote."
}'curl -X POST https://textyourlist.com/api/make/send \
-H "Authorization: Bearer tbk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"phone": "+12125550100",
"message": "Here is your custom proposal.",
"image_url": "https://s3.amazonaws.com/your-bucket/proposal.jpg"
}'The image URL can point to S3, Airtable attachments, Dropbox direct links, or any publicly accessible file. The desktop app handles the download. Nothing is uploaded to or stored on Text Your List servers.
201{
"job_id": "3f2d...",
"message_id": "9a1c...",
"status": "queued",
"preview": "Here is your custom proposal."
}The status field tells you what happened:
queued: desktop is open, message will send shortly.api_pending: desktop is closed or set to "Hold for review". Message waits until you open the app and choose to send.Use this when you want to kick off a full campaign and send a message to everyone on one of your saved contact lists, personalized for each person.
| Field | Required | Description |
|---|---|---|
list_name | Required* | The name of a saved contact list in your app (not case-sensitive). Use list_id instead if you prefer the ID. |
list_id | Optional | ID of the contact list. Either list_name or list_id is required. |
template | Required* | The message text to send. Use {first_name}, {last_name}, or any column name from your list in curly braces to personalize each message (e.g. Hey {first_name}, just checking in!). |
template_name | Optional | Use a saved template from your app by name instead of typing inline. |
template_id | Optional | Use a saved template by ID. |
campaign_name | Optional | A label for this send in your History tab. Defaults to "API: [list name]". |
pace_seconds | Optional | Send speed: 0 = as fast as possible, 7 = smart throttle (7–14s random delay, recommended), -1 = hold for your review. Defaults to your account setting. |
curl -X POST https://textyourlist.com/api/make/send-to-list \
-H "Authorization: Bearer tbk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"list_name": "April Leads",
"template_name": "Follow Up",
"pace_seconds": 7
}'curl -X POST https://textyourlist.com/api/make/send-to-list \
-H "Authorization: Bearer tbk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"list_name": "April Leads",
"template": "Hey {first_name}, just following up, let me know if you have questions!",
"campaign_name": "April Follow-Up",
"pace_seconds": 7
}'201{
"job_id": "abc123-...",
"campaign_name": "April Follow-Up",
"list": "April Leads",
"status": "queued",
"queued": 147,
"skipped_suppressed": 3,
"skipped_invalid": 1,
"skipped_duplicate": 0,
"note": "Job is queued and will send when the desktop app is open."
}status is queued (sending now) or api_pending (held for your review). Numbers on your suppression list, duplicate numbers, and invalid phone numbers are automatically skipped and counted in the response.
Not sure of the exact name of a list or template? These endpoints let any tool (including an AI agent) look them up before sending.
Returns all your saved contact lists: name, ID, contact count, and date created.
curl https://textyourlist.com/api/make/lists \ -H "Authorization: Bearer tbk_your_api_key"
[
{ "id": 12, "name": "April Leads", "row_count": 150, "created_at": "2026-04-01T..." },
{ "id": 11, "name": "VIP Clients", "row_count": 42, "created_at": "2026-03-15T..." }
]Returns all your saved message templates: name, ID, and a short preview of the content.
curl https://textyourlist.com/api/make/templates \ -H "Authorization: Bearer tbk_your_api_key"
[
{ "id": 5, "name": "Follow Up", "preview": "Hey {first_name}, just following up..." },
{ "id": 4, "name": "Event Reminder", "preview": "Don't forget, the event is tomorrow..." }
]How fast messages go out, and whether they need your approval first, is controlled by the API send behavior setting in your Account settings. You can also override this per-request using the pace_seconds field.
Sends immediately when the desktop app is open. Messages are only sent while you have the app open. Nothing goes out without the app running.
7 – 14 second randomized delay between sends when the app is open. Reduces carrier filtering risk on high-volume sends.
All API messages are always held as pending regardless of whether the app is open. When you open the app, you will be prompted to send now, keep holding, or cancel. Nothing goes out until you explicitly approve it.
You can configure this setting in the desktop app: Account → Api send behavior.
If you have both Mac and Windows desktops with Text Your List installed, you can control which one handles API sends.
| Setting | Behavior |
|---|---|
| Mac (default) | Only your Mac desktop picks up and sends API messages via Messages.app. |
| Windows | Only your Windows desktop picks up and sends via Phone Link. |
| Any | Whichever desktop polls first picks up the message (first-come-first-served). |
Set your preference in Account → Api send behavior → Send platform.
Numbers on the suppression list are automatically skipped in all bulk and API sends.
Returns all suppressed numbers for your account.
[
{ "phone": "+12125550100", "reason": "Opted out", "created_at": "2026-04-01T12:00:00Z" }
]Add a number to the suppression list.
| Field | Required | Description |
|---|---|---|
phone | Required | Phone number to suppress. |
reason | Optional | Free-text reason (e.g. "Opted out"). |
curl -X POST https://textyourlist.com/api/suppression \
-H "Authorization: Bearer tbk_your_key" \
-H "Content-Type: application/json" \
-d '{"phone": "+12125550100", "reason": "Opted out"}'Remove a number. URL-encode the phone number.
curl -X DELETE "https://textyourlist.com/api/suppression/%2B12125550100" \ -H "Authorization: Bearer tbk_your_key"
| Status | Meaning |
|---|---|
201 | Message queued successfully. |
400 | Missing required fields or invalid input. |
401 | Missing or invalid API key. |
402 | Monthly send limit reached. Upgrade your plan. |
403 | Pro plan required for /api/make/send. |
422 | Number is on your suppression list. Send was skipped. |
429 | Rate limit: max 120 requests per minute per API key. |
All error responses return JSON with an error field: {"error": "description"}
Connect Make to Text Your List using the HTTP module.
https://textyourlist.com/api/make/sendPOST.Authorization → Bearer tbk_your_api_keyContent-Type → application/jsonRaw and Content type to JSON (application/json).{"phone": "{{phone_variable}}", "message": "{{message_variable}}"}{{phone_variable}} and {{message_variable}} with your scenario data mappings. To attach an image, add "image_url": "{{image_url_variable}}" (omit the field entirely if you're not sending an image).
https://textyourlist.com/api/make/sendJSON.phone → map from your trigger data (e.g. a form field)message → your message text or a mapped variableAuthorization: Bearer tbk_your_api_key201 response.If you use an AI assistant like Claude, you can give it your API key and tell it to send texts in plain English. No coding or automation setup needed.
TYL_API_KEY.The agent handles everything. It knows to call the API, pass your key, and format the request correctly. You just tell it what to say and who to send it to.
If you're building something yourself or wiring up an agent framework, here's the minimum you need:
# Single send, works from any machine, no app required at call time
curl -X POST https://textyourlist.com/api/make/send \
-H "Authorization: Bearer $TYL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phone": "9085550142", "message": "Hey, just checking in!"}'
# List send, agent checks available lists first, then sends
curl https://textyourlist.com/api/make/lists \
-H "Authorization: Bearer $TYL_API_KEY"
curl -X POST https://textyourlist.com/api/make/send-to-list \
-H "Authorization: Bearer $TYL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"list_name": "April Leads", "template_name": "Follow Up", "pace_seconds": 7}'If you're integrating with an agent framework that uses tool/function calling (Claude API, OpenAI, etc.):
{
"name": "send_text",
"description": "Send a text message from the user's own phone number via Text Your List.",
"parameters": {
"type": "object",
"properties": {
"phone": { "type": "string", "description": "Recipient phone number (US format, e.g. +12125550100 or 9085550142)" },
"message": { "type": "string", "description": "Message body. Max 1600 characters." },
"image_url": { "type": "string", "description": "Optional. Public URL of an image to send as MMS (JPEG, PNG, GIF)." }
},
"required": ["phone", "message"]
}
}"status": "api_pending", the message is held. Either the desktop app was closed when the request arrived, or you have "Hold for review" turned on. Open the app and check the Jobs tab to release it.
Email us at [email protected] and we'll get back to you within one business day.