curl --request POST \
--url https://api.torpedo.co.mz/api/v1/sms \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"to": "+258841234567",
"body": "Your verification code is 482910. Expires in 10 minutes.",
"from": "Torpedo"
}
'import requests
url = "https://api.torpedo.co.mz/api/v1/sms"
payload = {
"to": "+258841234567",
"body": "Your verification code is 482910. Expires in 10 minutes.",
"from": "Torpedo"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
to: '+258841234567',
body: JSON.stringify('Your verification code is 482910. Expires in 10 minutes.'),
from: 'Torpedo'
})
};
fetch('https://api.torpedo.co.mz/api/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.torpedo.co.mz/api/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([
'to' => '+258841234567',
'body' => 'Your verification code is 482910. Expires in 10 minutes.',
'from' => 'Torpedo'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.torpedo.co.mz/api/v1/sms"
payload := strings.NewReader("{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.torpedo.co.mz/api/v1/sms")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.torpedo.co.mz/api/v1/sms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
}
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}Send SMS
Queues an SMS message for delivery via SMPP. Returns 202 Accepted immediately —
delivery is asynchronous. Requires a paid plan and available SMS credits.
The to field must be a Mozambican mobile number in E.164 format (+258XXXXXXXXX).
curl --request POST \
--url https://api.torpedo.co.mz/api/v1/sms \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"to": "+258841234567",
"body": "Your verification code is 482910. Expires in 10 minutes.",
"from": "Torpedo"
}
'import requests
url = "https://api.torpedo.co.mz/api/v1/sms"
payload = {
"to": "+258841234567",
"body": "Your verification code is 482910. Expires in 10 minutes.",
"from": "Torpedo"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
to: '+258841234567',
body: JSON.stringify('Your verification code is 482910. Expires in 10 minutes.'),
from: 'Torpedo'
})
};
fetch('https://api.torpedo.co.mz/api/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.torpedo.co.mz/api/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([
'to' => '+258841234567',
'body' => 'Your verification code is 482910. Expires in 10 minutes.',
'from' => 'Torpedo'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.torpedo.co.mz/api/v1/sms"
payload := strings.NewReader("{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.torpedo.co.mz/api/v1/sms")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.torpedo.co.mz/api/v1/sms")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"to\": \"+258841234567\",\n \"body\": \"Your verification code is 482910. Expires in 10 minutes.\",\n \"from\": \"Torpedo\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"status": "queued"
}
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}{
"errors": [
{
"code": "VALIDATION_ERROR",
"message": "Domain not verified",
"field": "from"
}
]
}Authorizations
Prefix tor_ followed by a base64url-encoded random key.
Create and manage API keys from the authenticated Torpedo dashboard.
Headers
Unique key for replaying the original accepted response without sending again. Leading and trailing whitespace is removed; only the first 255 characters are retained.
Body
Recipient phone number in E.164 format (Mozambican numbers only)
^\+2588[234567]\d{7}$"+258841234567"
Message text
1 - 1600"Your verification code is 482910. Expires in 10 minutes."
Optional sender ID assigned to the workspace.
20"Torpedo"
Response
Message queued
Show child attributes
Show child attributes