Textmagic Messages API
Send single or templated SMS messages, list and search sent messages, preview and price messages, upload attachments, and delete outbound messages.
Send single or templated SMS messages, list and search sent messages, preview and price messages, upload attachments, and delete outbound messages.
openapi: 3.0.1
info:
title: Textmagic REST API
description: >-
The Textmagic REST API (v2) provides programmatic access to the Textmagic
business text-messaging platform. Send and receive SMS, manage contacts and
lists, schedule and template messages, run two-way chats, and administer
sender IDs and dedicated numbers. All requests are authenticated with the
X-TM-Username and X-TM-Key headers.
termsOfService: https://www.textmagic.com/terms-of-service/
contact:
name: Textmagic Support
email: support@textmagic.com
url: https://docs.textmagic.com/
version: '2.0'
servers:
- url: https://rest.textmagic.com/api/v2
security:
- TmUsername: []
TmKey: []
tags:
- name: Messages
description: Send and manage outbound SMS messages.
- name: Replies
description: Retrieve and manage inbound messages.
- name: Bulk
description: Track bulk send sessions.
- name: Chats
description: Manage two-way conversations.
- name: Contacts
description: Manage contacts in the address book.
- name: Lists
description: Manage contact lists.
- name: Templates
description: Manage reusable message templates.
- name: Schedules
description: Manage scheduled (future-dated) messages.
- name: Sender IDs
description: Apply for and manage alphanumeric sender IDs.
- name: Numbers
description: Find and manage dedicated virtual numbers.
- name: Stats
description: Account, usage, and spending statistics.
paths:
/messages:
get:
operationId: getMessages
tags:
- Messages
summary: Get all outbound messages
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of outbound messages.
content:
application/json:
schema:
$ref: '#/components/schemas/MessageList'
post:
operationId: sendMessage
tags:
- Messages
summary: Send a message
description: >-
Send a new outbound message to one or more phone numbers, contacts,
or lists. Returns the created message or session identifiers.
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/SendMessageRequest'
application/json:
schema:
$ref: '#/components/schemas/SendMessageRequest'
responses:
'201':
description: The message was accepted for delivery.
content:
application/json:
schema:
$ref: '#/components/schemas/SendMessageResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/messages/{id}:
get:
operationId: getMessage
tags:
- Messages
summary: Get a single message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single outbound message.
content:
application/json:
schema:
$ref: '#/components/schemas/Message'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteMessage
tags:
- Messages
summary: Delete a message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The message was deleted.
'404':
$ref: '#/components/responses/NotFound'
/messages/search:
get:
operationId: searchMessages
tags:
- Messages
summary: Find messages by criteria
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
- name: query
in: query
schema:
type: string
description: Free-text search query.
responses:
'200':
description: Matching outbound messages.
content:
application/json:
schema:
$ref: '#/components/schemas/MessageList'
/messages/price/normalized:
get:
operationId: getMessagePrice
tags:
- Messages
summary: Check message price
parameters:
- name: text
in: query
schema:
type: string
description: Message body to be priced.
- name: phones
in: query
schema:
type: string
description: Comma-separated list of E.164 phone numbers.
responses:
'200':
description: Estimated price and part count for the message.
content:
application/json:
schema:
$ref: '#/components/schemas/MessagePrice'
/replies:
get:
operationId: getReplies
tags:
- Replies
summary: Get all inbound messages
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of inbound messages.
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyList'
/replies/{id}:
get:
operationId: getReply
tags:
- Replies
summary: Get a single inbound message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single inbound message.
content:
application/json:
schema:
$ref: '#/components/schemas/Reply'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteReply
tags:
- Replies
summary: Delete a single inbound message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The inbound message was deleted.
/bulks:
get:
operationId: getBulkSessions
tags:
- Bulk
summary: Get all bulk sessions
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of bulk sessions.
content:
application/json:
schema:
$ref: '#/components/schemas/BulkSessionList'
/bulks/{id}:
get:
operationId: getBulkSession
tags:
- Bulk
summary: Get bulk session status
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: Status of a single bulk session.
content:
application/json:
schema:
$ref: '#/components/schemas/BulkSession'
'404':
$ref: '#/components/responses/NotFound'
/chats:
get:
operationId: getChats
tags:
- Chats
summary: Get all chats
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of chats.
content:
application/json:
schema:
$ref: '#/components/schemas/ChatList'
/chats/{id}:
get:
operationId: getChat
tags:
- Chats
summary: Get a single chat
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single chat.
content:
application/json:
schema:
$ref: '#/components/schemas/Chat'
'404':
$ref: '#/components/responses/NotFound'
/chats/{id}/messages:
get:
operationId: getChatMessages
tags:
- Chats
summary: Get chat messages
parameters:
- $ref: '#/components/parameters/IdPath'
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: Messages within a chat.
content:
application/json:
schema:
$ref: '#/components/schemas/MessageList'
/chats/status:
post:
operationId: updateChatStatus
tags:
- Chats
summary: Change chat status
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ChatStatusRequest'
responses:
'204':
description: The chat status was updated.
/contacts:
get:
operationId: getContacts
tags:
- Contacts
summary: Get all contacts
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of contacts.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactList'
/contacts/normalized:
post:
operationId: createContact
tags:
- Contacts
summary: Add a new contact
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactRequest'
responses:
'201':
description: The created contact's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
'400':
$ref: '#/components/responses/BadRequest'
/contacts/{id}:
get:
operationId: getContact
tags:
- Contacts
summary: Get the details of a specific contact
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single contact.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteContact
tags:
- Contacts
summary: Delete a contact
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The contact was deleted.
/contacts/{id}/normalized:
put:
operationId: updateContact
tags:
- Contacts
summary: Edit a contact
parameters:
- $ref: '#/components/parameters/IdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactRequest'
responses:
'200':
description: The updated contact's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
/contacts/search:
get:
operationId: searchContacts
tags:
- Contacts
summary: Find contacts by given criteria
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
- name: query
in: query
schema:
type: string
responses:
'200':
description: Matching contacts.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactList'
/lists:
get:
operationId: getLists
tags:
- Lists
summary: Get all lists
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of contact lists.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactListList'
post:
operationId: createList
tags:
- Lists
summary: Create a new list
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ListRequest'
responses:
'201':
description: The created list's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
/lists/{id}:
get:
operationId: getList
tags:
- Lists
summary: Get the details of a specific list
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single contact list.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactListEntity'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateList
tags:
- Lists
summary: Edit a list
parameters:
- $ref: '#/components/parameters/IdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ListRequest'
responses:
'200':
description: The updated list's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
delete:
operationId: deleteList
tags:
- Lists
summary: Delete a list
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The list was deleted.
/lists/{id}/contacts:
get:
operationId: getListContacts
tags:
- Lists
summary: Get all contacts in a list
parameters:
- $ref: '#/components/parameters/IdPath'
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: Contacts that belong to the list.
content:
application/json:
schema:
$ref: '#/components/schemas/ContactList'
put:
operationId: assignContactsToList
tags:
- Lists
summary: Assign contacts to a list
parameters:
- $ref: '#/components/parameters/IdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ListContactsRequest'
responses:
'204':
description: Contacts were assigned to the list.
delete:
operationId: unassignContactsFromList
tags:
- Lists
summary: Unassign contacts from a list
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: Contacts were unassigned from the list.
/templates:
get:
operationId: getTemplates
tags:
- Templates
summary: Get all templates
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of templates.
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateList'
post:
operationId: createTemplate
tags:
- Templates
summary: Create a template
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateRequest'
responses:
'201':
description: The created template's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
/templates/{id}:
get:
operationId: getTemplate
tags:
- Templates
summary: Get a template's details
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single template.
content:
application/json:
schema:
$ref: '#/components/schemas/Template'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateTemplate
tags:
- Templates
summary: Update a template
parameters:
- $ref: '#/components/parameters/IdPath'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TemplateRequest'
responses:
'200':
description: The updated template's identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
delete:
operationId: deleteTemplate
tags:
- Templates
summary: Delete a template
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The template was deleted.
/schedules:
get:
operationId: getSchedules
tags:
- Schedules
summary: Get all scheduled messages
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of scheduled messages.
content:
application/json:
schema:
$ref: '#/components/schemas/ScheduleList'
/schedules/{id}:
get:
operationId: getSchedule
tags:
- Schedules
summary: Get a single scheduled message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single scheduled message.
content:
application/json:
schema:
$ref: '#/components/schemas/Schedule'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteSchedule
tags:
- Schedules
summary: Delete a single scheduled message
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The scheduled message was deleted.
/senderids:
get:
operationId: getSenderIds
tags:
- Sender IDs
summary: Get all your approved Sender IDs
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of sender IDs.
content:
application/json:
schema:
$ref: '#/components/schemas/SenderIdList'
post:
operationId: createSenderId
tags:
- Sender IDs
summary: Apply for a new Sender ID
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SenderIdRequest'
responses:
'201':
description: The sender ID application was submitted.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
/senderids/{id}:
get:
operationId: getSenderId
tags:
- Sender IDs
summary: Get the details of a specific Sender ID
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single sender ID.
content:
application/json:
schema:
$ref: '#/components/schemas/SenderId'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteSenderId
tags:
- Sender IDs
summary: Delete a Sender ID
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The sender ID was deleted.
/numbers:
get:
operationId: getNumbers
tags:
- Numbers
summary: Get all your dedicated numbers
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/Limit'
responses:
'200':
description: A paginated list of dedicated numbers.
content:
application/json:
schema:
$ref: '#/components/schemas/NumberList'
post:
operationId: buyNumber
tags:
- Numbers
summary: Buy a dedicated number
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BuyNumberRequest'
responses:
'201':
description: The dedicated number was purchased.
content:
application/json:
schema:
$ref: '#/components/schemas/ResourceLink'
/numbers/available:
get:
operationId: getAvailableNumbers
tags:
- Numbers
summary: Find dedicated numbers available for purchase
parameters:
- name: country
in: query
schema:
type: string
description: Two-letter ISO country code.
responses:
'200':
description: Available dedicated numbers.
content:
application/json:
schema:
$ref: '#/components/schemas/AvailableNumbers'
/numbers/{id}:
get:
operationId: getNumber
tags:
- Numbers
summary: Get the details of a specific dedicated number
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'200':
description: A single dedicated number.
content:
application/json:
schema:
$ref: '#/components/schemas/Number'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: cancelNumber
tags:
- Numbers
summary: Cancel a dedicated number subscription
parameters:
- $ref: '#/components/parameters/IdPath'
responses:
'204':
description: The dedicated number subscription was cancelled.
/user:
get:
operationId: getUser
tags:
- Stats
summary: Get current account information
responses:
'200':
description: The current account, including balance.
content:
application/json:
schema:
$ref: '#/components/schemas/User'
/stats/spending:
get:
operationId: getSpendingStats
tags:
- Stats
summary: Get spending statistics
parameters:
- name: start
in: query
schema:
type: integer
description: Start timestamp (Unix).
- name: end
in: query
schema:
type: integer
description: End timestamp (Unix).
responses:
'200':
description: Spending statistics for the requested period.
content:
application/json:
schema:
$ref: '#/components/schemas/SpendingStats'
/ping:
get:
operationId: ping
tags:
- Stats
summary: Ping
description: Health-check endpoint that confirms credentials are valid.
responses:
'200':
description: Service is reachable.
content:
application/json:
schema:
type: object
properties:
ping:
type: string
example: pong
components:
securitySchemes:
TmUsername:
type: apiKey
in: header
name: X-TM-Username
description: Your Textmagic account username.
TmKey:
type: apiKey
in: header
name: X-TM-Key
description: Your Textmagic API key, generated in the account settings.
parameters:
IdPath:
name: id
in: path
required: true
schema:
type: integer
description: The resource identifier.
Page:
name: page
in: query
schema:
type: integer
default: 1
description: Page number for pagination.
Limit:
name: limit
in: query
schema:
type: integer
default: 10
description: Number of items per page.
responses:
BadRequest:
description: The request was malformed.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Missing or invalid API credentials.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Error:
type: object
properties:
message:
type: string
code:
type: integer
errors:
type: object
ResourceLink:
type: object
properties:
id:
type: integer
href:
type: string
Pagination:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
SendMessageRequest:
type: object
properties:
text:
type: string
description: The message body.
phones:
type: string
description: Comma-separated list of E.164 phone numbers.
templateId:
type: integer
description: Optional template to use instead of text.
contacts:
type: string
description: Comma-separated list of contact IDs.
lists:
type: string
description: Comma-separated list of list IDs.
from:
type: string
description: Sender ID or dedicated number to send from.
sendingTime:
type: integer
description: Optional Unix timestamp to schedule the message.
required:
- text
SendMessageResponse:
type: object
properties:
id:
type: integer
href:
type: string
type:
type: string
description: Either "message", "session", or "scheduled".
sessionId:
type: integer
bulkId:
type: integer
messageId:
type: integer
scheduleId:
type: integer
Message:
type: object
properties:
id:
type: integer
receiver:
type: string
messageTime:
type: string
format: date-time
status:
type: string
text:
type: string
charset:
type: string
firstName:
type: string
lastName:
type: string
country:
type: string
sender:
type: string
price:
type: number
partsCount:
type: integer
MessageList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/Message'
MessagePrice:
type: object
properties:
total:
type: number
parts:
type: integer
countries:
type: object
Reply:
type: object
properties:
id:
type: integer
sender:
type: string
messageTime:
type: string
format: date-time
text:
type: string
receiver:
type: string
ReplyList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/Reply'
BulkSession:
type: object
properties:
id:
type: integer
status:
type: string
itemsProcessed:
type: integer
numbersCount:
type: integer
createdAt:
type: string
format: date-time
text:
type: string
BulkSessionList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/BulkSession'
Chat:
type: object
properties:
id:
type: integer
phone:
type: string
contact:
$ref: '#/components/schemas/Contact'
unread:
type: integer
status:
type: string
updatedAt:
type: string
format: date-time
ChatList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/Chat'
ChatStatusRequest:
type: object
properties:
ids:
type: string
description: Comma-separated list of chat IDs.
status:
type: string
description: Target status, e.g. open or closed.
required:
- ids
- status
Contact:
type: object
properties:
id:
type: integer
firstName:
type: string
lastName:
type: string
companyName:
type: string
phone:
type: string
email:
type: string
country:
$ref: '#/components/schemas/Country'
lists:
type: array
items:
$ref: '#/components/schemas/ContactListEntity'
blocked:
type: boolean
ContactRequest:
type: object
properties:
phone:
type: string
firstName:
type: string
lastName:
type: string
email:
type: string
companyName:
type: string
lists:
type: string
description: Comma-separated list of list IDs to assign the contact to.
required:
- phone
- lists
ContactList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/Contact'
Country:
type: object
properties:
id:
type: string
name:
type: string
ContactListEntity:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
membersCount:
type: integer
shared:
type: boolean
ContactListList:
type: object
properties:
page:
type: integer
limit:
type: integer
pageCount:
type: integer
resources:
type: array
items:
$ref: '#/components/schemas/ContactListEntity'
ListRequest:
type: object
properties:
name:
type: string
description:
type: string
shared:
type: boolean
required:
- name
ListContactsRequest:
type: object
properties:
contacts:
type: string
description: Comma-separated list of contact IDs.
required:
- contacts
Template:
type: object
properties:
id:
type: integer
name:
type: string
content:
type: string
lastModified:
type: string
format: date-time
TemplateRequest:
type: object
properties:
name:
type: string
content:
type: string
required:
- name
- content
Te
# --- truncated at 32 KB (35 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/textmagic/refs/heads/main/openapi/textmagic-openapi.yml