SDK et bibliothèques
Conçu pour les développeurs.
Utilisez nos bibliothèques pour une intégration plus rapide
Installation
The simplest way to install the library is to get it from PyPi using pip, which is a Python package manager. Just type this into the terminal:
pip install smscx-client
Requirements
Python >=3.6
After installation, import the package:
import smscx_client
Authentication
To use the library you must authenticate. SMS.CX Python Library supports the same authentication methods as those supported by the SMS Connexion API:
Handling errors
The SMS.CX Python library raises an exception for every error type. It is recommended to catch and handle exceptions.
To catch an exception, use Python’s try/except syntax. SMS Connexion provides many exception classes you can catch. Each one represents a different kind of error. When you catch an exception, you can use its class to choose a response.
General exceptions:
DuplicateIdException
- A resource with the same ID already existDuplicateValueException
- You are trying to create/update a resource that must be unique (eg. originators, group name, shortlinks, template name)InsufficientScopeException
- Your application does not have the privilege to access a resourceInvalidCredentialsException
- Unable to authenticate you based on the information provided.InvalidRequestException
- The parameters provided were invalidInvalidScopeException
- The scope requested does not existRateLimitExcedeedException
- You made too many API calls in short period of time.ResourceNotFoundException
- The ID of the requested resource was not found (eg. group, campaign, otp, shortlink, template, etc.)ApiMethodNotAllowedException
- The target resource doesn’t support this HTTP methodAccessDeniedException
- You don’t have permission to perform an action (eg. editing a template that was locked, replying to an Whatsapp after more than 24 hours passed from client reply, etc.)ServerErrorException
- Something went wrong on SMS Connexion’s side.ApiException
- Something went wrong on SMS Connexion’s side
Exceptions for methods that validate numbers or incur costs (to send SMS, add phone numbers to groups, validate number, etc.):
InsufficientBalanceException
- Your request incurs charges in excess of your existing balance.InvalidPhoneNumberException
- The phone number provided is not valid
Exceptions for methods that require network coverage (send SMS, Viber, Whatsapp):
NoCoverageException
- There is no coverage for the destination requested (these are rare)
Exceptions for Otp:
InvalidPinException
- The PIN provided does not verify with our recordsOtpAlreadyVerifiedException
- The OTP was already verifiedOtpCancelledException
- You cannot verify an OTP that was cancelledOtpActionNotAllowedException
- You cannot cancel an OTP that has non-pending status (eg. was already verified, canceled, or expired)OtpExpiredException
- You cannot verify an OTP that was expiredOtpFailedException
- The OTP verification has failed because the numbers of max attempts was reached
Exceptions for Viber/Whatsapp:
ChannelNotActiveException
- Channel is not active. You need to register Viber and Whatsapp by contacting usTemplateNotApprovedException
- Template for sending Viber or Whatsapp is not approved
Examples
The library needs to be configured with your account's Application ID & Secret or an API Key which are available in your SMS.CX Dashboard.
Table of contents examples Python
Get an access token
import time
import smscx_client
from smscx_client.api import oauth_api
from smscx_client.model.oauth_token_response import OauthTokenResponse
from pprint import pprint
configuration = smscx_client.Configuration(
username = "YOUR_APPLICATION_ID",
password = "YOUR_APPLICATION_SECRET"
)
# Create an instance of the API class
api_instance = oauth_api.OauthApi(
smscx_client.ApiClient(configuration)
)
# A list of space-delimited, case-sensitive strings
# If left empty or ommited, the issued access token will be granted with all scopes (full privileges) (optional)
scope = "sms groups templates numbers shortlinks attachments"
try:
# Get access token
api_response = api_instance.get_access_token(scope=scope)
pprint(api_response)
access_token = api_response.access_token
expires_in = api_response.expires_in
except smscx_client.InvalidRequestException as e:
# Code for invalid request # noqa: E501
except smscx_client.InvalidCredentialsException as e:
# Code for invalid credentials # noqa: E501
except smscx_client.InvalidScopeException as e:
# Code for invalid scope # noqa: E501
except smscx_client.ApiException as e:
print("Exception when calling OauthApi->get_access_token: %s\n" % e)
error_response = json.loads(e.body)
error_type = error_response['error']['type']
error_code = error_response['error']['code']
error_msg = error_response['error']['message']
http_code = e.status
Up to Table of Contents
Send single SMS
import time
import smscx_client
from smscx_client.api import sms_api
from smscx_client.model.send_sms_message_request import SendSmsMessageRequest
from smscx_client.model.send_sms_message_response import SendSmsMessageResponse
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = sms_api.SmsApi(
smscx_client.ApiClient(configuration)
)
send_sms_message_request = SendSmsMessageRequest(
to=["+31612469xxx"],
_from = "InfoText",
text = "Your confirmation code is 15997",
)
try:
# Send single SMS
api_response = api_instance.send_sms(send_sms_message_request)
pprint(api_response)
# api_response.info.total_cost
for item in api_response.data:
# item.msg_id
except smscx_client.NoCoverageException as e:
# Code for No coverage
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.InvalidPhoneNumberException as e:
# Code for invalid phone number
except smscx_client.InsufficientBalanceException as e:
# Code for insufficient balance
except smscx_client.ApiException as e:
print("Exception when calling SmsApi->send_sms: %s\n" % e)
error_response = json.loads(e.body)
error_response = json.loads(e.body)
error_type = error_response['error']['type']
error_code = error_response['error']['code']
error_msg = error_response['error']['message']
http_code = e.status
Up to Table of Contents
Send bulk SMS (up to 25.000 phone numbers)
An array with phone numbers in E.164 format must be supplied.
import time
import smscx_client
from smscx_client.api import sms_api
from smscx_client.model.send_sms_message_request import SendSmsMessageRequest
from smscx_client.model.send_sms_message_response import SendSmsMessageResponse
from smscx_client.model.transliteration import Transliteration
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = sms_api.SmsApi(
smscx_client.ApiClient(configuration)
)
send_sms_message_request = SendSmsMessageRequest(
to=[
"+31612469xxx",
"+4474005085xx",
"+49151238353xx",
"+417811126xx",
"+3519123350xx",
"+4206016090xx",
"+359483059xx",
"+336127904xx",
"+436645595xx",
"+3519121385xx",
"+3069125917xx",
],
_from="InfoText",
text="Redeem this voucher and you will get 30% discount off all Summer Fashion {{optoutLink}}",
idempotency_id="bf325375-e030-fccb-a009-17317c574773",
transliteration=Transliteration(
alphabet="NONE",
remove_emojis=False,
),
)
try:
# Send SMS
api_response = api_instance.send_sms(send_sms_message_request)
pprint(api_response)
# api_response.info.total_cost
for item in api_response.data:
# item.msg_id
except smscx_client.NoCoverageException as e:
# Code for No coverage
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.InvalidPhoneNumberException as e:
# Code for invalid phone number
except smscx_client.InsufficientBalanceException as e:
# Code for insufficient balance
except smscx_client.ApiException as e:
print("Exception when calling SmsApi->send_sms: %s\n" % e)
error_response = json.loads(e.body)
error_type = error_response['error']['type']
error_code = error_response['error']['code']
error_msg = error_response['error']['message']
http_code = e.status
Up to Table of Contents
Create new OTP request
import time
import smscx_client
from smscx_client.api import otp_api
from smscx_client.model.new_otp_request import NewOtpRequest
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = otp_api.OtpApi(
smscx_client.ApiClient(configuration)
)
new_otp_request = NewOtpRequest(
phone_number="+336122464xx",
country_iso="FR",
_from="InfoText",
template="Your verification code is {{pin}}",
track_id="bf325375-e030-fccb-a009-17317c574773",
ttl=180,
max_attempts=4,
pin_type="numbers",
pin_length=4,
otp_callback_url="https://webhook/receive-otp-status-updates",
)
try:
# New OTP
api_response = api_instance.new_otp(new_otp_request)
pprint(api_response)
# api_response.otp_id
# api_response.track_id
# api_response.phone_number
# api_response.country_iso
# api_response.status
# api_response.cost
# api_response.parts
# api_response.max_attempts
# api_response.attempts
# api_response.ttl
# api_response.otp_callback_url
# api_response.date_created
# api_response.date_expires
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.InvalidPhoneNumberException as e:
# Code for invalid phone number
except smscx_client.InsufficientBalanceException as e:
# Code for insufficient balance
except smscx_client.ApiException as e:
print("Exception when calling OtpApi->new_otp: %s\n" % e)
Up to Table of Contents
Verify OTP
import time
import smscx_client
from smscx_client.api import otp_api
from smscx_client.model.verify_pin_request import VerifyPinRequest
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = otp_api.OtpApi(
smscx_client.ApiClient(configuration)
)
otp_id = "a17fb13d-f4ac-4d93-9439-ef41ab8de390"
pin = "1544"
try:
# Verify OTP
api_response = api_instance.verify_otp(otp_id, pin)
pprint(api_response)
if api_response.status = 'VERIFIED'
# PIN successfully verified
pprint('verified')
except smscx_client.InvalidPinException as e:
# Code for Invalid PIN
except smscx_client.OtpAlreadyVerifiedException as e:
# Code for OTP already verified
except smscx_client.OtpCancelledException as e:
# Code for OTP cancelled
except smscx_client.OtpExpiredException as e:
# Code for OTP expired
except smscx_client.OtpFailedException as e:
# Code for OTP failed
except smscx_client.ApiException as e:
print("Exception when calling OtpApi->verify_otp: %s\n" % e)
Up to Table of Contents
Validate phone numbers in bulk (up to 40.000 phone numbers)
With phone number validation you can check if a number is valid by checking the network prefix for each country. An array with phone numbers in E.164 (eg. +316124692xx) or national (eg. 06124692xx) format must be supplied.
import time
import smscx_client
from smscx_client.api import numbers_api
from smscx_client.model.numbers_validate_request import NumbersValidateRequest
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = numbers_api.NumbersApi(
smscx_client.ApiClient(configuration)
)
numbers_validate_request = NumbersValidateRequest(
phone_numbers=[
"+336124241xx",
"+336123",
"+336129564xx",
"+420604558xx",
"+336123345xx",
"+4474006505xx",
"+49151237483xx",
"+49151286205xx",
"+4206018488xx",
"+49151232142xx",
"+3934237620xx",
"+336129564xx",
# National format if parameter country_iso is used
"06124241xx",
],
# country_iso="FR",
) # NumbersValidateRequest |
try:
# Validate numbers in bulk
api_response = api_instance.validate_numbers(numbers_validate_request)
pprint(api_response)
# api_response.info.total_phone_numbers
# api_response.info.total_valid
# api_response.info.total_invalid
for item in api_response.data:
# item.phone_number
# item.country_iso
# item.network_operator
# item.timezone
# item.invalid
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.ApiException as e:
print("Exception when calling NumbersApi->validate_numbers: %s\n" % e)
Up to Table of Contents
Lookup phone numbers in bulk (up to 40.000 phone numbers)
With phone number lookup you can check if a number is active or absent in the network, if the number is ported and the original and existing network name. An array with phone numbers in E.164 (eg. +316124694xx) or national (eg. 06124694xx) format must be supplied.
import time
import smscx_client
from smscx_client.api import numbers_api
from smscx_client.model.numbers_lookup_request import NumbersLookupRequest
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = numbers_api.NumbersApi(
smscx_client.ApiClient(configuration)
)
numbers_lookup_request = NumbersLookupRequest(
phone_numbers=[
"+336124241xx",
"+336123",
"+336129564xx",
"+420604558xx",
"+336123345xx",
"+4474006505xx",
"+49151237483xx",
"+49151286205xx",
"+4206018488xx",
"+49151232142xx",
"+3934237620xx",
"+336129564xx",
# National format if parameter country_iso is used
"06124241xx",
],
country_iso="FR",
lookup_callback_url="https://my-callback-url/receive-lookup-details",
)
try:
# Lookup numbers in bulk
api_response = api_instance.lookup_numbers(numbers_lookup_request)
pprint(api_response)
# api_response.info.lookup_bulk_id
# api_response.info.total_phone_numbers
# api_response.info.total_valid
# api_response.info.total_invalid
# api_response.info.cost
# api_response.info.invalid
except smscx_client.NoCoverageException as e:
# Code for No coverage
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.InvalidPhoneNumberException as e:
# Code for invalid phone number
except smscx_client.InsufficientBalanceException as e:
# Code for insufficient balance
except smscx_client.ApiException as e:
print("Exception when calling NumbersApi->lookup_numbers: %s\n" % e)
Up to Table of Contents
Get delivery report for a sent SMS campaign
import time
import smscx_client
from smscx_client.api import reports_api
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = reports_api.ReportsApi(
smscx_client.ApiClient(configuration)
)
campaign_id = "4baf0298-0c21-4df1-a60a-6e3476e95e0b" # str | Identifier of a sent campaign
try:
# Get campaign report
api_response = api_instance.get_campaign_report(campaign_id)
pprint(api_response)
# api_response.info.campaign_id
# api_response.info.campaign_name
# api_response.info.total_phone_numbers
# api_response.info.total_cost
# api_response.info.total_parts
# api_response.info.channel
for item in api_response.data:
# item.msg_id
# item.status
# item.status_code
# item.error_code
# item.in_quiet_hours
# item.created_at
# item.updated_at
# item.scheduled_at
# item.cost
# item.to
# item._from
# item.source
# item.channel
# item.text
# item.text_analysis
except smscx_client.ResourceNotFoundException as e:
# Code for campaign ID not found
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.ApiException as e:
print("Exception when calling ReportsApi->get_campaign_report: %s\n" % e)
Up to Table of Contents
Rent a phone number
import time
import smscx_client
from smscx_client.api import numbers_api
from smscx_client.model.rent_number_request import RentNumberRequest
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = numbers_api.NumbersApi(
smscx_client.ApiClient(configuration)
)
rent_number_request = RentNumberRequest(
number_id="bf325375-e030-fccb-a009-17317c574773",
rent_period=30,
auto_renew=False,
callback_url="https://webhook/receive-inbound-sms/",
)
try:
# Rent phone number
api_response = api_instance.rent_number(rent_number_request)
pprint(api_response)
# api_response.info.rent_id
# api_response.info.number_id
# api_response.info.phone_number
# api_response.info.country_iso
# api_response.info.rent_start
# api_response.info.rent_end
# api_response.info.rent_cost
# api_response.info.setup_cost
# api_response.info.auto_renew
# api_response.info.approved
# api_response.info.callback_url
# api_response.info.datetime
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.ResourceNotFoundException as e:
# Code for Number ID not found
except smscx_client.AccessDeniedException as e:
# Code for Number was already rented by someone else
except smscx_client.InsufficientBalanceException as e:
# Code for Insufficient balance
except smscx_client.ApiException as e:
print("Exception when calling NumbersApi->rent_number: %s\n" % e)
Up to Table of Contents
Get inbound SMS
Manually check for the received SMS on a rented phone number. This method to get the list of received SMS is an alternative to the webhook method, in which the details of the inbound SMS are sent to a specified callback URL.
import time
import smscx_client
from smscx_client.api import numbers_api
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = numbers_api.NumbersApi(
smscx_client.ApiClient(configuration)
)
# Identifier of the rental operation
rent_id = "471ddea7-930c-49e8-8e99-2683834dd92e"
try:
# Get inbound SMS from rented number
api_response = api_instance.get_inbound_sms(rent_id)
pprint(api_response)
# api_response.info.rent_id
# api_response.info.phone_number
# api_response.info.country_iso
for item in api_response.data:
# item.msg_id
# item._from
# item.country_iso
# item.to
# item.text
# item.cost
# item.received_at
except smscx_client.InvalidRequestException as e:
# Code for invalid request
except smscx_client.ResourceNotFoundException as e:
# Code for Rent ID not found
except smscx_client.ApiException as e:
print("Exception when calling NumbersApi->get_inbound_sms: %s\n" % e)
Up to Table of Contents
Get account balance
import time
import smscx_client
from smscx_client.api import account_api
from smscx_client.model.account_balance import AccountBalance
from pprint import pprint
configuration = smscx_client.Configuration(
# Use authentication via API Key
api_key = "YOUR_API_KEY",
# Uncomment to use authentication via Access Token
# access_token = "YOUR_ACCESS_TOKEN",
)
# Create an instance of the API class
api_instance = account_api.AccountApi(
smscx_client.ApiClient(configuration)
)
try:
# Get account balance
api_response = api_instance.get_account_balance()
pprint(api_response)
# api_response.balance
# api_response.currency
# api_response.billing
except smscx_client.ApiException as e:
print("Exception when calling AccountApi->get_account_balance: %s\n" % e)
Up to Table of Contents
Installation
The install the library we recommend to use Composer, which will also install the required dependencies:
composer require smscx/smscx-api-client
To use the library, use Composer's autoload:
require_once('vendor/autoload.php');
Dependencies
The library require the following extensions in order to work properly:
- ext-curl
- ext-json
- ext-mbstring
- Guzzle (PHP HTTP client that makes it easy to send HTTP requests )
- GuzzleHttp\Psr7 (PSR-7 interface for requests, responses, and streams)
Authentication
To use the library you must authenticate. SMS.CX PHP Library supports the authentication methods supported by the SMS Connexion API:
Handling errors
The SMS.CX PHP library raises an exception for every error type. It is recommended to catch and handle exceptions.
To catch an exception, use PHP’s try/catch syntax. SMS Connexion provides many exception classes you can catch. Each one represents a different kind of error. When you catch an exception, you can use its class to choose a response.
General exceptions:
DuplicateIdException
- A resource with the same ID already existDuplicateValueException
- You are trying to create/update a resource that must be unique (eg. originators, group name, shortlinks, template name)InsufficientScopeException
- Your application does not have the privilege to access a resourceInvalidCredentialsException
- Unable to authenticate you based on the information provided.InvalidRequestException
- The parameters provided were invalidInvalidScopeException
- The scope requested does not existRateLimitExcedeedException
- You made too many API calls in short period of time.ResourceNotFoundException
- The ID of the requested resource was not found (eg. group, campaign, otp, shortlink, template, etc.)ApiMethodNotAllowedException
- The target resource doesn’t support this HTTP methodAccessDeniedException
- You don’t have permission to perform an action (eg. editing a template that was locked, replying to an Whatsapp after more than 24 hours passed from client reply, etc.)ServerErrorException
- Something went wrong on SMS Connexion’s side.ApiException
- Something went wrong on SMS Connexion’s side
Exceptions for methods that validate numbers or incur costs (to send SMS, add phone numbers to groups, validate number, etc.):
InsufficientBalanceException
- Your request incurs charges in excess of your existing balance.InvalidPhoneNumberException
- The phone number provided is not valid
Exceptions for methods that require network coverage (send SMS, Viber, Whatsapp):
NoCoverageException
- There is no coverage for the destination requested (these are rare)
Exceptions for Otp:
InvalidPinException
- The PIN provided does not verify with our recordsOtpAlreadyVerifiedException
- The OTP was already verifiedOtpCancelledException
- You cannot verify an OTP that was cancelledOtpActionNotAllowedException
- You cannot cancel an OTP that has non-pending status (eg. was already verified, canceled, or expired)OtpExpiredException
- You cannot verify an OTP that was expiredOtpFailedException
- The OTP verification has failed because the numbers of max attempts was reached
Exceptions for Viber/Whatsapp:
ChannelNotActiveException
- Channel is not active. You need to register Viber and Whatsapp by contacting usTemplateNotApprovedException
- Template for sending Viber or Whatsapp is not approved
Examples
The library needs to be configured with your account's Application ID & Secret or an API Key which are available in your SMS.CX Dashboard.
Table of contents examples PHP
Get an access token
<?php
require_once(__DIR__ . '/vendor/autoload.php');
$config = Smscx\Client\Configuration::getDefaultConfiguration()
->setApplicationId('YOUR_APPLICATION_ID')
->setApplicationSecret('YOUR_APPLICATION_SECRET');
$smscx = new Smscx\Client\Api\OauthApi(
new GuzzleHttp\Client(),
$config
);
// A list of space-delimited, case-sensitive strings.
// If left empty or ommited, the issued access token will be granted with all scopes (full privileges)
$scopes = 'sms groups templates numbers reports originators viber whatsapp otp';
try {
$result = $smscx->getAccessToken($scopes);
print_r($result);
//$result->getAccessToken();
//$result->getExpiresIn();
//$result->getTokenType();
//$result->getScope();
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\InvalidCredentialsException $e) {
//Code for Invalid credentials
} catch (Smscx\Client\Exception\InvalidScopeException $e) {
//Code for Invalid scope
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling OauthApi->getAccessToken: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Send single SMS
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\SmsApi(
new GuzzleHttp\Client(),
$config
);
$send_sms_message_request = [
'to' => '+316124694xx',
'from' => 'InfoText',
'text' => 'Your confirmation code is 15997',
];
try {
$result = $smscx->sendSms($send_sms_message_request);
print_r($result);
// $result->getInfo()->getCampaignId();
// $result->getInfo()->getTotalPhoneNumbers();
// $result->getInfo()->getTotalValid();
// $result->getInfo()->getTotalInvalid();
// $result->getInfo()->getTotalCost();
// $result->getInfo()->getTotalParts();
// $result->getInfo()->getPhoneNumbersByCountry();
// $result->getInfo()->getTransliterationAnalysis();
// $result->getInfo()->getTotalInQuietHours();
// $result->getInfo()->getInvalid();
// $result->getInfo()->getScheduled();
foreach ( $result->getData() as $k => $v ) {
// $v->getMsgId();
// $v->getTrackData();
// $v->getStatus();
// $v->getStatusCode();
// $v->getErrorCode();
// $v->getCreatedAt();
// $v->getScheduledAt();
// $v->getInQuietHours();
// $v->getCost();
// $v->getTo();
// $v->getCountryIso();
// $v->getFrom();
// $v->getText();
// $v->getParts();
// $v->getTextAnalysis();
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\NoCoverageException $e) {
//Code for No coverage
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\InvalidPhoneNumberException $e) {
//Code for Invalid phone number
} catch (Smscx\Client\Exception\InsufficientBalanceException $e) {
//Code for Insufficient balance
} catch (Smscx\Client\ApiException $e) {
echo 'Exception when calling SmsApi->sendSms: ', $e->getMessage(), PHP_EOL;
// $httpCode = $e->getCode(); # HTTP code: 400, 401, 403, 429, 500, etc
// $errorType = $e->getResponseObject()->getError()->getType(); # Error type: invalid_param, insufficient_credit, rate_limit, etc
// $errorMessage = $e->getResponseObject()->getError()->getMessage(); # Short description of the error
// $errorCode = $e->getResponseObject()->getError()->getCode(); # API internal code: 1208, 1101, 1221, etc
}
Up to Table of Contents
Send bulk SMS (up to 25.000 phone numbers)
An array with phone numbers in E.164 format must be supplied.
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\SmsApi(
new GuzzleHttp\Client(),
$config
);
$send_sms_message_request = [
//Max 25.000 phone numbers
'to' => [
'+316124693xx',
'+4474005085xx',
'+49151238353xx',
'+417811126xx',
'+3519123350xx',
'+4206016090xx',
'+359483059xx',
'+336127904xx',
'+436645595xx',
'+3519121385xx',
'+3069125917xx',
],
'from' => 'InfoText',
'text' => 'Redeem this voucher and you will get 30% discount off all Summer Fashion {{optoutLink}}',
'allowInvalid' => true,
'transliteration' => [
'alphabet' => 'NON_GSM',
'removeEmojis' => true,
],
'idempotencyId' => '854cd53f-d77d-4aa8-9bd9-fbf720f3332d',
];
try {
$result = $smscx->sendSms($send_sms_message_request);
print_r($result);
// $result->getInfo()->getCampaignId();
// $result->getInfo()->getTotalPhoneNumbers();
// $result->getInfo()->getTotalValid();
// $result->getInfo()->getTotalInvalid();
// $result->getInfo()->getTotalCost();
// $result->getInfo()->getTotalParts();
// $result->getInfo()->getDuplicatesRemoved();
// $result->getInfo()->getDlrCallbackUrl();
// $result->getInfo()->getPhoneNumbersByCountry();
// $result->getInfo()->getGroups();
// $result->getInfo()->getTransliterationAnalysis();
// $result->getInfo()->getTotalInQuietHours();
// $result->getInfo()->getInvalid();
// $result->getInfo()->getScheduled();
foreach ( $result->getData() as $k => $v ) {
// $v->getMsgId();
// $v->getTrackData();
// $v->getStatus();
// $v->getStatusCode();
// $v->getErrorCode();
// $v->getCreatedAt();
// $v->getScheduledAt();
// $v->getInQuietHours();
// $v->getCost();
// $v->getTo();
// $v->getCountryIso();
// $v->getFrom();
// $v->getText();
// $v->getParts();
// $v->getTextAnalysis();
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\NoCoverageException $e) {
//Code for No coverage
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\InsufficientBalanceException $e) {
//Code for Insufficient balance
} catch (Smscx\Client\ApiException $e) {
echo 'Exception when calling SmsApi->sendSms: ', $e->getMessage(), PHP_EOL;
// $httpCode = $e->getCode(); # HTTP code: 400, 401, 403, 429, 500, etc
// $errorType = $e->getResponseObject()->getError()->getType(); # Error type: invalid_param, insufficient_credit, rate_limit, etc
// $errorMessage = $e->getResponseObject()->getError()->getMessage(); # Short description of the error
// $errorCode = $e->getResponseObject()->getError()->getCode(); # API internal code: 1208, 1101, 1221, etc
}
Up to Table of Contents
Create new OTP request
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\OtpApi(
new GuzzleHttp\Client(),
$config
);
//Model: \Smscx\Client\Model\NewOtpRequest
$new_otp_request = [
'phoneNumber' => '+336124241xx',
// Optional parameters
//'countryIso' => 'FR',
//'from' => 'Verify',
//'template' => 'Verification code: {{pin}}',
//'trackId' => '3b90b6d3-4fd6-40d8-9b2d-310cb50f201d',
//'ttl' => '500',
//'maxAttempts' => '5',
//'pinType' => 'numbers',
//'pinLength' => '5',
//'otpCallbackUrl' => 'https://callback-url/receive-otp-status',
];
try {
$result = $smscx->newOtp($new_otp_request);
print_r($result);
// $result->getOtpId();
// $result->getTrackId();
// $result->getPhoneNumber();
// $result->getCountryIso();
// $result->getStatus();
// $result->getCost();
// $result->getParts();
// $result->getMaxAttempts();
// $result->getAttempts();
// $result->getTtl();
// $result->getOtpCallbackUrl();
// $result->getDateCreated();
// $result->getDateExpires();
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidPhoneNumberException $e) {
//Code for Invalid phone number
} catch (Smscx\Client\Exception\InsufficientBalanceException $e) {
//Code for Insufficient balance
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\ApiException $e) {
echo 'Exception when calling OtpApi->newOtp: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Verify OTP
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\OtpApi(
new GuzzleHttp\Client(),
$config
);
$otp_id = 'a17fb13d-f4ac-4d93-9439-ef41ab8de390';
$pin = '25414';
try {
$result = $smscx->verifyOtp($otp_id, $pin);
print_r($result);
if ( $result->getStatus() == 'VERIFIED') {
//Successfully verified
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidPinException $e) {
// Code for Invalid PIN
} catch (Smscx\Client\Exception\OtpAlreadyVerifiedException $e) {
// Code for OTP already verified
} catch (Smscx\Client\Exception\OtpCancelledException $e) {
// Code for OTP cancelled
} catch (Smscx\Client\Exception\OtpExpiredException $e) {
// Code for OTP expired
} catch (Smscx\Client\Exception\OtpFailedException $e) {
// Code for OTP failed
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling OtpApi->verifyOtp: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Validate phone numbers in bulk (up to 40.000 phone numbers)
With phone number validation you can check if a number is valid by checking the network prefix for each country. An array with phone numbers in E.164 (eg. +316124692xx) or national (eg. 06124692xx) format must be supplied.
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\NumbersApi(
new GuzzleHttp\Client(),
$config
);
$numbers_validate_request = [
'phoneNumbers' => [
'+33612424105',
'+33612246450',
'+336123',
'+33612956402',
'+33612334525',
'+447400650588',
'+4915123748358',
'+4915128620584',
'+420601848808',
'+420601302207',
'+420204532112',
// National format if parameter countryIso is used
//'06124241xx',
],
//'countryIso' => 'FR',
];
try {
$result = $smscx->validateNumbers($numbers_validate_request);
print_r($result);
// $result->getInfo()->getTotalPhoneNumbers();
// $result->getInfo()->getTotalValid();
// $result->getInfo()->getTotalInvalid();
foreach ($result->getData() as $k => $v) {
// $v->getPhoneNumber();
// $v->getCountryIso();
// $v->getNetworkOperator();
// $v->getTimezone();
// $v->getInvalid(); # true or false
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling NumbersApi->validateNumbers: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Lookup phone numbers in bulk (up to 40.000 phone numbers)
With phone number lookup you can check if a number is active or absent in the network, if the number is ported and the original and existing network name. An array with phone numbers in E.164 (eg. +316124694xx) or national (eg. 06124694xx) format must be supplied.
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\NumbersApi(
new GuzzleHttp\Client(),
$config
);
$numbers_lookup_request = [
'phoneNumbers' => [
'+336124241xx',
'+336123',
'+336129564xx',
'+336124241xx',
'+420604558xx',
'+336129564xx',
'+336123345xx',
'+4474006505xx',
'+49151237483xx',
'+49151286205xx',
'+4206018488xx',
'+49151232142xx',
'+3934237620xx'
// National format if parameter countryIso is used
//'06124241xx',
],
//'countryIso' => 'FR',
'lookupCallbackUrl' => 'https://my-callback-url/receive-lookup-details',
];
try {
$result = $smscx->lookupNumbers($numbers_lookup_request);
print_r($result);
// $result->getInfo()->getLookupBulkId();
// $result->getInfo()->getTotalPhoneNumbers();
// $result->getInfo()->getTotalValid();
// $result->getInfo()->getTotalInvalid();
// $result->getInfo()->getCost();
// $result->getInfo()->getInvalid();
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidPhoneNumberException $e) {
//Code for Invalid phone number
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\NoCoverageException $e) {
//Code for No coverage
} catch (Smscx\Client\Exception\InsufficientBalanceException $e) {
//Code for Insufficient balance
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling NumbersApi->lookupNumbers: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Get delivery report for a sent SMS campaign
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\ReportsApi(
new GuzzleHttp\Client(),
$config
);
// Identifier of a sent SMS campaign
$campaign_id = '4baf0298-0c21-4df1-a60a-6e3476e95e0b';
try {
$result = $smscx->getCampaignReport($campaign_id);
print_r($result);
// $result->getInfo()->getCampaignId();
// $result->getInfo()->getCampaignName();
// $result->getInfo()->getTotalPhoneNumbers();
// $result->getInfo()->getTotalCost();
// $result->getInfo()->getTotalParts();
// $result->getInfo()->getChannel();
foreach ( $result->getData() as $k => $v ) {
// $v->getMsgId();
// $v->getStatus();
// $v->getStatusCode();
// $v->getErrorCode();
// $v->getInQuietHours();
// $v->getCreatedAt();
// $v->getUpdatedAt();
// $v->getScheduledAt();
// $v->getCost();
// $v->getTo();
// $v->getCountryIso();
// $v->getFrom();
// $v->getSource();
// $v->getChannel();
// $v->getText();
// $v->getTextAnalysis();
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\ResourceNotFoundException $e) {
//Campaign ID not found
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling ReportsApi->getCampaignReport: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Rent a phone number
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\NumbersApi(
new GuzzleHttp\Client(),
$config
);
$rent_number_request = [
'numberId' => '38d70eda-641c-4c1a-aae8-723ed8aef062',
'rentPeriod' => 30,
'autoRenew' => true,
'callbackUrl' => 'https://webhook-url/receive-inbound-sms',
];
try {
$result = $smscx->rentNumber($rent_number_request);
print_r($result);
// $result->getInfo()->getRentId();
// $result->getInfo()->getNumberId();
// $result->getInfo()->getPhoneNumber();
// $result->getInfo()->getCountryIso();
// $result->getInfo()->getRentStart();
// $result->getInfo()->getRentEnd();
// $result->getInfo()->getRentCost();
// $result->getInfo()->getSetupCost();
// $result->getInfo()->getAutoRenew();
// $result->getInfo()->getApproved();
// $result->getInfo()->getCallbackUrl();
// $result->getInfo()->getDatetime();
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\ResourceNotFoundException $e) {
//Number ID not found
} catch (Smscx\Client\Exception\AccessDeniedException $e) {
//Number was already rented by someone else
} catch (Smscx\Client\Exception\InsufficientBalanceException $e) {
//Code for Insufficient balance
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling NumbersApi->rentNumber: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Get inbound SMS
Manually check for the received SMS on a rented phone number. This method to get the list of received SMS is an alternative to the webhook method, in which the details of the inbound SMS are sent to a specified callback URL.
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\NumbersApi(
new GuzzleHttp\Client(),
$config
);
$rent_id = '471ddea7-930c-49e8-8e99-2683834dd92e';
try {
$result = $smscx->getInboundSms($rent_id);
print_r($result);
// $result->getInfo()->getRentId();
// $result->getInfo()->getPhoneNumber();
// $result->getInfo()->getCountryIso();
foreach ($result->getData() as $k => $v) {
// $v->getMsgId();
// $v->getFrom();
// $v->getCountryIso();
// $v->getTo();
// $v->getText();
// $v->getCost();
// $v->getReceivedAt();
}
} catch (InvalidArgumentException $e) {
//Code for Invalid argument provided
} catch (Smscx\Client\Exception\InvalidRequestException $e) {
//Code for Invalid request
} catch (Smscx\Client\Exception\ResourceNotFoundException $e) {
//Rent ID not found
} catch (Smscx\Client\Exception\ApiException $e) {
echo 'Exception when calling NumbersApi->getInboundSms: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents
Get account balance
<?php
require_once(__DIR__ . '/vendor/autoload.php');
// Use authentication via API Key
$config = Smscx\Client\Configuration::getDefaultConfiguration()->setApiKey('YOUR_API_KEY');
// OR
// Use authentication via Access Token
// $config = Smscx\Client\Configuration::getDefaultConfiguration()->setAccessToken('YOUR_ACCESS_TOKEN');
$smscx = new Smscx\Client\Api\AccountApi(
new GuzzleHttp\Client(),
$config
);
try {
$result = $smscx->getAccountBalance();
print_r($result);
//$result->getBalance();
//$result->getCurrency();
//$result->getBilling();
} catch (Smscx\Client\ApiException $e) {
echo 'Exception when calling AccountApi->getAccountBalance: ', $e->getMessage(), PHP_EOL;
}
Up to Table of Contents