Developer API

Send SMS, check balances, and manage campaigns programmatically. Integrate bulk messaging into your apps in minutes.

RESTful
JSON endpoints
Secure
API key auth
Instant
Real-time
10 Languages
Any stack
cURL
# Check Balance
curl "https://sms.palnode.com/api/?action=balance&api_key=your_api_key_here"

# Send SMS
curl -X POST "https://sms.palnode.com/api/?action=send" \
  -H "Content-Type: application/json" \
  -H "Authorization: your_api_key_here" \
  -d '{"phone": "256700111111", "message": "Hello from cURL!"}'
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
PHP
// Check Balance
$apiKey = 'your_api_key_here';
$baseUrl = 'https://sms.palnode.com/api';

$ch = curl_init($baseUrl . '/?action=balance&api_key=' . $apiKey);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo "Balance: " . $data['currency'] . " " . $data['balance'];

// Send SMS
$payload = json_encode([
    'phone'   => '256700111111',
    'message' => 'Hello from PHP!',
]);
$ch = curl_init($baseUrl . '/?action=send');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Authorization: ' . $apiKey,
    ],
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Python
# Check Balance
import requests

API_KEY = 'your_api_key_here'
response = requests.get(
    'https://sms.palnode.com/api/?action=balance',
    params={'api_key': API_KEY}
)
data = response.json()
print(f"Balance: {data['currency']} {data['balance']}")

# Send SMS
payload = {
    'phone': '256700111111',
    'message': 'Hello from Python!'
}
headers = {
    'Content-Type': 'application/json',
    'Authorization': API_KEY
}
response = requests.post(
    'https://sms.palnode.com/api/?action=send',
    json=payload, headers=headers
)
result = response.json()
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Node.js
// Check Balance
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://sms.palnode.com/api';

const balanceRes = await fetch(
  `${BASE_URL}/?action=balance&api_key=${API_KEY}`
);
const balance = await balanceRes.json();
console.log(`Balance: ${balance.currency} ${balance.balance}`);

// Send SMS
const sendRes = await fetch(`${BASE_URL}/?action=send`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': API_KEY,
  },
  body: JSON.stringify({
    phone: '256700111111',
    message: 'Hello from Node.js!',
  }),
});
const result = await sendRes.json();
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Java
// Check Balance
import java.net.URI;
import java.net.http.*;

String apiKey = "your_api_key_here";
HttpClient client = HttpClient.newHttpClient();

HttpRequest req = HttpRequest.newBuilder()
    .uri(URI.create("https://sms.palnode.com/api/?action=balance&api_key=" + apiKey))
    .GET()
    .build();
HttpResponse<String> res = client.send(req,
    HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());

// Send SMS
String json = """
    {"phone": "256700111111", "message": "Hello from Java!"}
    """.stripIndent();
req = HttpRequest.newBuilder()
    .uri(URI.create("https://sms.palnode.com/api/?action=send"))
    .header("Content-Type", "application/json")
    .header("Authorization", apiKey)
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();
res = client.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Ruby
# Check Balance
require 'net/http'
require 'json'

api_key = 'your_api_key_here'
uri = URI("https://sms.palnode.com/api/?action=balance&api_key=#{api_key}")
response = Net::HTTP.get(uri)
data = JSON.parse(response)
puts "Balance: #{data['currency']} #{data['balance']}"

# Send SMS
uri = URI("https://sms.palnode.com/api/?action=send")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
req = Net::HTTP::Post.new(uri)
req['Content-Type'] = 'application/json'
req['Authorization'] = api_key
req.body = JSON.generate({
    phone: '256700111111',
    message: 'Hello from Ruby!'
})
res = http.request(req)
puts res.body
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Go
// Check Balance
package main
import ("bytes";"encoding/json";"fmt";"io";"net/http")
func main() {
    apiKey := "your_api_key_here"
    url := "https://sms.palnode.com/api/?action=balance&api_key=" + apiKey
    resp, err := http.Get(url)
    if err != nil { panic(err) }
    defer resp.Body.Close()
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}

// Send SMS
// (reuse apiKey from above)
payload, _ := json.Marshal(map[string]string{
    "phone":   "256700111111",
    "message": "Hello from Go!",
})
req, _ := http.NewRequest("POST",
    "https://sms.palnode.com/api/?action=send",
    bytes.NewBuffer(payload))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", apiKey)
client := &http.Client{}
resp, _ = client.Do(req)
defer resp.Body.Close()
body, _ = io.ReadAll(resp.Body)
fmt.Println(string(body))
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
C#
// Check Balance
using System.Net.Http;

var apiKey = "your_api_key_here";
var client = new HttpClient();

var balRes = await client.GetAsync(
    "https://sms.palnode.com/api/?action=balance&api_key=" + apiKey);
var balBody = await balRes.Content.ReadAsStringAsync();
Console.WriteLine(balBody);

// Send SMS
var payload = new StringContent(
    @"{""phone"":""256700111111"",""message"":""Hello from C#!""}",
    Encoding.UTF8, "application/json");
payload.Headers.Add("Authorization", apiKey);

var sendRes = await client.PostAsync(
    "https://sms.palnode.com/api/?action=send", payload);
var sendBody = await sendRes.Content.ReadAsStringAsync();
Console.WriteLine(sendBody);
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
Dart
// Check Balance
import 'dart:convert';
import 'package:http/http.dart' as http;

final apiKey = 'your_api_key_here';
final baseUrl = Uri.parse('https://sms.palnode.com/api');

final balUri = baseUrl.replace(queryParameters: {
  'action': 'balance', 'api_key': apiKey
});
final balRes = await http.get(balUri);
final balData = jsonDecode(balRes.body);
print('Balance: ${balData['currency']} ${balData['balance']}');

// Send SMS
final sendRes = await http.post(
  Uri.parse('https://sms.palnode.com/api/?action=send'),
  headers: {
    'Content-Type': 'application/json',
    'Authorization': apiKey,
  },
  body: jsonEncode({
    'phone': '256700111111',
    'message': 'Hello from Dart!',
  }),
);
final result = jsonDecode(sendRes.body);
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}
HTTP
# Check Balance
GET https://sms.palnode.com/api/?action=balance&api_key=your_api_key_here

# Send SMS
POST https://sms.palnode.com/api/?action=send
Content-Type: application/json
Authorization: your_api_key_here

{"phone": "256700111111", "message": "Hello from HTTP!"}
GET /api/?action=balance

Returns your wallet balance and currency.

{
"status": "success",
"balance": 50000.00,
"currency": "UGX"
}
POST /api/?action=send

Send an SMS. The message is queued and sent by the system.

Request Body:
{
"phone": "256700111111",
"message": "Your message here"
}
Response:
{
"status": "success",
"message": "SMS queued",
"data": {
  "campaign_id": 42,
  "sms_count": 1,
  "cost": 10.00,
  "balance": 49990.00
}
}

Error Codes

CodeMeaning
400Bad request — missing or invalid parameters
401Unauthorized — missing or invalid API key
402Insufficient balance
405Method not allowed
500Internal server error

Ready to Start?

Create an account to get your API key and start sending in minutes.

Get Your API Key