Messaging API
Send messages on any supported channel, retrieve delivery status, retry failed sends, and manage reusable templates. Base path:/v1/messages
Send SMS
POST /v1/messages/sms
Send an SMS message to a single recipient.
string
required
Recipient phone number in E.164 format (e.g.,
+14155552671)string
required
The text content of the SMS (max 1600 characters; automatically segmented)
string
URL to receive delivery status callbacks for this message
object
Arbitrary key-value pairs attached to the message for your reference
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/sms" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/sms', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/sms", headers=headers, json={
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/sms", bytes.NewBuffer([]byte(`{
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/sms')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/sms');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"to": "+14155552671",
"body": "Your verification code is 123456",
"webhook_url": "https://example.com/webhooks/sms",
"metadata": {
"campaign": "onboarding"
}
}
JSON);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_abc123",
"channel": "sms",
"to": "+14155552671",
"status": "queued",
"created_at": "2026-03-08T12:00:00Z"
},
"meta": {
"request_id": "req_xyz789",
"timestamp": "2026-03-08T12:00:00Z"
}
}
Send WhatsApp Message
POST /v1/messages/whatsapp
Send a WhatsApp message — free-form text, a pre-approved template, or media.
string
required
Recipient phone number in E.164 format
object
Pre-approved WhatsApp template (use instead of
text for business-initiated conversations)Show child attributes
Show child attributes
string
required
Registered template name
object
Media attachment
Show child attributes
Show child attributes
string
required
Publicly accessible URL to the media file
object
Arbitrary key-value pairs attached to the message
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/whatsapp" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/whatsapp', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/whatsapp", headers=headers, json={
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/whatsapp", bytes.NewBuffer([]byte(`{
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/whatsapp')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/whatsapp');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"to": "+905551234567",
"text": {
"body": "Hello from Orbit!"
}
}
JSON);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_wa_456",
"channel": "whatsapp",
"to": "+905551234567",
"status": "queued",
"created_at": "2026-03-08T12:00:00Z"
},
"meta": {
"request_id": "req_abc456",
"timestamp": "2026-03-08T12:00:00Z"
}
}
Send Email
POST /v1/messages/email
Send a transactional email.
string | string[]
required
Recipient email address or array of addresses
string
required
Email subject line
string
HTML body of the email (provide
html or text, or both)string
Plain-text body of the email
object
Arbitrary key-value pairs attached to the message
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/email" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/email', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/email", headers=headers, json={
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/email", bytes.NewBuffer([]byte(`{
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/email')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/email');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"to": "user@example.com",
"subject": "Welcome to Orbit",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}
JSON);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_em_789",
"channel": "email",
"to": "user@example.com",
"status": "queued",
"created_at": "2026-03-08T12:00:00Z"
},
"meta": {
"request_id": "req_em_101",
"timestamp": "2026-03-08T12:00:00Z"
}
}
Send RCS / Viber Message
POST /v1/messages/rcs | POST /v1/messages/viber
Send a message on the RCS or Viber channel. Both use the same generic payload.
string
required
Recipient phone number in E.164 format
string
required
Message text content
object
Arbitrary key-value pairs attached to the message
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/rcs" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"to": "+14155552671",
"body": "Your order has shipped!"
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/rcs', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"to": "+14155552671",
"body": "Your order has shipped!"
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/rcs", headers=headers, json={
"to": "+14155552671",
"body": "Your order has shipped!"
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/rcs", bytes.NewBuffer([]byte(`{
"to": "+14155552671",
"body": "Your order has shipped!"
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/rcs')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"to": "+14155552671",
"body": "Your order has shipped!"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/rcs');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"to": "+14155552671",
"body": "Your order has shipped!"
}
JSON);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_rcs_321",
"channel": "rcs",
"to": "+14155552671",
"status": "queued",
"created_at": "2026-03-08T12:00:00Z"
},
"meta": {
"request_id": "req_rcs_555",
"timestamp": "2026-03-08T12:00:00Z"
}
}
List Messages
GET /v1/messages
Retrieve a paginated list of sent messages with optional filters.
string
Cursor for pagination (returned in previous response)
integer
default:"20"
Number of results per page (max 100)
string
Filter by channel:
sms, whatsapp, rcs, viber, emailstring
Filter by status:
queued, sent, delivered, failed, readstring
Filter by recipient (exact match)
cURL
curl -X GET "https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10" \
-H "X-API-Key: dv_live_sk_your_key_here"
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10', {
method: 'GET',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
},
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
r = requests.get("https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10", headers=headers)
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10", nil)
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10')
req = Net::HTTP::Get.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages?channel=sms&status=delivered&limit=10');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
]);
echo curl_exec($ch);
{
"data": [
{
"message_id": "msg_001",
"channel": "sms",
"to": "+14155552671",
"status": "delivered",
"created_at": "2026-03-08T11:00:00Z"
}
],
"meta": {
"request_id": "req_list_001",
"timestamp": "2026-03-08T12:00:00Z",
"pagination": {
"cursor": "cur_msg_abc",
"has_more": true,
"total": 1542
}
}
}
Get Message
GET /v1/messages/{id}
Retrieve details of a single message, including delivery status and timestamps.
string
required
Message ID (e.g.,
msg_abc123)cURL
curl -X GET "https://orbit-api.devotel.io/api/v1/messages/msg_abc123" \
-H "X-API-Key: dv_live_sk_your_key_here"
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/msg_abc123', {
method: 'GET',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
},
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
r = requests.get("https://orbit-api.devotel.io/api/v1/messages/msg_abc123", headers=headers)
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://orbit-api.devotel.io/api/v1/messages/msg_abc123", nil)
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/msg_abc123')
req = Net::HTTP::Get.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/msg_abc123');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
]);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_abc123",
"channel": "sms",
"to": "+14155552671",
"body": "Your verification code is 123456",
"status": "delivered",
"created_at": "2026-03-08T12:00:00Z",
"delivered_at": "2026-03-08T12:00:03Z"
},
"meta": {
"request_id": "req_get_001",
"timestamp": "2026-03-08T12:01:00Z"
}
}
Retry Message
POST /v1/messages/{id}/retry
Re-send a message that previously failed. The original message parameters are reused.
string
required
ID of the failed message to retry
cURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry", headers=headers, json={})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry", bytes.NewBuffer([]byte(`{}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/msg_fail_001/retry');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{}
JSON);
echo curl_exec($ch);
{
"data": {
"message_id": "msg_retry_002",
"original_message_id": "msg_fail_001",
"status": "queued",
"created_at": "2026-03-08T12:05:00Z"
},
"meta": {
"request_id": "req_retry_001",
"timestamp": "2026-03-08T12:05:00Z"
}
}
Templates
List Templates
GET /v1/messages/templates
Retrieve all message templates with cursor-based pagination.
string
Cursor for pagination
integer
default:"20"
Number of results per page (max 100)
cURL
curl -X GET "https://orbit-api.devotel.io/api/v1/messages/templates?limit=10" \
-H "X-API-Key: dv_live_sk_your_key_here"
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/templates?limit=10', {
method: 'GET',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
},
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
r = requests.get("https://orbit-api.devotel.io/api/v1/messages/templates?limit=10", headers=headers)
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("GET", "https://orbit-api.devotel.io/api/v1/messages/templates?limit=10", nil)
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/templates?limit=10')
req = Net::HTTP::Get.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/templates?limit=10');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
]);
echo curl_exec($ch);
Create Template
POST /v1/messages/templates
Create a new message template for a given channel.
string
required
Channel the template is for:
sms, whatsapp, rcs, viber, emailstring
required
Template name (unique per channel)
string
required
Template body content — use
{{variable_name}} for dynamic placeholdersstring
Template category (e.g.,
marketing, transactional, otp)string
Language code (e.g.,
en, tr, ar)array
List of variable definitions used in the template content
string
Initial status:
draft or pending_approvalcURL
curl -X POST "https://orbit-api.devotel.io/api/v1/messages/templates" \
-H "X-API-Key: dv_live_sk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
}'
Node.js
import { Orbit } from '@devotel/orbit-sdk'
const orbit = new Orbit({
apiKey: process.env.ORBIT_API_KEY!,
})
const res = await fetch('https://orbit-api.devotel.io/api/v1/messages/templates', {
method: 'POST',
headers: {
'X-API-Key': process.env.ORBIT_API_KEY!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
}),
})
console.log(await res.json())
Python
import os, requests
headers = {"X-API-Key": os.environ["ORBIT_API_KEY"]}
headers["Content-Type"] = "application/json"
r = requests.post("https://orbit-api.devotel.io/api/v1/messages/templates", headers=headers, json={
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
})
print(r.json())
Go
package main
import (
"bytes"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST", "https://orbit-api.devotel.io/api/v1/messages/templates", bytes.NewBuffer([]byte(`{
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
}`)))
req.Header.Set("X-API-Key", os.Getenv("ORBIT_API_KEY"))
req.Header.Set("Content-Type", "application/json")
http.DefaultClient.Do(req)
}
Ruby
require 'net/http'
require 'json'
uri = URI('https://orbit-api.devotel.io/api/v1/messages/templates')
req = Net::HTTP::Post.new(uri)
req['X-API-Key'] = ENV['ORBIT_API_KEY']
req['Content-Type'] = 'application/json'
req.body = {
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
}.to_json
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.body
PHP
<?php
$ch = curl_init('https://orbit-api.devotel.io/api/v1/messages/templates');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'X-API-Key: ' . getenv('ORBIT_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, <<<JSON
{
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en"
}
JSON);
echo curl_exec($ch);
{
"data": {
"id": "tpl_abc123",
"channel": "whatsapp",
"name": "order_confirmation",
"content": "Hi {{customer_name}}, your order #{{order_id}} has been confirmed.",
"category": "transactional",
"language": "en",
"status": "pending_approval",
"created_at": "2026-03-08T12:00:00Z"
},
"meta": {
"request_id": "req_tpl_001",
"timestamp": "2026-03-08T12:00:00Z"
}
}
Delete Template
DELETE /v1/messages/templates/{id}
Permanently delete a message template.
string
required
Template ID
204 No Content