Prerequisites
- A Telnyx account
- Your Telnyx API key
- An SMS-capable phone number in Telnyx
Setup
1
Create a Telnyx API key
In Telnyx, open API keys and create a key.
2
Configure in Courier
Open the in Courier, enter your API key and originating phone number, then click “Save.”
Overrides
covers the two levels and which one wins. Overrides change the request body Courier sends to Telnyx. You can override any field the outgoing call supports:const { requestId } = await courier.send.message({
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {
phone_number: "+15551734686",
},
data: {
name: "Sarah Bennett",
},
providers: {
telnyx: {
override: {
body: {
text: "Override message text",
to: "+17777777777",
},
config: {
apiKey: "<your API Key>",
from: "+15555555555",
url: "<alternate url>",
},
},
},
},
},
});
response = client.send.message(
message={
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {
"phone_number": "+15551734686",
},
"data": {
"name": "Sarah Bennett",
},
"providers": {
"telnyx": {
"override": {
"body": {
"text": "Override message text",
"to": "+17777777777",
},
"config": {
"apiKey": "<your API Key>",
"from": "+15555555555",
"url": "<alternate url>",
},
},
},
},
},
)
curl -X POST https://api.courier.com/send \
-H "Authorization: Bearer $COURIER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message": {
"template": "nt_01kx4h2jdafq8bk9aftxak4b40",
"to": {
"phone_number": "+15551734686"
},
"data": {
"name": "Sarah Bennett"
},
"providers": {
"telnyx": {
"override": {
"body": {
"text": "Override message text",
"to": "+17777777777"
},
"config": {
"apiKey": "<your API Key>",
"from": "+15555555555",
"url": "<alternate url>"
}
}
}
}
}
}'
response = courier.send_.message(
message: {
template: "nt_01kx4h2jdafq8bk9aftxak4b40",
to: {
phone_number: "+15551734686"
},
data: {
name: "Sarah Bennett"
},
providers: {
telnyx: {
override: {
body: {
text: "Override message text",
to: "+17777777777"
},
config: {
apiKey: "<your API Key>",
from: "+15555555555",
url: "<alternate url>"
}
}
}
}
}
)
response, err := client.Send.Message(context.TODO(), courier.SendMessageParams{
Message: courier.SendMessageParamsMessage{
To: courier.SendMessageParamsMessageToUnion{
OfUserRecipient: &shared.UserRecipientParam{
PhoneNumber: courier.String("+15551734686"),
},
},
Template: courier.String("nt_01kx4h2jdafq8bk9aftxak4b40"),
Data: map[string]any{
"name": "Sarah Bennett",
},
Providers: shared.MessageProvidersParam{
"telnyx": shared.MessageProvidersTypeParam{
Override: map[string]any{
"body": map[string]any{
"text": "Override message text",
"to": "+17777777777",
},
"config": map[string]any{
"apiKey": "<your API Key>",
"from": "+15555555555",
"url": "<alternate url>",
},
},
},
},
},
})
SendMessageParams params = SendMessageParams.builder()
.message(SendMessageParams.Message.builder()
.to(UserRecipient.builder().phoneNumber("+15551734686").build())
.template("nt_01kx4h2jdafq8bk9aftxak4b40")
.data(JsonValue.from(java.util.Map.of(
"name", "Sarah Bennett"
)))
.providers(MessageProviders.builder()
.putAdditionalProperty("telnyx", JsonValue.from(java.util.Map.of("override", java.util.Map.of(
"body", java.util.Map.of(
"text", "Override message text",
"to", "+17777777777"
),
"config", java.util.Map.of(
"apiKey", "<your API Key>",
"from", "+15555555555",
"url", "<alternate url>"
)
))))
.build())
.build())
.build();
SendMessageResponse response = client.send().message(params);
$response = $client->send->message(
message: [
'template' => 'nt_01kx4h2jdafq8bk9aftxak4b40',
'to' => [
'phone_number' => '+15551734686',
],
'data' => [
'name' => 'Sarah Bennett',
],
'providers' => [
'telnyx' => [
'override' => [
'body' => [
'text' => 'Override message text',
'to' => '+17777777777',
],
'config' => [
'apiKey' => '<your API Key>',
'from' => '+15555555555',
'url' => '<alternate url>',
],
],
],
],
],
);
SendMessageParams parameters = new()
{
Message = new()
{
To = new UserRecipient { PhoneNumber = "+15551734686" },
Template = "nt_01kx4h2jdafq8bk9aftxak4b40",
Data = new Dictionary<string, JsonElement>()
{
{ "name", JsonSerializer.SerializeToElement("Sarah Bennett") },
},
Providers = new Dictionary<string, MessageProvidersType>()
{
{
"telnyx",
new()
{
Override = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(
"""
{
"body": {
"text": "Override message text",
"to": "+17777777777"
},
"config": {
"apiKey": "<your API Key>",
"from": "+15555555555",
"url": "<alternate url>"
}
}
"""
),
}
},
},
},
};
var response = await client.Send.Message(parameters);
courier send message \
--api-key "$COURIER_API_KEY" \
--message.to '{"phone_number": "+15551734686"}' \
--message.template nt_01kx4h2jdafq8bk9aftxak4b40 \
--message.data '{"name": "Sarah Bennett"}' \
--message.providers '{"telnyx": {"override": {"body": {"text": "Override message text", "to": "+17777777777"}, "config": {"apiKey": "<your API Key>", "from": "+15555555555", "url": "<alternate url>"}}}}'
With Courier MCP, send my template to +15551734686 through Telnyx with the body overridden.
override.headers and override.config.url are honored too. The full field list is in the Telnyx Messaging API docs.
Provider details
telnyx
routing.channels instead is supported, and sends through just this provider.
Send to a specific provider
When that is worth doing, and what you give up: failover, channel priority, and providers you add later.