Skip to content

TOGETHER SMS · SMS API in Egypt

From a verification code to an order update. Your system sends it. Your customer gets the message.

Connect your app or store to an SMS API in Egypt. Turn business events into useful customer messages: a login code, an order confirmation, a reminder or a shipment update. Connect over HTTPS from your backend, with one balance for API and Bulk SMS.

  • OTP & notifications
  • Approved Sender ID
  • Inside Egypt
Your backend → SMS gateway → your customer. Illustration, not a delivery confirmation.

THE IDEA, CLEARLY

Your customer is waiting for the next step. Make it clear.

A service message puts important information within easy reach. Your system chooses the recipient, content and timing, then calls the gateway to send. Your application remains responsible for OTP generation, expiry and attempt limits.

BUILT AROUND YOUR BUSINESS

Practical uses. A message with a purpose.

01

Verification on request

Help customers complete signup or confirm access with a code requested in your app.

02

Order & payment updates

Send an order confirmation or the payment state already recorded in your system.

03

Shipping & delivery

Share a shipment update when your system records a status change, with a clear next step.

04

Appointments & renewals

Trigger visit reminders or subscription expiry notices from your application schedule.

FROM IDEA TO MESSAGE

Example: from order confirmation to customer reassurance

Once an order is confirmed in your store, the backend requests a short SMS update. Include the order reference and next step, and keep passwords and payment details out of the message.

TOGETHER SMS ● ● ●
Order 245 is confirmed. We will send an update when your shipment is ready. Thank you for choosing us.
Illustrative copy only. Final text and length are reviewed before execution.

A CLEAR START

From first enquiry to a considered launch.

1

Activate account & sender

We review the documents and complete Sender Name approval before branded sending.

2

Connect your backend

Your team stores credentials on the server and starts with a balance lookup.

3

Run a controlled test

Test on a number you own and review the response, units and observed delivery.

4

Connect business events

Connect the right events to messages; investigate unknown outcomes before resending.

KNOW THE COST

A clear starting cost. A package that fits your volume.

Activate your Sender Name once for Bulk SMS and the API, then choose your message balance. Sender activation and message usage are separate costs.

FIRST: SENDER NAME ACTIVATION

Your company name on the message

2,150 EGP

Excludes 14% VAT; total EGP 2,451.

  • Documents: Commercial Register and Tax Card.
  • Expected processing: 7–10 business days, subject to approval.
  • Sender Name: up to 11 English letters, digits or spaces, subject to approval.
Activate your company Sender Name and get 1,000 SMS free

Gift added after approval and activation under the offer, for API or Bulk SMS.

THEN: YOUR MESSAGE BALANCE

One balance. Two ways to send.

Use the same account balance through your API integration or the Bulk SMS dashboard. Minimum balance purchase: 1,000 units.

UnitsPrice · EGPPer unit
1,0002700.270
5,0001,3500.270
10,0002,6500.265
20,0005,2000.260
50,00012,7500.255
100,00025,0000.250
150,00036,7500.245

Prices exclude 14% VAT. Each message part per recipient uses one unit; length and encoding can change unit usage.

BEFORE YOU START

Answers that make the choice easier.

Do I need a developer?

Yes. A developer connects from your backend using an HTTP client. The guide includes cURL, PHP, Node.js, Python and C# examples. Use the Bulk SMS dashboard for campaigns without code.

Are API and Bulk SMS balances separate?

Both use one account balance. The 1,000-SMS gift is added after Sender Name approval and activation under the offer.

How do I estimate the required units?

Each message part per recipient consumes a unit. Check language and length before sending: up to 70 Arabic or 160 GSM-7 English characters for a single part; symbols and encoding can change the number of parts.

TOGETHER SMS

Have a system ready? Give it a clear path to messaging.

Share your application type, use case and estimated volume. We will review activation and a suitable package, and point your team to the integration guide.

START WITH A BALANCE CHECK

A clear path to your first integration.

1. Activate your account and sender

Complete onboarding and required business documents to obtain API credentials and an approved sender.

2. Connect from your backend

Store credentials securely on your server, then retrieve your account balance.

3. Test one controlled message

Use your own test device and approved sender; check acceptance, cost and observed delivery.

Endpoint for new integrations

https://togethersms.com/sendsms.php

For balance: send user, password and action=get. A valid response is numeric plain text and can contain decimals.

cURL / BALANCE
# 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.
Integrate from your backend only. Never embed the provider password in a browser or mobile app, or log a request URL containing it.

HTTP API REFERENCE

Parameters and responses, clearly defined.

SMS sending uses HTTPS GET with query parameters. This table applies to sending; action=get is reserved for balance retrieval.

ParameterRequired value
userAPI account username.
passwordAPI account password; store on your server.
numbersInternational digits, or a comma-separated list; no + or spaces.
senderYour approved, activated Sender ID.
messageUTF-8 text; URL-encode every query value once.
langen for English; ar for Arabic / Unicode.
SEND REQUEST / PLACEHOLDERS
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.com

Line breaks are for readability; the real request is one URL. Encode values with your HTTP library and use an authorized test recipient.

Validate the full response

Plain-text bodyMeaning and next step
1Request accepted; not proof of handset delivery.
1:201001234567Accepted with recipient list; validate the entire response.
0General rejection.
Invalid loginCheck your account credentials securely.
Missing or Empty FieldCheck all required fields.
Insufficient BalanceCheck available balance and required units.
Invalid SenderCheck the approved Sender ID.
Sender name is not activatedComplete Sender ID activation.
Invalid Message LanguageCheck lang and text encoding.
HTTP 200 alone does not prove acceptance. An unknown body or timeout is an unknown outcome; investigate before resending to prevent duplicates.

BACKEND EXAMPLES

Start with the language your team uses.

Balance examples load credentials from environment variables. This documentation page does not execute API requests.

cURL

cURL / BALANCE
# 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.

Node.js

Node.js / BALANCE
// 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

PHP / BALANCE
<?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');
}

Python

Python / BALANCE
# 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.

C# / .NET

C# / .NET / BALANCE
// 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");
}
Flutter and mobile apps: the app calls your backend, and your backend calls Together SMS. See the guide for credential protection and outcome handling.

DEVELOPER DOCUMENTATION / ENGLISH

A practical guide your team can keep.

Request and response reference, integration examples, failure handling and endpoint migration guidance.

PDF · v1.2 · 06 Nov 2026
Download API guide (English)
Already using the legacy endpoint?
https://sms.masrbokra.com/sendsms.php
Target migration date: 30 June 2027. Keep the same query parameters and test your credentials and responses before updating production. Follow our notices for the confirmed retirement plan.

Questions your team will ask.

Should credentials go inside a mobile app?

No. Flutter and web clients call your backend; only your backend stores SMS credentials and calls the gateway.

Does response 1 mean the SMS was delivered?

It means gateway acceptance. This contract does not document handset delivery confirmation or a delivery-report endpoint.

What if a send request times out?

Treat the outcome as unknown and investigate before resending. The gateway may already have accepted it; automatic retries can duplicate messages.

Does this API provide scheduling?

The supplied contract has no scheduling parameter. Your application can manage timing; dashboard features do not automatically imply corresponding API endpoints.

How many recipients can one request contain?

The contract supports comma-separated recipients. Confirm batch, URL-length and request-rate limits with our team before large campaigns.

Does the old endpoint stop immediately?

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

Have an application ready? Let’s connect it.

Tell us your use case so we can review sender activation and onboarding requirements.