Web API

Introduction To The Web API

SMSPrime exposes an HTTP Post Application Programming Interface (i.e. Web API) for corporate and premium users that lets you integrate short messaging services into your projects for multifarious applications including services like notification and reminder systems, confirmation systems, marketing and advertising systems etc.

A subset of the functionality already available in our client dashboard has been exposed as web methods to make it easy to automate certain tasks from within your applications and services.

Our Web API runs on top of HTTP, and can be implemented in most environments that support creating HTTP POST requests.

Activating The Web API

When a user is first registered on SMSPrime, an endpoint is created for that user that permits automatic method requests via the API.

However the endpoint is deactivated by default for security reasons and has to be enabled on a per user basis. To activate the Web API, login to your dashboard on http://smsprime.com/user/login/ with a valid account.

Navigate the menu to API -> Activate to get to the Web API section.

Generate a API Key to use for your requests, and then click on the Activate button.

Copy and save the key for later use.

The Web API URL

The primary SMSPrime URL for sending your requests varies for each client, but it usually goes in the template form:

https://smsprime.com/api.module/[username]/[datatype]

The parameters in square brackets can be any of:

  • username - The username of the client registered on SMPrime
  • datatype - The input and output data format. SMSPrime currently supports the use of the strings xml, and json

Consider a scenario for a client registered on SMPrime as userfoo, who wants to send an SMS to a client from his website.

A sample request to send an SMS message using XML would be posted to a URL that looks like this:

https://smsprime.com/api.module/userfoo/xml

Request and Response Data Structure and Formats

SMSPrime currently supports two platform independent mime formats (i.e. XML,JSON) for exchanging data via the Web API.

A request is essentially initiated by building a request block in your preferred mime format with the essential instructions.

Consider the generic synopsis of a request:

XML Request

<?xml version="1.0" encoding="utf-8"?> <Request> <header> [Header Data in XML format] </header> <body> [Body Data in XML format] </body> </Request>

Notice how the name of the root xml element is Request

JSON Request

The JSON variation would look something like this:

{ "Request" : { "header" : [ Header Data in JSON format... ], "body" : [ Body Data in JSON format... ] } }

Again, notice how the root element is named Request

The internal structure of the data block is similar, and interchangeable between these data formats. Which format you use depends on which one best suits your application and needs.

HTTP Responses are similarly built into the requested format and are wrapped up in Response tags or elements,as appropriate.

XML Response

<?xml version="1.0" encoding="utf-8"?> <Response> <statusText>...</statusText> <statusCode>..</statusCode> <auxillary> [ .................. ] </auxillary> </Response>

JSON Response

{ "Response" : { "statusText" : ..., "statusCode" : ... "auxillary" : { ... } } }

Authentication and Signature

The SMSPrime Web API is an authenticated service. Only registered users on the SMSPrime network can make requests via the API.

It is important to note that SMSPrime does not require you to authenticate the request with your password in clear text. Each request is made to a per-user URL, and the mime data must contain a head section which carries the signature of the user. The signature is obtained from an md5 hash of the concatenation of the user's API Key and username.

The signature of the user can be generated thus in language agnostic terms:

signature = md5Hash ( username + API Key)

The plus operator in that illustration merely indicates a concatenation of the two string fields (i.e. the username, and the API Key).

Hence the head block of the request would be built thus in XML:

<Request> <head> <auth> <signature>d3ee7457b04ac808071df590caa8c856</signature> </auth> </head> [ .................. ] </Request>

Where the signature is the md5 hash of the concatenation of the username and key generated from your console at SMSPrime.

Web API Service Methods

Web methods are the ways by which tasks are executed on the Web API. Each request must specify a method as a unit of execution within a request via the API. Based on the specific method, parameters may be needed to further define the context in which the method must run.

A sample template request with a method and parameters is as follows:

<?xml version="1.0" encoding="utf-8"?> <Request> <header> [Header Data in XML format] </header> <body> <method>method-name</method> <parameters> <param1>flash</param1> <param2>flash</param2> [ ....... more parameters ..... ] <paramN>flash</paramN> </parameters> </body> </Request>

The following methods are supported:

Send Method

The send method directs the platform to send an SMS on your behalf. It works with the following parameters:

Parameter Parameter Specification Parameter Options Sample
type Type of message to send default,flash flash
destination A comma separated list of mobile recipients. Take care to format these recipients in their international formats A valid MSISDN 2348034853921
source Your sender id A maximum of 11 characters for alpahnumeric names and 16 for numbers Mr Sender
header A header for binary and concatenated messages, optional A valid UDH  
shortmessage The SMS message A string that must be a maximum of 160 characters  
group The name of a group or list that exists on SMSPrime, optional A valid group name group one

A sample request block would go as follows:

<?xml version="1.0" encoding="utf-8"?> <Request> <header> <auth> <signature>d3ee7457b04ac808071df590caa8c856</signature> </auth> </header> <body> <auxillary> <balance>1</balance> </auxillary> <method>send</method> <parameters> <type>default</type> <destination>2348044563398</destination> <source>WebAPI Trxs</source> <header>optional header</header> <shortmessage>The SMS content will be here</shortmessage> <group>optional group name</group> </parameters> </body> </Request>

This request also includes an auxillary instruction that requests the user's balance after the operation. A sample response from the server would go something like:

<?xml version="1.0" encoding="UTF-8"?> <Response> <statusCode>200</statusCode> <statusText>Request Succeeded</statusText> <auxillary> <balance>253.5</balance> </auxillary> </Response>

Balance Method

An outright balance method directs the platform to return the user's current balance. It has no parameters.

A balance request looks like this:

<?xml version="1.0" encoding="utf-8"?> <Request> <header> <auth> <signature>d3ee7457b04ac808071df590caa8c856</signature> </auth> </header> <body> <method>balance</method> </body> </Request>

A sample response look like this:

<?xml version="1.0" encoding="UTF-8"?> <Response> <statusCode>200</statusCode> <statusText>Request Succeeded</statusText> <auxillary> <balance>253.5</balance> </auxillary> </Response>

Standard Error Codes

SMSPrime supports the following error codes on the API

Code Description
200 Request succeeded
300 Unknown error
301 Authentication failure
302 Acess denied
303 Request is empty or invalid. No data found
304 Request data is not well formed
305 Request method is not allowed
306 Your request was not processed
307 No method was indicated or invalid method
399 399 features a range of platform specific error codes varied by context

Examples

This section features some examples in specific languages. For all intent and purposes, we will assume the following:

username : johnsmith
API Key : 84212BF54BD90A6B42B0E96B88E5AEE3
data format : XML

Derivate API URL : https://smsprime.com/api.module/johnsmith/xml

PHP SAMPLE

<pre> <?php /** Sample API request to SMSPrime using XML **/ //username $username = "johnsmith"; //API Key $APIKey = "84212BF54BD90A6B42B0E96B88E5AEE3"; //Mime mode $dataformat = "xml"; //Derivative URL $APIUrl = "https://smsprime.com/api.module/$username/$dataformat"; //Compute a signature for the user by concatenating the username and the api key $signature = md5($username . $APIKey); //Build an xml request for method send, with an auxillary instruction to get the balance $xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?> <Request> <header> <auth> <signature>$signature</signature> </auth> </header> <body> <auxillary> <balance>1</balance> </auxillary> <method>send</method> <parameters> <type>default</type> <destination>2348044563398</destination> <source>WebAPI Trxs</source> <header>optional header</header> <shortmessage>The SMS content will be here</shortmessage> <group>optional group name</group> </parameters> </body> </Request>"; //Use CURL to post //You could as well easily use fsockopen and its family of functions $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $APIUrl ); curl_setopt($ch, CURLOPT_POST, 1 ); curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $postResult = curl_exec($ch); if (curl_errno($ch)) { print curl_error($ch); } curl_close($ch); print htmlentities("$postResult");

C# SAMPLE

//This sample uses the .NET Framework using System; using System.Text; using System.Net; using System.IO; /// <summary> /// Sample API request to SMSPrime using XML /// </summary> class WebAPIRequest { public static void Main(string[] args) { //username String username = "johnsmith"; //API Key String APIKey = "84212BF54BD90A6B42B0E96B88E5AEE3"; //Mime mode String dataformat = "xml"; //Derivative URL String APIUrl = "https://smsprime.com/api.module/" + username + "/" + dataformat; //Compute a signature for the user by concatenating the username and the api key String signature = md5( username + APIKey); //Build an xml request for method send, with an auxillary instruction to get the balance String xml = @"<?xml version='1.0' encoding='utf-8'?> <Request> <header> <auth> <signature>" + signature + @"</signature> </auth> </header> <body> <auxillary> <balance>1</balance> </auxillary> <method>send</method> <parameters> <type>default</type> <destination>2348044563398</destination> <source>WebAPI Trxs</source> <header>optional header</header> <shortmessage>The SMS content will be here</shortmessage> <group>optional group name</group> </parameters> </body> </Request>"; //Post the data String response = HttpPost(APIUrl, xml); Console.WriteLine(response); Console.ReadKey(); } public static String md5(String operand) { // step 1, calculate MD5 hash from operand System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(operand); byte[] hash = md5.ComputeHash(inputBytes); // step 2, convert byte array to hex string StringBuilder sb = new StringBuilder(); for (int i = 0; i < hash.Length; i++) { sb.Append(hash[i].ToString("X2")); } return sb.ToString(); } public static String HttpPost(string uri, string data) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes(data); Stream os = null; try { // send the Post request.ContentLength = bytes.Length; //Count bytes to send os = request.GetRequestStream(); os.Write(bytes, 0, bytes.Length); //Send it } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (os != null) { os.Close(); } } try { // get the response HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (response == null) { return null; } StreamReader sr = new StreamReader(response.GetResponseStream()); return sr.ReadToEnd().Trim(); } catch (Exception ex) { Console.WriteLine(ex.Message); } return null; } }

JAVA SAMPLE

/** * * @file WebAPIRequest.java * @date May 2, 2010 */ package SMSPrime; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.math.BigInteger; import java.net.URL; import java.net.URLConnection; import java.security.MessageDigest; /** * Sample API request to SMSPrime using XML * @author TripodWire Ltd. * */ public class WebAPIRequest { /** * @param args */ public static void main(String[] args) { //username String username = "johnsmith"; //API Key String APIKey = "84212BF54BD90A6B42B0E96B88E5AEE3"; //Mime mode String dataformat = "xml"; //Derivative URL String APIUrl = "https://smsprime.com/api.module/" + username + "/" + dataformat; //Compute a signature for the user by concatenating the username and the api key String signature = md5( username + APIKey); //Build an xml request for method send, with an auxillary instruction to get the balance String xml = "<?xml version='1.0' encoding='utf-8'?>" + "<Request>" + "<header>" + "<auth>" + "<signature>" + signature + "</signature>" + "</auth>" + "</header>" + "<body>" + "<auxillary>" + "<balance>1</balance>" + "</auxillary>" + "<method>send</method>" + "<parameters>" + "<type>default</type>" + "<destination>2348044563398</destination>" + "<source>WebAPI Trxs</source>" + "<header>optional header</header>" + "<shortmessage>The SMS content will be here</shortmessage>" + "<group>optional group name</group>" + "</parameters>" + "</body>" + "</Request>"; //Post the data String response = HttpPost(APIUrl, xml); System.out.println(response); } /** * Calculate the md5 hash of a string * @param operand * @return String */ public static String md5 (String operand) { String hash = null; try{ byte[] inputBytes = operand.getBytes("UTF-8"); MessageDigest mdFive = MessageDigest.getInstance("MD5"); byte[] digestBytes = mdFive.digest(inputBytes); BigInteger big = new BigInteger(1,digestBytes); String hashString = big.toString(16); //Pad the string if length is less that 32 chars while(hashString.length() < 32){ hashString = "0" + hashString; } hash = hashString; } catch (Exception e) { System.out.println(e.getMessage()); } return hash; } /** * Do an HTTP Post and return the response * @param uri * @param data * @return String */ public static String HttpPost(String uri,String data) { String stringResponse = ""; try { URL url = new URL(uri); URLConnection conn = url.openConnection(); // Set connection parameters. conn.setDoInput(true); conn.setDoOutput(true); conn.setUseCaches(false); // Make server believe we are form data... conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); // Write out the bytes of the content string to the stream. out.writeBytes(data); out.flush(); out.close(); // Read response from the input stream. BufferedReader in = new BufferedReader(new InputStreamReader(conn .getInputStream())); String temp; while ((temp = in.readLine()) != null) { stringResponse += temp + "\n"; } temp = null; in.close(); } catch (Exception e) { System.out.println(e.getMessage()); } return stringResponse; } }

PYTHON SAMPLE

#!/usr/bin/env python # -*- coding: UTF-8 -*- # enable debugging import cgitb import md5 import urllib import urllib2 cgitb.enable() print "Content-Type: text/plain;charset=utf-8" print # replace with your username username = "username" apiKey = "84212BF54BD90A6B42B0E96B88E5AEE3" # you can get the api URL from your web api console when logged in # however you can also derive it by doing something like this: dataformat = "xml" apiURL = "https://smsprime.com/api.module/" + username + "/" + dataformat + "/" signature = md5.new( username + apiKey ).hexdigest() apiRequest = """<?xml version="1.0" encoding="utf-8"?> <Request> <header> <auth> <signature>""" + signature + """</signature> </auth> </header> <body> <method>send</method> <parameters> <type>default</type> <destination>2348044563398</destination> <source>Web API Trx</source> <shortmessage>Content served over the HTTP API</shortmessage> </parameters> </body> </Request>""" # send the apiRequest via a standard HTTP request request = urllib2.Request( apiURL , apiRequest ) response = urllib2.urlopen( request ) html = response.read() # print out the results print html