Phone verification
Send verification codes; your application manages expiry and attempt limits.
TOGETHER SMS / DEVELOPERS
Connect your website or business system to SMS API in Egypt. Send branded verification messages, alerts and updates when events happen in your application.
GET /sendsms.php
?user=YOUR_USERNAME
&password=YOUR_PASSWORD
&action=get
Host: togethersms.comONE API. USEFUL CUSTOMER MOMENTS.
Choose an event in your application, prepare the right message, and let your backend call the SMS gateway.
Send verification codes; your application manages expiry and attempt limits.
Remind customers of due amounts, dates and next payment steps.
Turn order events into useful customer updates.
Send timely reminders for upcoming appointments.
Notify customers when loyalty balances or rewards change.
Send relevant follow-ups to recipients who opted in.
START WITH A BALANCE CHECK
Complete onboarding and required business documents to obtain API credentials and an approved sender.
Store credentials securely on your server, then retrieve your account balance.
Use your own test device and approved sender; check acceptance, cost and observed delivery.
https://togethersms.com/sendsms.phpFor balance: send user, password and action=get. A valid response is numeric plain text and can contain decimals.
# Run on your server; load secrets from your environment.
curl --get 'https://togethersms.com/sendsms.php' \
--connect-timeout 10 --max-time 20 \
--data-urlencode "user=${TOGETHER_SMS_USER}" \
--data-urlencode "password=${TOGETHER_SMS_PASSWORD}" \
--data-urlencode 'action=get'
# Sending is a separate request. Use an approved test recipient.
# Add numbers, sender, message and lang; omit action=get.HTTP API REFERENCE
SMS sending uses HTTPS GET with query parameters. This table applies to sending; action=get is reserved for balance retrieval.
| Parameter | Required value |
|---|---|
user | API account username. |
password | API account password; store on your server. |
numbers | International digits, or a comma-separated list; no + or spaces. |
sender | Your approved, activated Sender ID. |
message | UTF-8 text; URL-encode every query value once. |
lang | en for English; ar for Arabic / Unicode. |
GET /sendsms.php?user=YOUR_USERNAME&password=YOUR_PASSWORD
&numbers=YOUR_AUTHORIZED_TEST_NUMBER
&sender=YOUR_APPROVED_SENDER
&message=Your%20order%20is%20ready&lang=en
Host: togethersms.comLine breaks are for readability; the real request is one URL. Encode values with your HTTP library and use an authorized test recipient.
| Plain-text body | Meaning and next step |
|---|---|
1 | Request accepted; not proof of handset delivery. |
1:201001234567 | Accepted with recipient list; validate the entire response. |
0 | General rejection. |
Invalid login | Check your account credentials securely. |
Missing or Empty Field | Check all required fields. |
Insufficient Balance | Check available balance and required units. |
Invalid Sender | Check the approved Sender ID. |
Sender name is not activated | Complete Sender ID activation. |
Invalid Message Language | Check lang and text encoding. |
BACKEND EXAMPLES
Balance examples load credentials from environment variables. This documentation page does not execute API requests.
# Run on your server; load secrets from your environment.
curl --get 'https://togethersms.com/sendsms.php' \
--connect-timeout 10 --max-time 20 \
--data-urlencode "user=${TOGETHER_SMS_USER}" \
--data-urlencode "password=${TOGETHER_SMS_PASSWORD}" \
--data-urlencode 'action=get'
# Sending is a separate request. Use an approved test recipient.
# Add numbers, sender, message and lang; omit action=get.// Backend only. Never expose provider credentials in a browser.
const query = new URLSearchParams({
user: process.env.TOGETHER_SMS_USER,
password: process.env.TOGETHER_SMS_PASSWORD,
action: 'get'
});
const response = await fetch(
'https://togethersms.com/sendsms.php?' + query,
{ redirect: 'error', signal: AbortSignal.timeout(20000) }
);
const body = (await response.text()).trim();
if (!response.ok || !/^[0-9]+(?:\.[0-9]+)?$/.test(body)) {
throw new Error('Balance request was not accepted');
}
// Keep decimal precision; do not log the request URL.<?php
// Backend only. Secrets come from your deployment environment.
$query = http_build_query(array(
'user' => getenv('TOGETHER_SMS_USER'),
'password' => getenv('TOGETHER_SMS_PASSWORD'),
'action' => 'get'
), '', '&', PHP_QUERY_RFC3986);
$ch = curl_init('https://togethersms.com/sendsms.php?' . $query);
curl_setopt_array($ch, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false,
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_TIMEOUT => 20
));
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($body === false || $status < 200 || $status >= 300 ||
!preg_match('/\A[0-9]+(?:\.[0-9]+)?\z/', trim($body))) {
throw new RuntimeException('Balance request was not accepted');
}# Backend only. Requires the requests package.
import os
import re
import requests
response = requests.get(
'https://togethersms.com/sendsms.php',
params={
'user': os.environ['TOGETHER_SMS_USER'],
'password': os.environ['TOGETHER_SMS_PASSWORD'],
'action': 'get'
},
timeout=(10, 20),
allow_redirects=False
)
body = response.text.strip()
if not (200 <= response.status_code < 300 and
re.fullmatch(r'[0-9]+(?:\.[0-9]+)?', body)):
raise RuntimeError('Balance request was not accepted')
# Timeout values are connect/read timeouts, not a strict total deadline.// Backend only. Use a supported .NET runtime.
using var handler = new HttpClientHandler { AllowAutoRedirect = false };
using var client = new HttpClient(handler) {
Timeout = TimeSpan.FromSeconds(20)
};
string user = Environment.GetEnvironmentVariable("TOGETHER_SMS_USER")!;
string password = Environment.GetEnvironmentVariable("TOGETHER_SMS_PASSWORD")!;
string url = "https://togethersms.com/sendsms.php?user=" +
Uri.EscapeDataString(user) + "&password=" +
Uri.EscapeDataString(password) + "&action=get";
using var response = await client.GetAsync(url);
string body = (await response.Content.ReadAsStringAsync()).Trim();
if (!response.IsSuccessStatusCode ||
!System.Text.RegularExpressions.Regex.IsMatch(
body, @"\A[0-9]+(?:\.[0-9]+)?\z")) {
throw new InvalidOperationException("Balance request was not accepted");
}DEVELOPER DOCUMENTATION / ENGLISH
Request and response reference, integration examples, failure handling and endpoint migration guidance.
PDF · v1.2 · 06 Nov 2026No. Flutter and web clients call your backend; only your backend stores SMS credentials and calls the gateway.
It means gateway acceptance. This contract does not document handset delivery confirmation or a delivery-report endpoint.
Treat the outcome as unknown and investigate before resending. The gateway may already have accepted it; automatic retries can duplicate messages.
The supplied contract has no scheduling parameter. Your application can manage timing; dashboard features do not automatically imply corresponding API endpoints.
The contract supports comma-separated recipients. Confirm batch, URL-length and request-rate limits with our team before large campaigns.
No. The target migration date is 30 June 2027. Test the new endpoint and follow our migration notices before changing production.
LET'S CONNECT YOUR BUSINESS
Tell us your use case so we can review sender activation and onboarding requirements.