NAV
shell php smsapi-php-client smsapi-python-client smsapi-java-client
  • SMS API Documentation - 1. Introduction
  • 2. Single SMS
  • 3. Bulk SMS
  • 4. SMS templates
  • 5. mail2sms
  • 6. Account balance
  • 7. Callback Reports
  • 8. Receiving messages
  • 9. HLR Lookup
  • 10. Contact database
  • 11. Black List
  • 12. User accounts administration
  • 13. Sender names
  • 14. Price list
  • 15. SMS Authenticator
  • 16. Special characters
  • 17. Delivery statuses
  • 18. Error codes
  • 19. 7-bit GSM alphabet
  • 20. Encoding
  • 21. Integrations
  • SMS API Documentation - 1. Introduction

    SMSAPI is a high-quality SMS platform, enabling you to integrate any of your applications with our SMS message sending and receiving system. The main advantage of our system is its simplicity of implementation. The SMS message may have your company name or any phone number you own as sender name. Every message sent from our system has its own unique id, which allows you to receive confirmation of its delivery.

    How to start

    To start using SMSAPI, you need to create an account on the SMSAPI website. Registration is completely free of charge. Your account is ready to use immediately after registration, but we recommend you to verify at least one sender name or number. The default name for all messages sent before verification is “Test”.

    IP filter for API interface

    In order to improve the security of the API interface, you may create a whitelist of IP addresses: IP addresses filter. Sending messages will be possible only from the whitelisted IP addresses (attempts at sending messages from other IPs will result in the following response: ERROR:105). IP addresses should be separated by semicolons.

    Authentication

    Example:

    POST /sms.do HTTP/1.1
    Host: https://api.smsapi.com/
    Authorization: Bearer token_api_oauth
    

    We recommend OAuth 2.0 authentication. To use OAuth, please generate a new token with selected scopes in the OAuth Tokens section of the Customer Portal.

    Authorization header will be necessary in request to our API.

    If your environment doesn't support headers modification, please add the access_token parameter with its value to request. Please note that this is not a recommended authorization alternative and it has an adverse effect on security.

    URL Adresses

    URL addresses that you need to use to connect to SMSAPI are:

    Libraries

    Prepared and developed by our programmers, SMSAPI libraries enable faster and easier integration. All available libraries are hosted at GitHub.

    Programming language Github link:
    PHP PHP library
    C# .net C# library
    Bash Bash library
    Python Python library
    JavaScript (node.js) JavaScript (node.js) library
    Java Java library
    Go Go library

    openAPI resources

    SMSAPI has more API resources beyond those mentioned in this documentation. They are documented in an openAPI standard here and are constantly extended and upgraded.

    2. Single SMS

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=44123456789&\
    message=message_content&\
    format=json"
    
    <?php
    
    function sms_send($params, $token, $backup = false)
    {
        static $content;
    
        if ($backup == true) {
            $url = 'https://api2.smsapi.com/sms.do';
        } else {
            $url = 'https://api.smsapi.com/sms.do';
        }
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, $params);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
        $http_status = curl_getinfo($c, CURLINFO_HTTP_CODE);
    
        if ($http_status != 200 && $backup == false) {
            $backup = true;
            sms_send($params, $token, $backup);
        }
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    $params = array(
        'to'            => '4412334445566',         //destination number  
        'from'          => 'Test',                  //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'message'       => 'content of message',    //message content
        'format'        => 'json',           
    );
    
    echo sms_send($params, $token);
    
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSms(SendSmsBag::withMessage('48500000000', 'Hello world!'));
    
    var_dump($sms);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000", message="content of message", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSms {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                SMSSend action = smsApi.actionSend("000000000", "test message");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response (JSON format):

    a) in case of success:

    
    {
        "count":1,
        "list": [
        {
            "id":"1460969715572091219",       //message id
            "points":0.16,                    //price of delivery
            "number":"44123456789",           //recipient number with country prefix
            "date_sent":1460969712,           //send date
            "submitted_number":"44123456789", //phone number in request
            "status":"QUEUE"                  //message status
        }
      ]
    }
    
    

    b) in case of failure:

    
    {
    "invalid_numbers":[
        {
            "number":"44123456789",             //recipient number with country prefix
            "submitted_number":"44123456789",   //phone number in request
            "message":"Invalid phone number"    //error description
        }
      ],
      "error":13,                               //error code
      "message":"No correct phone numbers"      //error description
    }
    
    

    Example response (text):

    a) in case of success:

    OK:<ID>:<POINTS>
    OK:1460969715572091219:0.16
    
    

    b) in case of failure:

    ERROR:<ERR>
    ERROR:13
    

    Messages should be sent as an HTTP POST request to our system:

    Parameter Description
    access_token OAuth token used to authenticate in our system.
    to Recipient's mobile phone number (recommended format: 44123456789).
    group Name of the group from the contacts database to which message should be sent.
    message The message text. Content of one message is normally 160 characters per single SMS or 70 in case of using at least one special character (polish characters are considered to be special characters). The maximal message is set to 918 normal characters or 402 if special chars are used and it is being sent as one block of 6 messages joined together and charged as six messages Detailed information about special characters are given in chapter 9.
    from Name of the sender. As a default the sender name is set to „Test”. Only verified names are being accepted (&from=active_name). Sender name may be set after logging into Customer Portal on Sendernames.
    encoding This parameter describes the encoding of the message text. UTF-8 is set as default. If another encoding is needed parameter encoding should have following value: for iso-8859-2 (latin2) – it should be &encoding=iso-8859-2 for Windows-1250 – it should be &encoding=windows-1250
    flash Sending a message in flash mode can be activated by setting this parameter to „1”. Flash SMS are automatically presented on the mobile screen and have to be manually saved to be stored in inbox. (&flash=1)
    test When parameter test is set to „1” message won't be sent but response will be displayed, there is no charge for such test messages. (&test=1)
    details When details parameter is set to „1” more details in response will be displayed (message length and sms count). (&details=1)
    date Date in UNIX timestamp (&date=1287734110) or in ISO 8601 (&date=2012-05-10T08:40:27+00:00) when message will be sent (&date=1287734110). Setting a past date will result in sending message instantly.
    date_validate When parameter date_validate is set to „1” checks if date if given in proper format. Returns ERROR:54 if not.
    time_restriction Sets the behavior when you try to ship in hours / dates that do not match the settings in your account. Available values are follow - act according to settings,ignore - ignore settings and nearest_available - schedule shipment in the nearest allowed time.
    allow_duplicates When parameter allow_duplicates is set to „1” allows to send message to duplicated numbers in one request (useful i.e. for parametrized message contents)
    idx Optional custom value sent with SMS and sent back in CALLBACK (i.e. &idx=123).
    check_idx When parameter check_idx is set to „1” prevents from sending more than one message with the same idx in last 24h. When this parameter is set and message with the same idx was already sent error 53 is returned.
    max_parts Defines maximum message parts allowed, maximum value allowed is 6. ERROR:12 will be returned when the message has more parts than defined. Default value can be set in Customer Portal.
    nounicode When parameter nounicode is set to „1” prevents from sending messages containing special characters. ERROR: 11 will be returned when the message contains special characters.
    normalize When parameter normalize is set to „1” special chars in message will be replaced with their equivalents (ê-e, ñ-n, ý-y ...).
    fast Setting this parameter to „1” will result in sending message with the highest priority which ensures the quickest possible time of delivery. Fast messages costs 50% more than normal message. Attention! Mass and marketing messages must not be sent with fast parameter.
    expiration_date Message expiration date (in UNIX timestamp or in ISO 8601) is a date after which message won't be delivered if it wasn't delivered yet. The difference between date sent and expiration date shouldn't be less than 15 minutes and more than 72 hours (we recommend using minimum 1 hour and maximum 12 hours difference). Time will be set with tolerance +/- 5 minutes.
    notify_url Parameter allows to set CALLBACK URL for message from request. This parameter may be used when there is no default CALLBACK URL for this user or when it should be different than default one (notify_url has higher priority than default callback).
    format Parameter &format=json causes, that response is sending in JSON format.
    ID Message unique ID. You will need it for delivery confirmation. Length of this parameter in each request may vary, but it won't be more than 32 characters long.
    POINTS Amount of used credits (i.e. Text sent in 3 messages will return 3xSMS amount)
    ERR Error code (check the error code list Error Codes)

    Fast messages (with highest priority)

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=44123456789&\
    fast=1&message=Fast_message_content&\
    format=json"
    
    <?php
    $params = array(
        'to'            => '4412334445566',         //destination number  
        'from'          => 'Test',                  //sendername made in https://ssl.smsapi.com/sms_settings/sendernames 
        'message'       => 'content of message',    //message content
        'format'        => 'json',
        'fast'          => '1' 
    );
    
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $sendSmsBag = SendSmsBag::withMessage('48500000000', 'Hello world!');
    $sendSmsBag->fast = true;
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSms($sendSmsBag);
    
    var_dump($sms);
    
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send_fast(to="48500000000", message="content of message", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSmsFast {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                SMSSend action = smsApi.actionSend("000000000", "test message");
                action.setFast(true);
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response (JSON format):

    a) in case of success:

    
    {
        "count":1,
        "list": [
        {
            "id":"1460969715572091219",       //message id
            "points":0.70,                    //price of delivery
            "number":"44123456789",           //recipient number with country prefix
            "date_sent":1460969712,           //send date
            "submitted_number":"44123456789", //phone number in request
            "status":"QUEUE"                  //message status
        }
      ]
    }
    
    

    b) in case of failure:

    
     {
    "invalid_numbers":[
        {
            "number":"44123456789",             //recipient number with country prefix
            "submitted_number":"44123456789",   //phone number in request
            "message":"Invalid phone number"    //error description
        }
      ],
      "error":13,                           //error code
      "message":"No correct phone numbers"  //error description
    }
    
    

    Example response (text):

    a) in case of success:

    OK:<ID>:<POINTS>
    OK:17101000090360359:0.70
    

    b) in case of failure:

    ERROR:<ERR>
    ERROR:13
    
    ID Message unique ID. You will need it for delivery confirmation.Length of this parameter in each request may vary, but it won't be more than 32 characters long.
    POINTS Amount of used credits (i.e. Text sent in 3 messages will return 3xSMS amount)
    ERR Error code (check the error code list Error Codes)

    Setting parameter fast to „1” (&fast=1) will result in sending message with the highest priority which ensures the quickest possible time of delivery. Fast messages costs 50% more than normal message.

    Scheduled SMS

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    to=44123456789&\
    date=1577878200&\
    message=scheduled_message_content&\
    format=json"
    
    <?php
    $params = array(    
        'to'       => '4412334445566',          //destination number  
        'from'     => 'Test',                   //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'date'     => '1577878200',             //date in UNIX timestamp
        'message'  => 'content of message',     //message content
        'format'   => 'json'
    );
    
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\ScheduleSmsBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->scheduleSms(ScheduleSmsBag::withMessage(new DateTime(), '48500000000', 'Hello world!'));
    
    var_dump($sms);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000", message="content of message", date="1577878200", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    

    To send message at specified date and hour parameter date has to be used. This parameter should be in UNIX timestamp format.

    Deleting single scheduled messages

    The sch_del parameter allows you to delete a scheduled message based on its ID.

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    sch_del=09040616088106874&\
    format=json"
    
    <?php
    $params = array(
        'sch_del'  => '09040616088106874',      //message id
        'format'   => 'json'
    );
    
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\ScheduleSmsBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->deleteScheduledSms(new DeleteScheduledSmssBag(['id1', 'id2']));
    
    var_dump($sms);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.remove_scheduled(id='message ID')
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSDelete;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class DeleteSmsScheduled {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                SMSDelete action = smsApi.actionDelete("id1");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    3. Bulk SMS

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=48500500500,48501501501,48502502502&\
    message=message&\
    format=json"
    
    <?php
    $params = array(
        'to'       => '48500500500,48501501501,48502502502',    //destination number  
        'from'     => 'Test',                                   //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'message'  => 'content of message',                     //message content
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss(SendSmssBag::withMessage(['48500000000', '48500000001'], 'Hello world!'));
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000,48500000001,48500000002", message="content of message",  from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSmss {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                String[] to = {"000000000", "000000001"};
                SMSSend action = smsApi.actionSend(to, "test message");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response (JSON format):

    a) in case of success:

        {
            "count": 3,
            "list": [
                {
                    "id":"1460978572913968440",
                    "points":0.16,
                    "number":"48500500500",
                    "date_sent":1460978579,
                    "submitted_number":"48500500500",
                    "status":"QUEUE"
                },
                {
                    "id":"1460978572913968450",
                    "points":0.16,
                    "number":"48501501501",
                    "date_sent":1460978579,
                    "submitted_number":"48501501501",
                    "status":"QUEUE"
                },
                {
                    "id":"1460978572913968460",
                    "points":0.16,
                    "number":"48502502502",
                    "date_sent":1460978579,
                    "submitted_number":"48502502502",
                    "status":"QUEUE"
                }
    
            ]
        }
    

    b) in case of failure:

        {
            "invalid_numbers": [
                {
                    "number":"456456456",
                    "submitted_number":"456456456",
                    "message":"Invalid phone number"
                },
                {
                    "number":"321321321",
                    "submitted_number":"321321321",
                    "message":"Invalid phone number"
                }
            ],
            "error":13,
            "message":"No correct phone numbers"
        }
    
    

    Example response (text):

    a) in case of success:

    OK:<ID>:<POINTS>:<PHONE>;...;...;...
    OK:1460978572913968440:0.16:48500500500;OK:1460978572913968450:0.16:48501501501;
    

    b) in case of failure:

    ERROR:<err>
    ERROR:13
    
    ID Message unique ID. You will need it for delivery confirmation. Length of this parameter in each request may vary, but it won't be more than 32 characters long.
    POINTS Number of used credits (i.e. Text sent in 3 messages will return 3xSMS amount)
    PHONE Recipient phone number

    Sending messages to a group of recipients is similar to single submissions (presented in chapter 2). The only difference is filling the “to” field with a set of multiple recipients’ numbers (not only one number). In order to send this type of message successfully, we recommend to submit all parameters in an HTTP POST request just to assure that all recipients numbers are submitted correctly.

    If the total cost of sending these messages exceeds the number of credits available in a user's account, the system will respond with a 103 error code and none of the messages will be sent. If some of the recipients’ numbers are invalid (unrecognised by SMSAPI due to a wrong prefix or because they are landline numbers), they will be skipped and not included in the bulk, while messages to the remaining numbers will be sent. The skipped numbers will not be mentioned in delivery reports. If any number appears more than once in one request, the message to such a recipient is only sent once.

    Please notice that in multiple SMS sending, recipients’ numbers are present in the response as well, and each message ends with a semicolon (there is a semicolon after the last message as well).

    The recommended maximum number of messages sent in one request is 10000 for the POST method.

    SMS messages to numbers from contacts database group

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    group=test_group&\
    message=Test message sent to contacts from contacts database – example custom field: [%contact.field name%]\
    format=json"
    
    <?php
    $params = array(
        'group'    => 'test_group',     //destination group  
        'from'     => 'Test',           //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'message'  => 'Test message sent to contacts from contacts database',   //message content
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmsToGroupBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmsToGroup(SendSmsToGroupBag::withMessage('Contacts group name', 'Hello [%name%]!'));
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send_to_group(group="Group name", message="content of message", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    

    Example response (JSON format):

    a) in case of success:

        {
            "count": 3,
            "list": [
                {
                    "id":"1460978572913968440",
                    "points":0.16,
                    "number":"48500500500",
                    "date_sent":1460978579,
                    "submitted_number":"48500500500",
                    "status":"QUEUE"
                },
                {
                    "id":"1460978572913968450",
                    "points":0.16,
                    "number":"48501501501",
                    "date_sent":1460978579,
                    "submitted_number":"48501501501",
                    "status":"QUEUE"
                },
                {
                    "id":"1460978572913968460",
                    "points":0.16,
                    "number":"48502502502",
                    "date_sent":1460978579,
                    "submitted_number":"48502502502",
                    "status":"QUEUE"
                }
    
            ]
        }
    

    b) in case of failure:

        {
            "invalid_numbers": [
                {
                    "number":"456456456",
                    "submitted_number":"456456456",
                    "message":"Invalid phone number"
                },
                {
                    "number":"321321321",
                    "submitted_number":"321321321",
                    "message":"Invalid phone number"
                }
            ],
            "error":13,
            "message":"No correct phone numbers"
        }
    
    

    Example response (text):

    a) in case of success:

    OK:<ID>:<POINTS>:<PHONE>;...;...;...
    OK:1460978572913968440:0.16:48500500500;OK:1460978572913968450:0.16:48501501501;
    

    b) in case of failure:

    ERROR:<err>
    ERROR:13
    
    ID Message unique ID. You will need it for delivery confirmation. Length of this parameter in each request may vary, but it won't be more than 32 characters long.
    POINTS Number of used credits (i.e. Text sent in 3 messages will return 3xSMS amount)
    PHONE Recipient phone number

    It is possible to send messages to a group of numbers from contacts database. However, such a group must first be created in the contacts database of our Customer Portal.

    You can insert your own custom field into the content of messages intended for particular group members. Custom fields can be defined on Custom fields. To insert custom field into message use [%contact.field name%]. This expression will be replaced with a corresponding value assigned to contact.

    Bulk personalized SMS sending using parameters

    Example request:

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=48600111222,48500111222&\
    message=Message content,param1:[%1%]param2:[%2%]&\
    param1=John|Ann&\
    param2=30|40&\
    format=json"
    
    <?php
    $params = array(
        'to'       => '48600111222,48500111222',    //destination numbers
        'from'     => 'Test',                       //sendername made in https://ssl.smsapi.com/sms_settings/sendernames 
        'message'  => 'Message content,parameter1:[%1%]parameter2:[%2%]',   //message content
        'param1'   => 'John|Ann',
        'param2'   => '30|40',
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $sendSmssBag = SendSmssBag::withMessage(['48500000000', '48500000000'], '[%1%] [%2%]!')
        ->setParams([1 => ['Hello', 'Hello2'], 2 => ['world', 'world2']]);
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss($sendSmssBag);
    
    var_dump($sms);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to=['48500000000', '48500000001'], message='message test, parameter1:[%1%] parameter2:[%2%]', param1=['Jack', 'Annie'], param2=['30', '40'], from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSmssWithParams {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                String[] to = {"000000000", "000000001"};
                String[] param1 = {"Hello", "Witaj"};
                String[] param2 = {"world", "świecie"};
                SMSSend action = smsApi.actionSend(to, "[%1%] [%2%]");
                action.setParam(1, param1);
                action.setParam(2, param2);
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Message will have following contents:

    Message 1: Message content, parameter1: John parameter2: 30
    Message 2: Message content, parameter1: Ann parameter2: 40
    
    

    It is possible to send up to 100 personalized messages in one request using personalization parameters. Sending more personalized messages requires more than one request. Personalization parameters should be defined in the request as param1, param2, param3, param4, which will replace tags [%1%], [%2%], [%3%] and [%4%] in message content. The values of these parameters have to be separated by pipe char „|” in accordance with the template below:

    param1=Ann|Michael|Andrew&param2=Smith|Thomas|Davis

    The number of parameters has to be exactly the same as the number of recipients in the request. Otherwise, ERROR: 18 will be returned and the messages won't be sent.

    If one of the numbers is invalid, the message to this number will be skipped and the remaining messages will be sent.

    Parameters - After defining parameters the may be used in message content:

    Parameter Description
    [%1%] Value of parameter 1 (param1)
    [%2%] Value of parameter 2 (param2)
    [%3%] Value of parameter 3 (param3)
    [%4%] Value of parameter 4 (param4)

    Bulk SMS using IDX parameter

    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $sendSmssBag = SendSmssBag::withMessage(['48500000000', '48500000001'], 'Hello world!');
    $sendSmssBag->idx = ['id-1', 'id-2'];
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss($sendSmssBag);
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to=['48500000000', '48500000001'], message='content of message', idx=['idx1', 'idx2'], from_="sender name")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSmssWithIdx {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                String[] to = {"000000000", "000000001"};
                String[] idx = {"id-1", "id-2"};
                SMSSend action = smsApi.actionSend(to, "test message");
                action.setIDx(idx);
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    There is a possibility to send mass messages with custom IDX parameters different for each message. Such parameters will be returned in CALLBACK. An additional check_idx parameter (&check_idx=1) may be used with idx parameters. Using the check_idx parameter prevents two messages from being sent with the same idx parameter value within 24h. Example of using the idx parameter:

    idx=idx1|idx2|idx3|idx4

    The number of IDX parameters must be the same as the number of recipients numbers given in the request.

    Discount Codes

    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=48600111222,48500111222&\
    discount_group=codes&\
    message=Message content with discount code: [%code%]&\
    format=json"
    
    <?php
    $params = array(
        'discount_group' => 'codes',                                            //group of codes
        'to'             => '48600111222,48500111222',                          //receive numbers  
        'from'           => 'Test',                                             //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'message'        => 'Message content with discount code: [%code%]',     //message content
        'format'         => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss(SendSmssBag::withMessage(['48500000000', '48500000001'], 'Hello world! Discount code: [%code%]'));
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000,48500000001,48500000002", message="content of message, Discount code: [%code%]", from_="sender name")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.SmsFactory;
    import pl.smsapi.api.action.sms.SMSSend;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendSmssWithDiscountCode {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SmsFactory smsApi = new SmsFactory(client, proxy);
    
                String[] to = {"000000000", "000000001"};
                SMSSend action = smsApi.actionSend(to, "Hello world! Discount code: [%code%]");
                action.setDiscountGroup("codes");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    The discount code feature allows you to generate/import codes for use in our service. A new group of discount codes can be added in two ways: - by clicking "Import codes" – when you want to add a .csv file containing your own codes (in one column), - by clicking "Generate codes" – our system will then generate a group of codes for you (you may choose the type, length, and amount of codes).

    To use discount codes in SMS messaging, simply select the appropriate group of discount codes and then add the [%code%] parameter in the content. To use a group of discount codes they must be active (not expired) and contain a propriate number of characters. When the code is used by a customer it will be displayed as "redeemed".

    Messages with cut.li

    Example request:

    
    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=49500500500,42501501501,47502502502&\
    message=test_message_with_short_link:_[%goto:www.smsapi.com%]&\
    format=json"
    
    
    <?php
    $params = array(
        'to'       => '48600111222,48500111222',    //destination numbers
        'from'     => 'Test',                       //sendername made in https://ssl.smsapi.com/sms_settings/sendernames  
        'message'  => 'test message with short link: [%goto:www.smsapi.com%]',   //message content
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss(SendSmssBag::withMessage(['48500000000', '48500000001'], 'Hello world! Go: [%goto:www.smsapi.com%]'));
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000,48500000001,48500000002", message="content of message Go: [%goto:www.smsapi.com%]", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    

    This function enables sending SMS messages with a shortened URL (http://cut.li) redirecting the recipient to a URL added as a parameter. In the SMS message, the URL should be added as a [%goto:url_address%] parameter and it will be displayed e.g. as http://cut.li/ABCD (each recipient will receive a unique end of link "/ABCD"). It's possible to add up to 100 recipients when short link is used.

    Individual links are valid for 30 days, while links with the same URL for every recipient are valid for 10 years.

    
    curl -X POST -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=49500500500,42501501501,47502502502&\
    message=test_message_with_Opt-out link:_[%opt_out_link%]&\
    format=json"
    
    
    <?php
    $params = array(
        'to'       => '48600111222,48500111222',    //destination numbers
        'from'     => 'Test',                       //sendername made in https://ssl.smsapi.com/sms_settings/sendernames 
        'message'  => 'test message with Opt-out link: [%opt_out_link%]',   //message content
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmssBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Sms[] $smss */
    $smss = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSmss(SendSmssBag::withMessage(['48500000000', '48500000001'], 'test_message_with_Opt-out link:_ [%opt_out_link%]'));
    
    var_dump($smss);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    send_results = client.sms.send(to="48500000000,48500000001,48500000002", message="message test with Opt-out: [%opt_out_link%]", from_="sendername")
    
    for result in send_results:
        print(result.id, result.points, result.error)
    
    

    The Opt-out SMS function allows you to add URL into the SMS message which unsubscribes a given user from the database in the SMSAPI Customer Portal. In order to place the Opt-out link in the message text, add [%opt_out_link%] to the message parameter. The numbers that use the link are on the Opt-out list and will be excluded from future campaigns.

    Opt-out links expire after 14 days.

    4. SMS templates

    Example request:

    
    Template name:          Notify
    Template content:       Hello [%1%], Your order has been sent. The shipment number is [%2%]. You may follow it on our site. 
    
    curl -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=49500500500&\
    template=Notify&\
    param1=Mark&\
    param2=BG12344423&\
    format=json"
    
    <?php
    $params = array(
        'to'       => '49500111222',    //destination numbers
        'from'     => 'Test',           //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'template' => 'Notify',         //template name
        'param1'   => 'Mark',
        'param2'   => 'BG12344423',
        'format'   => 'json'
    );
    ?>
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Sms\Bag\SendSmsBag;
    use Smsapi\Client\Feature\Sms\Data\Sms;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $sendSmsBag = SendSmsBag::withTemplateName('48500000000', 'Notify');
    $sendSmsBag->setParams([1 => 'Mark', 2 => 'BG12344423']);
    
    /** @var Sms $sms */
    $sms = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->smsFeature()
        ->sendSms($sendSmsBag);
    
    var_dump($sms);
    
    
    The content of sent message:
    Hello Mark, Your order has been sent. The shipment number is BG12344423. You may follow it on our site. 
    
    

    Templates simplify changing standard notification messages (they may be used in shops, internet services, medical clinics etc.) without changing the php script responsible for SMS sending. Follow these steps to use templates:

    Parameter Description
    template Template name
    param N The value of this parameter will replace [%N%]in the template where N is a number between 1 and 4
    single If the message will contain more than 160 chars (single message) it won't be sent and ERROR:12 will be replied (&single=1)

    5. mail2sms

    Sending sms with mail2sms requires sending a mail following this pattern:

    TO: sms.do@smsapi.com
    SUBJECT: username@password_hashed_in_md5
    CONTENT: from=sender_name&to=number&message=message_content

    Adding parameter raport=1 will result in sending back e-mail containing request status (sent confirmation or error code – this is useful while testing the service):

    TO: sms.do@smsapi.com
    SUBJECT: username@password_hashed_in_md5
    CONTENT: from=sender_name&to=number&raport=1&message=message_content

    Mail may be sent in plain / quotedprintable / base64 encoding. Sender name (parameter &from=) have to be active.

    In addition to the parameters listed in the examples above, mail2sms includes all the parameters listed in chapter 2. Single SMS.

    6. Account balance

    Example request:

    
    curl -X GET -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/profile"
    
    
    
    <?php
    
    function getPoints($token)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/profile';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo getPoints($token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Profile\Data\Profile;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Profile $profile */
    $profile = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->profileFeature()
        ->findProfile();
    
    var_dump($profile->points);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def get_account_balance():
        r = client.account.balance()
    
        print(r.points, r.pro_count, r.eco_count, r.mms_count, r.vms_gsm_count, r.vms_land_count)
    
    

    Example response:

    a) in case of success:

    {
      "name": "string",
      "email": "string",
      "username": "string",
      "phone_number": "string",
      "payment_type": "prepaid",
      "user_type": "native",
      "points": 0 // number of credits avaivable in SMSAPI service
    }
    
    

    b) in case of failure:

    
    {
        "message":"Authorization failed",
        "error":"authorization_failed",
        "developer_description":null,
        "errors":null
    }
    
    

    There is an additional function allowing you to check the current account balance. An example of using the function can be found below.

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    Response data Description
    points Number of points available on SMSAPI platform
    name Company name
    email Contact email
    username SMSAPI username
    phone_number Contact phone number
    payment_type Type of payment
    user_type Type of user on SMSAPI platform, native or subuser

    7. Callback Reports

    The callback service updates you about message status (delivery reports), shortened URL clicks (cut.li) or HLR lookups via an endpoint set on an SMSAPI user’s side. You enter the URL address of the endpoint in the Customer Portal. When a new event occurs, SMSAPI generates a POST or GET request with data to the SMSAPI user’s endpoint.

    Requests may be generated from following IP addresses: 3.123.166.170, 89.174.81.98, 91.185.187.219, 213.189.53.211, 31.186.83.18, 212.91.26.253

    Requests to the callback address are repeated cyclically until they are received or the associated message is archived. Sending requests to the callback address may be blocked if too many errors are detected during the transmission on the client's side.

    SMS callback

    We offer you possibility to run any available script in the web with callback delivery reports. In order to use this option please login on our site https://api.smsapi.com and set the „Callback address DLR_SMS” in Callback URLs.

    Receiving delivery report example (CALLBACK SMS DLR)

    
    <?php
    
        if($_GET['MsgId'] && $_GET['status'] ) {
            mysqli_connect('host', 'user', 'password', 'database');
            $arIds = explode(',',$_GET['MsgId']);
            $arStatus = explode(',',$_GET['status']);
            $arIdx = explode(',',$_GET['idx']);
            if($arIds) { 
                foreach($arIds as $k => $v) {
                    mysqli_query("UPDATE sms SET sms_status = '".mysqli_real_escape_string($arStatus[$k])."', 
        sms_index = '".mysqli_real_escape_string($arIdx[$k])."' WHERE sms_id ='".mysqli_real_escape_string($v)."' LIMIT 1");
           }
            mysqli_close();
            echo "OK";
        }
    
    ?>
    
    

    Example response:

    a) Example with one value:

        https://my_site.com/status_update?MsgId=613F1B14346335B944450980&donedate=1631525653&from=Test&idx=1&mcc=260&mnc=3&points=0.0&sent_at=1631525653&status=403&status_name=SENT&to=48500500500&username=smsapi.user
    

    b) Example with five values:

        https://my_site.com/status_update?MsgId=613F14C4346335AE0B1DBA31%2C613F14C4346335AE0B1DBA2E%2C613F14C4346335AE0B1DBA30%2C613F14C4346335AE0B1DBA2F%2C613F14C4346335AE0B1DBA2D&donedate=1631525676%2C1631525676%2C1631525676%2C1631525676%2C1631525676&from=Test%2CTest%2CTest%2CTest%2CTest&idx=%2C%2C%2C%2C&mcc=260%2C260%2C260%2C260%2C260&mnc=3%2C3%2C3%2C3%2C3&points=0.16%2C0.16%2C0.16%2C0.16%2C0.16&sent_at=1631525676%2C1631525676%2C1631525676%2C1631525676%2C1631525676&status=403%2C403%2C403%2C403%2C403&status_name=SENT%2CSENT%2CSENT%2CSENT%2CSENT&to=48500500500%2C48500500500%2C48500500500%2C48500500500%2C48500500500&username=smsapi.user%2Csmsapi.user%2Csmsapi.user%2Cmsmsapi.user%2Csmsapi.user
    

    Example: http://www.my_site.com/status_update.php

    System sends parameters using the GET method. Every parameter could have up to 5 values. Amount of values will be always the same for all parameters.

    Parameters are described in following table:

    Parameter Description
    MsgId Message ID. Length of this parameter in each request may vary, but it won't be more than 32 characters long.
    status Status code, list of codes can be find in Statuses
    status_name Status name, list of names can be find in Statuses
    idx Optional parameter send with SMS
    sent_at Date in UNIX timestamp of creating message
    donedate Date in UNIX timestamp of delivery report
    username Username which sent SMS
    points Number of used credits
    to Mobile phone number of the recipient
    mcc Mobile country code
    mnc Mobile network code

    All characters are case sensitive!

    Bulk callback

    Bulk CALLBACK script receives a request the moment sending a bulk starts. This feature is generally useful for scheduled bulks. The request contains parameters presented in the table below. In order to enable Bulk CALLBACK please enter CALLBACK script URL in Callback URLs.

    Example: http://www.my_site.com/bulk_callback.php

    Parameters are described in following table:

    Parameter Description
    type Messages type SMS/MMS/VMS
    all Total number of messages (phone numbers) in bulk
    points Credits needed for the dispatch.
    info Defines if the bulk was sent using „Numbers from file”, „Numbers and content from file” or „Numbers from contacts database” tab
    text Message content.

    All characters are case sensitive!

    Cut.li callback

    In order to check cut.li URL visits please log in to the Customer Portal and enter in Callback URLs the address to a script to which information about URL visit should be sent.

    Parameter will be sent using GET method separated by commas:

    $_GET['MsgId']=09062414383994024
    $_GET['operating_system']=Android
    

    Example: http://www.my_site.com/bulk_callback.php

    Parameters are described in following table:

    Parameter Description
    MsgId Message ID. Length of this parameter in each request may vary, but it won't bemore than 32 characters long.
    MsgIdx Optional custom value sent with SMS (idx).
    suffix Suffix for shortened URL, e.g. Hq9Y (for http://idz.do/Hq9Y)
    to Recipient's phone number
    click_date Time of first link click in unixtime format
    device Device type
    operating_system Operating system
    browser Browser type
    username Username from which message was sent
    ip IP address from which short URL was clicked

    All characters are case sensitive!

    8. Receiving messages

    
    <?php
    
        function messageReceive()
        {
            $received   = $_POST;
            $content = print_r($received, true);
            $sms_from   = $received['sms_from'];
            $sms_to     = $received['sms_to'];
            $sms_date   = $received['sms_date'];
            $sms_text   = $received['sms_text'];
            $username   = $received['username'];
    
            $filename = "sms.log";
    
            file_put_contents($filename, $content);
    
            if (is_file($filename)) {
                return true;
                } else {
                return false;
                }
        }
    
        if ($_POST) {
            if (messageReceive() === true) {
                echo "OK";
            }
        }
    
    ?>
    
    

    Receiving messages may be done using CALLBACK script located on client's server. Address to this script should be entered here Callback URL with Type selected as “Callback address SMS receive”. The script works as follows:

    After receiving message we will send query to the script with POST table that contains following parameters:

    Parameter Description
    sms_to Recipient's phone number
    sms_from Sender phone number
    sms_text Message content
    sms_date Date in timestamp taken from the message
    username Username of the client to which message has been assigned

    Data will be sent in UTF-8 encoding.

    9. HLR Lookup

    Example request:

    curl -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/hlr.do?\
    number=44123123123,44234234234&\
    format=json"
    
    
    <?php
    $params = array(
        'access_token'  => 'token_api_oauth',   //https://ssl.smsapi.com/react/oauth/manage
        'number'        => '48500000000',       //number to check
        'format'        => 'json'
    );
    if ($params['access_token']&&$params['number']) {
        $date = '?'.http_build_query($params);
        $file = fopen('https://api.smsapi.com/hlr.do'.$date,'r');
        $result = fread($file,1024);
        fclose($file);
        echo $result;
    }
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Hlr\Bag\SendHlrBag;
    use Smsapi\Client\Feature\Hlr\Data\Hlr;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Hlr $hlr */
    $hlr = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->hlrFeature()
        ->sendHlr(new SendHlrBag('48500000000'));
    
    var_dump($hlr);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def check_number():
        r = client.hlr.check_number(number='48500000000')
    
        print(r.status, r.number, r.id, r.price)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.hlr.HLRCheckNumber;
    import pl.smsapi.api.action.hlr.HlrFactory;
    import pl.smsapi.api.response.CheckNumberResponse;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class SendHlr {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                HlrFactory hlrApi = new HlrFactory(client, proxy);
    
                HLRCheckNumber action = hlrApi.actionCheckNumber("000000000");
    
                CheckNumberResponse phoneNumbers = action.execute();
    
                phoneNumbers.list.forEach(phoneNumber -> System.out.println(phoneNumber.getStatus()));
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response (JSON format):

    a) in case of success:

    {
        "status": "OK", 
        "number": "48100200300",
        "id": "46567088",
        "price": "0.0500"
    }
    

    b) in case of failure:

    {
        "status":"ERROR",
        "number":"481002003001", // invalid phone number
        "error":13               // error code
    }
    

    Example response (text):

    a) in case of success:

    OK:<NUMBER>:<ID>:<POINTS>;OK:<NUMBER>:<ID>:<POINTS>;...;...
    OK:44123123123:80625:0.006;OK:44234234234:80627:0.006;
    
    

    b) in case of failure:

    ERROR:<NUMBER>:<ERR>;ERROR:<NUMBER>:<ERR>;...;...
    OK:44123123123:80625:0.006;ERROR:4433412333:13;
    
    

    where:

    <NUMBER>    Checked number
    <ID>        Checking unique ID
    <POINTS>    Number of used credits
    <ERR>       Error code
    

    Example of data sent to the callback script (sent to the URL provided in a POST table):

    Array
    (
        [0] => Array
            (
                [id] =>  80625
                [number] => 48600600600
                [mcc] => 260
                [mnc] => 2
                [info] => T-Mobile
                [status] => OK
                [date] =>  1302703609
                [ported] => 0
                [ported_from] => null
            )
        [1] => Array
            (
                [id] =>   80627
                [number] => 48500600700
                [mcc] => 260
                [mnc] => 2
                [info] => ABSENT_SUBSCRIBER
                [status] => FAIL
                [date] =>  1302703609
                [ported] => 0
                [ported_from] => null
            )
    )
    

    HLR (Home location Register) is an extensive base including different kinds of information about every working telephone number in GSM. In order to use this option, you should send a request to following URL:

    with proper parameters described below. There might be up to 20 numbers in one request. All information about numbers will be sent to address given on our site https://ssl.smsapi.com at „Callback address HLR” in „API Settings” → „Callback URLs”.

    It is important that the address entered is a valid address to an existing, available script. After checking a number in the HLR, information about the number will be sent to the URL provided in a POST table.


    HLR error code list can be checked in the Error codes tab.


    The parameters are described in the table below:

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    number Numbers to be checked in HLR.
    idx Optional custom value sent with SMS and sent back in CALLBACK. Parameter idx may contain up to 255 chars, allowed characters are digits 0 – 9 and letters a – z (parameter is not case sensitive). (&idx=123)

    The parameters returned to the script are described in the table below:

    Parameter Description
    id ID returned as a response to the request
    number Checked number
    mcc Mobile country code
    mnc Mobile network code
    info Name of network or description of error
    status OK when number is correct, FAIL when number is wrong
    date UNIX timestamp when number was checked
    ported 0 number not ported, 1 number ported
    ported_from null when number is not ported or name of network from which number is ported
    idx Optional custom value sent with HLR request and sent back in CALLBACK (&idx=123)

    All characters are case sensitive!

    The data is sent in UTF8 encoding. The list of possible errors, which may appear in infofield, with description, can be found in Error Codes.

    10. Contact database

    Endpoint contacts allows you to perform operations on contacts.

    List contacts

    
    curl -X GET -H "Authorization: Bearer token_api_oauth" https://api.smsapi.com/contacts?\
    birthday_date=between%281997-02-24%2C%202002-02-24%29
    
    
    
    <?php
    
    function getContact($token,$params)
    {
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/contacts?'.$params);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    $params = 'phone_number=48500500500';
    // or when using operators on custom field
    // $params = 'custom_field=9'  -- Listing contacts where custom_field is equal to 9, 91, 99 etc.
    // $params = 'custom_field=between(9,11)  -- Listing contacts where custom_field is between two given values.
    
    echo getContact($params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Contacts\Bag\FindContactsBag;
    use Smsapi\Client\Feature\Contacts\Data\Contact;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $findContactsBag = new FindContactsBag();
    $findContactsBag->phoneNumber = 48500000000;
    
    /** @var Contact[] $contacts */
    $contacts = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->contactsFeature()
        ->findContacts($findContactsBag);
    
    var_dump($contacts);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def get_all_contacts():
        l = client.contacts.list_contacts()
    
        for c in l:
            print(c.id, c.first_name, c.last_name, c.phone_number)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.contacts.Contacts;
    import pl.smsapi.api.action.contacts.ContactsFactory;
    import pl.smsapi.api.action.contacts.ContactsList;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class ListContacts {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                ContactsFactory contactsApi = new ContactsFactory(client, proxy);
    
                ContactsList action = contactsApi.actionList();
                action.filterByPhoneNumber("48500000000");
    
                Contacts contacts = action.execute();
    
                contacts.list.forEach(contact -> System.out.println(contact.email));
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
       "size":1,
       "collection":[
          {
             "id":"5b83ba81a788494a0469490f",
             "first_name":"name",
             "last_name":"surname",
             "birthday_date": "1998-03-09",
             "phone_number":"48500000000",
             "email":"bok@smsapi.com",
             "gender":"male",
             "city":"City",
             "country":"Poland",
             "source":"source",
             "date_created":"2018-08-27T10:46:57+02:00",
             "date_updated":"2018-08-27T10:46:57+02:00",
             "groups":[
                {
                   "id":"59a3ca1fa78849062837cd0c",
                   "name":"default",
                   "date_created":"2017-08-28T09:45:35+02:00",
                   "date_updated":"2017-08-28T09:45:35+02:00",
                   "description":"",
                   "created_by":"login",
                   "idx":null,
                   "contact_expire_after":null,
                   "contacts_count":null
                }
             ]
          }
       ]
    }
    
    

    b) in case of failure:

    
    {
        "message":"Authorization failed",
        "error":"authorization_failed",
        "errors":null
    }
    
    

    The following parameters allow you to filter the list of contacts in this function. The search is case-insensitive.

    You can also filter the contacts by your own custom fields. You can define them on Custom fields.

    Parameter Description
    q The parameter allows you to search for contacts containing the given string of characters within the basic fields in the bases of the constitutions, i.e. name, surname, telephone number, email, city.
    offset Specifying from which place in a row contacts will be listed.
    limit The limit of clients to be listed.
    sort The parameter specifies the field in the contact database after which the data sorting will be performed. The increasing direction is, for example, sort = last_name and the descending direction is, for example, sort = -last_name.
    phone_number Listing a contact with a given telephone number.
    email Listing a contact with a given email address.
    first_name Listing contacts of a given name.
    last_name Listing contacts with the given last name.
    group_id Listing contacts belonging to a specific group (specify groupID).
    gender Listing contacts with a given gender, male or female.
    birthday_date Listing contacts at the given birth date. The date is given in format YYYY-MM-DD.

    You can also use the following operators for filtering. They may not work with every parameter type.

    Operator Description
    gt Operator "greater than" listing contacts where value is greater than value given in parameter.
    lt Operator "less than" listing contacts where value is less than value given in parameter.
    gte Operator "greater or equal" listing contacts where value is greater or equal to value given in parameter.
    lte Operator "less or equal" listing contacts where value is less or equal to value given in parameter.
    eq Operator "equal" listing contacts where value is equal to value given in parameter.
    = Operator "like" listing contacts where value contains the value given in parameter.
    between Listing contacts where value is between values given in parameters.

    Create contact

    
    curl -X POST "https://api.smsapi.com/contacts" -H "Authorization: Bearer token_api_oauth" -d\
    "phone_number=48500000000&email=bok@smsapi.com&first_name=Name&last_name=Last_name&gender=gender\
    &description=description&city=city&groups=default"
    
    
    <?php
    
    function contactsCreate($params, $token)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/contacts';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, $params);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    $params = http_build_query(array(
        'phone_number'  => '48500000000',   
        'email'         => 'bok@smsapi.com', 
        'first_name'    => "Name", 
        'last_name'     => "Last Name",
        'gender'        => "Gender",            // male or female
        'birthday_date' => "Birthday",          // YYYY-MM-DD
        'city'          => "City",
        'source'        => "source" 
    ));
    
    echo contactsCreate($params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Contacts\Bag\CreateContactBag;
    use Smsapi\Client\Feature\Contacts\Data\Contact;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Contact $contact */
    $contact = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->contactsFeature()
        ->createContact(CreateContactBag::withEmail('example@example.com'));
    
    var_dump($contact);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def create_contact():
        c = client.contacts.create_contact(
            first_name='first name',
            last_name='last name',
            phone_number=48500000000,
            email='adres email',
            birthday_date='1970-01-01',
            gender='{male|female|undefined}',
            city='city',
            description='description')
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.contacts.ContactAdd;
    import pl.smsapi.api.action.contacts.ContactsFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class AddContact {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                ContactsFactory contactsApi = new ContactsFactory(client, proxy);
    
                ContactAdd action = contactsApi.actionAdd();
                action.withEmail("example@example.com");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
        "id":"5b802315a788494a04690d1d",
        "first_name":"string",
        "last_name":"string",
        "phone_number":"48500000000",
        "email":"bok@smsapi.com",
        "gender":"gender",
        "city":"city",
        "date_created":"2018-08-24T17:24:05+02:00",
        "date_updated":"2018-08-24T17:24:05+02:00",
        "description":"description",
        "groups":
        [
            {
                "id":"59a3ca1fa78849062837cd0c",
                "name":"default",
                "date_created":"2017-08-28T09:45:35+02:00",
                "date_updated":"2017-08-28T09:45:35+02:00",
                "description":"",
                "created_by":"username",
                "idx":null,
                "contact_expire_after":null,
                "contacts_count":null
                }
        ]
    }
    
    

    b) in case of failure:

    
    {
        "message":"Contact already exists",
        "error":"contact_conflict",
        "code":409,
        "errors":[],
        "developer_description":null
    }
    
    
    Parameter Description
    token_api_oauth Token SMSAPI.
    phone_number Phone number.
    email Email address.
    first_name Name.
    last_name Last Name.
    gender Gender, male or female.
    birthday_date In format YYYY-MM-DD
    city City
    description Description


    If the request is successful:

    Response Description
    id Contact ID
    first_name Name saved in the contact database.
    last_name Last name saved in the contact database.
    phone_number Phone number saved in the contact database.
    email Email address saved in the contact database.
    gender Gender saved in the contact database.
    city City saved in the contact database.
    date_created The date of creating the contact in the database.
    date_updated Date of the last update of the contact in the database.
    description Description saved in the contact database.
    groups Groups to which contact belongs.


    If error occurred:

    Response Description
    message Error description.
    error Error type.
    errors error table.

    Edit contact

    The function allows you to edit the contact based on its ID.

    
    curl -X PUT -H "Authorization: Bearer token_api_oauth" -d 'email=tech@smsapi.com\
    &phone_number=48500000001&email=tech@smsapi.com&first_name=name&last_name=LastName&gender=Gender' https://api.smsapi.com/contacts/Contact_id
    
    
    
    <?php
    
    function putContact($id,$params,$token)
    {
    
        static $content;
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/contacts/'.$id);
        curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    
    $params = (array(
        'phone_number'  => '48500000001',   
        'email'         => 'tech@smsapi.com', 
        'first_name'    => "Name", 
        'last_name'     => "Last Name",
        'gender'        => "Gender",         // male or female
        'birthday_date' => "Birthday",       // YYYY-MM-DD
        'city'          => "City"
    ));
    
    $token = "token_api_oauth";            //https://ssl.smsapi.com/react/oauth/manage
    $id = "contact_id";                    //contact ID
    
    echo putContact($id, $params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Contacts\Bag\UpdateContactBag;
    use Smsapi\Client\Feature\Contacts\Data\Contact;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $update = new UpdateContactBag('contact_id');
    
    /** @var Contact $contact */
    $contact = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->contactsFeature()
        ->updateContact($update->setName('Name', 'Last name'));
    
    var_dump($contact);
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def update_contacts():
        c = client.contacts.update_contact(contact_id=1, description='new description', email='new email address')
    
        print(c.id, c.first_name, c.last_name, c.phone_number)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.contacts.ContactEdit;
    import pl.smsapi.api.action.contacts.ContactsFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class EditContact {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                ContactsFactory contactsApi = new ContactsFactory(client, proxy);
    
                ContactEdit action = contactsApi.actionEdit("contact_id");
                action.withFirstName("Name");
                action.withLastName("Lastname");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
       "id":"5b83ba81a788494a0469490f",
       "first_name":"Name",
       "last_name":"Last name",
       "phone_number":"48500000001",
       "email":"tech@smsapi.com",
       "gender":"undefined",
       "city":"City",
       "country":"Poland",
       "source":"source",
       "date_created":"2018-08-27T10:46:57+02:00",
       "date_updated":"2018-08-27T14:17:20+02:00",
       "groups":[
          {
             "id":"59a3ca1fa78849062837cd0c",
             "name":"default",
             "date_created":"2017-08-28T09:45:35+02:00",
             "date_updated":"2017-08-28T09:45:35+02:00",
             "description":"",
             "created_by":"username",
             "idx":null,
             "contact_expire_after":null,
             "contacts_count":null
          }
       ]
    }
    
    

    b) in case of failure:

    
    {
        "message":"Authorization failed",
        "error":"authorization_failed",
        "errors":null
    }
    
    
    Parameter Description
    token_api_oauth Token SMSAPI
    id Contact Id
    first_name Name
    last_name Last name
    phone_number Phone number
    email Email
    gender Gender
    city City
    date_created Date when contact created
    date_updated Date last contact update
    description Description


    If the request is successful:

    Response Description
    id Contact ID
    first_name Name saved in the contact database.
    last_name Last_name saved in the contact database.
    phone_number Phone number saved in the contact database.
    email Email address saved in the contact database.
    gender Gender saved in the contact database.
    city City saved in the contact database.
    date_created The date of creating the contact in the database.
    date_updated Date of the last update of the contact in the database.
    description Description saved in the contact database.
    groups Groups to which contact belongs.


    If error occur:

    Response Description
    message Error description.
    error Error type.
    errors error table.

    Assign contact to group

    
    curl -X PUT -H "Authorization: Bearer token_api_oauth" 
    'https://api.smsapi.com/contacts/{contactId}/groups/{groupId}'
    
    
    
    <?php
    
    function putContact($contactId, $groupId, $token)
    {
    
        static $content;
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/contacts/'.$contactId.'/groups/'.$groupId);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    $contactId = "contact_id";
    $groupId = "group_id";
    
    echo putContact($contactId, $groupId, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Contacts\Groups\Bag\AssignContactToGroupBag;
    use Smsapi\Client\Feature\Contacts\Data\Contact;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Contact $contact */
    $contact = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->contactsFeature()
        ->groupsFeature()
        ->assignContactToGroup(new AssignContactToGroupBag('contact_id', 'group_id'));
    
    var_dump($contact);
    
    

    Example response:

    a) in case of success:

    
    {
       "size":1,
       "collection":[
          {
             "id":"1238f47da26ee45dc41fb987",
             "name":"Test group",
             "date_created":"2022-04-01T12:00:00+02:00",
             "date_updated":"2022-04-01T12:00:00+02:00",
             "description":"",
             "created_by":"smsapi_user",
             "idx":"",
             "contact_expire_after":null,
             "contacts_count":1,
             "permissions":[
                {
                   "username":"smsapi_user",
                   "group_id":"1238f47da26ee45dc41fb987",
                   "write":true,
                   "read":true,
                   "send":true
                }
             ]
          }
       ]
    }
    
    

    b) in case of failure:

    
    {
      "message":"Authorization failed",
      "error":"authorization_failed",
      "errors":null
    }
    
    

    This function allows you to assign contact to selected group based on its ID.

    Parameter Description
    contactId Contact ID
    groupId Group ID




    To remove contact from the selected group, send a DELETE request instead of a PUT with the same parameters.

    Delete contacts

    The function allows you to delete a contact based on its ID.

    
    curl -X "DELETE" -H "Authorization: Bearer token_api_oauth" \
    https://api.smsapi.com/contacts/Contact_id
    
    
    
    <?php
    
    function deleteContact($contactID,$token)
    {
        $url = "https://api.smsapi.com/contacts/".$contactID;
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $contactID = "Contact_id"; 
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo deleteContact($contactID,$token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Contacts\Bag\DeleteContactBag;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->contactsFeature()
        ->deleteContact(new DeleteContactBag('000000000000000000000000'));
    
    
    
    from smsapi.client import Client
    
    client = Client("https://api.smsapi.com", access_token="%SMSAPI_ACCESS_TOKEN%")
    
    def remove_contact():
        client.contacts.delete_contact(contact_id=1)
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.contacts.ContactDelete;
    import pl.smsapi.api.action.contacts.ContactsFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class DeleteContact {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                ContactsFactory contactsApi = new ContactsFactory(client, proxy);
    
                ContactDelete action = contactsApi.actionDelete("contact_id");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    11. Black List

    Endpoint blacklist allows you to perform operations on blacklist.

    Blacklist option allows you to add numbers to which sending SMS messages will be blocked on your account (e.g. if client from your database don't want to receive SMS from you anymore). You may also set expiration date for each record after which number will not be blocked any more.

    List Blacklist

    
    curl -H "Authorization: Bearer token_api_oauth" -H \  
    "Content-Type: application/json" -X GET https://api.smsapi.com/blacklist/phone_numbers
    
    
    
    <?php
    
    function getBlacklist($token)
    {
    
        static $content;
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/blacklist/phone_numbers');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo getBlacklist($token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Blacklist\Bag\FindBlacklistedPhoneNumbersBag;
    use Smsapi\Client\Feature\Blacklist\Data\BlacklistedPhoneNumberFactory;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Blacklist $blacklist */
    $blacklist = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->blacklistFeature()
        ->findBlacklistedPhoneNumbers(new FindBlacklistedPhoneNumbersBag());
    
    var_dump($blacklist);
    
    

    Example response:

    a) in case of success:

    [{
        "id":"ID_number", 
        "phone_number":"48500000000", 
        "created_at":"2018-11-08T09:36:53+01:00",
        "expire_at":"2021-03-16"
    },
    {
        "id":"ID_number", 
        "phone_number":"48500000001", 
        "created_at":"2018-11-08T09:36:53+01:00",
        "expire_at":null
    }]
    
    

    b) in case of failure:

    
    {
        "error": 101,
        "message": "authorization_failed"
    }
    
    
    Parameter Description
    token_api_oauth SMSAPI token
    id Id query
    phone_number The number added to the blacklist
    created_at Date of being added to the blacklist
    expire_at The expiration date of the entry to the blacklist (if "null" it never expires)

    Adding number to Black list

    This function allows you to add a number to your Black list.

    
    curl -i -H "Authorization: Bearer token_api_oauth" -H  "Content-Type: application/json" -X POST -d \
    '{"phone_number":"48500000000","expire_at":"2021-03-16"}' https://api.smsapi.com/blacklist/phone_numbers
    
    
    
    <?php
    
    function addNumbertoblacklist($params, $token)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/blacklist/phone_numbers';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    $params = array(
            'phone_number'  => '48500000000',
            'expire_at'     => '2021-03-16',    
            );
    
    
    echo addNumbertoblacklist($params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Blacklist\Bag\CreateBlacklistedPhoneNumberBag;
    use Smsapi\Client\Feature\Blacklist\Data\BlacklistedPhoneNumberFactory;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Blacklist $blacklist */
    $blacklist = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->blacklistFeature()
        ->createBlacklistedPhoneNumber(new CreateBlacklistedPhoneNumberBag('48500000000'));
    
    var_dump($blacklist);
    
    

    Example response:

    a) in case of success:

    {
        "id":"ID_number", 
        "phone_number":"48500000000", 
        "created_at":"2018-11-08T09:36:53+01:00",
        "expire_at":"2021-03-16"
    }
    
    

    b) in case of failure:

    
    {
        "error": 101,
        "message": "authorization_failed"
    }
    
    
    Parameter Description
    token_api_oauth SMSAPI token
    id Id query
    phone_number The number added to the blacklist
    created_at Date of being added to the blacklist
    expire_at The expiration date of the entry to the blacklist (if "null" it never expires)

    Delete number from Blacklist

    This function allows you to remove the number from the blacklist.

    
    curl -X "DELETE" -H "Authorization: Bearer token_api_oauth" \
    https://api.smsapi.com/blacklist/phone_numbers/entry_Id
    
    
    
    <?php
    
    function deleteNumberfromblacklist($token,$Id)
    {
        $url = "https://api.smsapi.com/blacklist/phone_numbers/".$Id;
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    };
    
    $Id = '5BE3F5A53738306F740DB6DB';   //Id of the entry to be removed from the blacklist 
    $token = "token_api_oauth";         //https://ssl.smsapi.com/react/oauth/manage
    
    echo deleteNumberfromblacklist($token,$Id);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Blacklist\Bag\DeleteBlacklistedPhoneNumberBag;
    use Smsapi\Client\Feature\Blacklist\Data\BlacklistedPhoneNumberFactory;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Blacklist $blacklist */
    $blacklist = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->blacklistFeature()
        ->deleteBlacklistedPhoneNumber(new DeleteBlacklistedPhoneNumberBag('record_id'));
    
    

    Clear blacklist

    This function allows you to remove all numbers from the blacklist.

    
    curl -X "DELETE" -H "Authorization: Bearer token_api_oauth" \
    https://api.smsapi.com/blacklist/phone_numbers
    
    
    
    <?php
    
    function deleteAllNumbersFromBlacklist($token)
    {
        $url = "https://api.smsapi.com/blacklist/phone_numbers";
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    };
    
    $token = "token_api_oauth";         //https://ssl.smsapi.com/react/oauth/manage
    
    echo deleteAllNumbersFromBlacklist($token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Blacklist $blacklist */
    $blacklist = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->blacklistFeature()
        ->deleteBlacklistedPhoneNumbers();
    
    

    12. User accounts administration

    User's list

    This function allows you to display users.

    curl -i -H "Authorization: Bearer token_api_oauth"\
    -H  "Content-Type: application/json" -X GET https://api.smsapi.com/subusers
    
    
    
    <?php
    
    function getSubusers($token)
    {
    
        static $content;
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/subusers');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo getSubusers($token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Subusers\Data\Subuser;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Subuser[] $subusers */
    $subusers = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->subusersFeature()
        ->findSubusers();
    
    var_dump($subusers);
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.subusers.Subusers;
    import pl.smsapi.api.action.subusers.SubusersFactory;
    import pl.smsapi.api.action.subusers.SubusersList;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class ListSubusers {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SubusersFactory subusersApi = new SubusersFactory(client, proxy);
    
                SubusersList action = subusersApi.actionList();
    
                Subusers subusers = action.execute();
    
                subusers.list.forEach(subuser -> System.out.println(subuser.username));
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    [{
      "id":"5A5359173738303F2F95B7E2",
      "username":"subuser1",
      "active":true,
      "description":null,
      "points":{
        "from_account":10.0,
        "per_month":0.0
      }
    },
    {
      "id":"5A5359173738303F2F95B7E2",
      "username":"subuser2",
      "active":true,
      "description":null,
      "points":{
        "from_account":10.0,
        "per_month":0.0
      }
    }]
    
    

    b) in case of failure:

    
    {
      "error": 123,
      "message": "error message"
    }
    
    
    Parameter Description
    id userid
    username User name
    active "true" - active, "false" - inactive
    description Subuser description
    from_account Account balance
    per_month Monthly renewable limit

    Adding new sub-user account

    This function allow you to add users.

    Example request:

    curl -i -H "Authorization: Bearer token_api_oauth"\ 
    -H  "Content-Type: application/json" -X POST -d \ 
    '{"credentials":{"username":"User_name","password":"Smsapi_panel_password","api_password":"api_password"},\
    "active":"1","description":"description","points":{"from_account":"2","per_month":"2"}}'\
    https://api.smsapi.com/subusers
    
    
    
    <?php
    
    function subuserCreate($params, $token)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/subusers';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    $params = array(
        'credentials'    => array(
            'username'      => 'Subuser name',  
            'password'      => 'Smsapi_panel_password', 
            'api_password'  => 'api_password' 
        ),
        'active'         => true,
        'description'    => "description",      
        'points'         => array( 
            'from_account'  => 2,    
            'per_month'     => 2     
        )
    
    );
    
    echo subuserCreate($params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Subusers\Bag\CreateSubuserBag;
    use Smsapi\Client\Feature\Subusers\Data\Subuser;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Subuser $subuser */
    $subuser = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->subusersFeature()
        ->createSubuser(new CreateSubuserBag('username', 'password'));
    
    var_dump($subuser);
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.subusers.SubuserAdd;
    import pl.smsapi.api.action.subusers.SubusersFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class AddSubuser {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SubusersFactory subusersApi = new SubusersFactory(client, proxy);
    
                SubuserAdd action = subusersApi.actionAdd("username", "password");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
      "id":"ABCD1234EFGH9876ABCD1234",
      "username":"subuser123",
      "active":true,
      "description":"new subuser for tests",
      "points":
      {
        "from_account":2.0,     //Account balance
        "per_month":2.0         //Monthly renewable limit
      }
    }
    
    

    b) in case of failure:

    
    {
      "message":"Username already exists",
      "error":"invalid_domain_logic",
      "errors":[
      {
        "error":"invalid_domain_logic",
        "message":"Username already exists"
      }]
    }
    
    
    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    username New sub-user's name (without main user prefix)
    password Sub-user's password hashed with md5
    api_password Sub-user's API password hashed with MD5.
    from_account Credit limit granted to the sub-user account
    per_month Month limit the amount that will be granted 1st day of every month.
    active Activating sub-user's account (available values: 1 – active, 0 – inactive, default value is 0).
    description Additional account's description

    Deleting user

    This function allows you to delete the subuser with a given ID.

    
    curl -X "DELETE" -H "Authorization: Bearer token_api_oauth" \
    https://api.smsapi.com/subusers/{subuser_id}
    
    
    
    <?php
    
    function deleteSubuser($token,$userID)
    {
        $url = "https://api.smsapi.com/subusers/".$userID;
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "DELETE");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $userID = "{subuser_id}";    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo deleteSubuser($token,$userID);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Subusers\Bag\DeleteSubuserBag;
    use Smsapi\Client\Feature\Subusers\Data\SubuserFactory;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Subusers $subusers */
    $subusers = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->subusersFeature()
        ->deleteSubuser(new DeleteSubuserBag('subuser_id'));
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.subusers.SubuserDelete;
    import pl.smsapi.api.action.subusers.SubusersFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class DeleteSubuser {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SubusersFactory subusersApi = new SubusersFactory(client, proxy);
    
                SubuserDelete action = subusersApi.actionDelete("subuser_id");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    
    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system
    subuser_id User id (subuser)

    Editing sub-user account

    curl -X PUT -H "Content-Type: application/json" \
    -H "Authorization: Bearer token_api_oauth" -d\
    '{"credentials":{"password":"Customer_portal_password","api_password":"API_password"}, \
    "active":"1","description":"Test description","points":{"from_account":"2","per_month":"2"}}'
    'https://api.smsapi.com/subusers/{subuser_id}'
    
    
    
    <?php
    
    function putSubuser($id,$params,$token)
    {
    
        static $content;
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/subusers/'.$id);
        curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $params = array(
        'credentials'    => array(  
            'password'      => 'password to Customer Portal', 
            'api_password'  => 'API password' 
        ),
        'active'         => true,
        'description'    => "test description",     
        'points'         => array( 
            'from_account'  => 2,    //Credit limit granted to the sub-user account
            'per_month'     => 2     //Month limit the amount that will be granted 1st day of every month
        )
    
    );
    
    $token = "token_smsapi";      //https://ssl.smsapi.com/react/oauth/manage
    $id = "subuser_id";           //subuser ID
    
    echo putSubuser($id, $params, $token);
    
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Subusers\Bag\UpdateSubuserBag;
    use Smsapi\Client\Feature\Subusers\Data\Subuser;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Subuser $subuser */
    $updateSubuserBag = new UpdateSubuserBag('000000000000000000000000');
    $updateSubuserBag->active = true;
    
    $subuser = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->subusersFeature()
        ->updateSubuser($updateSubuserBag);
    
    var_dump($subuser);
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.subusers.SubuserEdit;
    import pl.smsapi.api.action.subusers.SubusersFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class EditSubuser {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SubusersFactory subusersApi = new SubusersFactory(client, proxy);
    
                SubuserEdit action = subusersApi.actionEdit("subuser_id");
                action.asActive();
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
      "id":"5A8D6E6F373830607C87B277",
      "username":"Subuser name",
      "active":true,
      "description":"Description",
      "points":{
        "from_account":2,
        "per_month":2
      }
    }
    
    

    b) in case of failure:

    
    {
      "error": 123,
      "message": "error message"
    }
    
    

    User's account administration is done by sending HTTP GET or POST request to our system:

    Parameter Description
    subuser_id Sub-user ID
    token_api_oauth OAuth token used to authenticate in our system
    username Sub-user's name
    password Password to Customer Portal
    api_password API password
    from_account Credit limit granted to the sub-user account
    per_month Month limit the amount that will be granted 1st day of every month
    active Activating sub-user's account (available values: 1 – active, 0 – inactive, default value is 0)
    description Additional description

    Sharing sender names

    
    curl -X PUT -H "Content-Type: application/json" \
    -H "Authorization: Bearer token_api_oauth" \
    -d '{"access":"selected","senders":["sender_name1","sender_name3"]}' \
    'https://api.smsapi.com/subusers/{subuser_id}/shares/sendernames'
    
    
    
    <?php
    
    function putAccess($id,$params,$token)
    {
    
        $c = curl_init();
    
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/subusers/'.$id.'/shares/sendernames');
        curl_setopt($c, CURLOPT_POSTFIELDS, http_build_query($params));
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_CUSTOMREQUEST, "PUT");
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    $id = "subuser_id"; //Subuser id for whom we modify access to the sender names
    
    
    $params = array(
        'access'    => "selected", //none | selected | all 
        'senders'   =>  ["sender_name1","sender_name3"]
        );
    
    echo putAccess($id,$params,$token);
    
    ?>
    
    

    Function allows to manage the shared sender names for subuser.

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system
    subuser_id User id (subuser)
    access Type of access to the sender names from main account ("none" / "selected" / "all")
    senders Table with a list of the sender names to share for the sub-account. Parameter set when parameter access = 'selected'

    13. Sender names

    Add sender name

    
    curl -X POST "https://api.smsapi.com/sms/sendernames" \
    -H "Authorization: Bearer token_api_oauth" -d "sender=new_sender_name"
    
    
    
    <?php
    
    function add_sendername($token, $params)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/sms/sendernames';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, $params);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
        $http_status = curl_getinfo($c, CURLINFO_HTTP_CODE);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth";     //https://ssl.smsapi.pl/react/oauth/manage
    
    
    $params = array(
      'sender' => 'new_sender_name',
    );
    
    echo add_sendername($token, $params);
    
    ?>
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.sms.sendernames.SendernameAdd;
    import pl.smsapi.api.action.sms.sendernames.SendernamesFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class AddSendername {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SendernamesFactory sendernamesApi = new SendernamesFactory(client, proxy);
    
                SendernameAdd action = sendernamesApi.actionAdd("new_sender_name");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
    {
      "sender":"new_seder_name",
      "is_default":false,
      "status":"INACTIVE",
      "created_at":"2020-01-01T00:00:00+02:00"
    }
    
    HTTP201 code is also returned
    
    

    b) in case of failure:

    
    {
      "message":"Sendername is not valid",
      "error":"invalid_sender",
      "errors":[
        {
          "error":"invalid_sender",
          "message":"Sendername is not valid"
        }]
    }
    
    

    The function of adding sender names requires additional activation. To activate the function, please contact the Customer Service Office.

    Adding new sender names is done by sending a request using the POST method.

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system
    sender The sender name to be added

    Checking sender name status

    The function allows displaying the status of the sender name.

    curl -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms/sendernames/{sender}
    
    
    
    <?php
    
    function getSender($token, $sender)
    {
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/sms/sendernames/'.$sender);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    $sender = "sender_name";
    
    echo getSender($token, $sender);
    
    ?>
    
    

    Example response:

    a) in case of success:

    
    {
      "sender":"sender_name",
      "is_default":false,
      "status":"ACTIVE",
      "created_at":"2020-01-01T00:00:00+02:00"
    }
    
    

    b) in case of failure:

    
    {
      "message":"Sendername not exists",
      "error":"not_found_sendername",
      "errors":[
        {
          "error":"not_found_sendername",
          "message":"Sendername not exists"
        }]
    }
    
    

    Sender name status check is done by sending HTTP GET request to our system:

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    {sender} Sender name that should be checked.

    Checking list of sender names

    The function allows displaying the list of sender names.

    curl -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms/sendernames"
    
    
    
    <?php
    
    function getSenderlist($token)
    {
    
        static $content;
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/sms/sendernames');
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo getSenderlist($token);
    
    ?>
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.sms.sendernames.Sendernames;
    import pl.smsapi.api.action.sms.sendernames.SendernamesFactory;
    import pl.smsapi.api.action.sms.sendernames.SendernamesList;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class ListSendernames {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SendernamesFactory sendernamesApi = new SendernamesFactory(client, proxy);
    
                SendernamesList action = sendernamesApi.actionList();
    
                Sendernames sendernames = action.execute();
    
                sendernames.list.forEach(sendername -> System.out.println(sendername.sender));
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    {
    "collection":[
        {
            "sender":"sender_name1",
            "is_default":false,
            "status":"ACTIVE",
            "created_at":"2018-09-23T12:00:00+02:00"
        },
        {
            "sender":"sender_name2",
            "is_default":true,
            "status":"ACTIVE",
            "created_at":"2019-05-19T16:00:00+02:00"
        },
        {
            "sender":"sender_name3",
            "is_default":false,
            "status":"INACTIVE",
            "created_at":"2020-01-01T00:30:00+02:00"
        }
    ],
    "size":3
    }
    
    

    b) in case of failure:

    
    {
        "message":"Authorization failed",
        "error":"authorization_failed",
        "developer_description":null,
        "errors":null
    }
    
    

    Setting default sender name

    The function allows setting the default sender name.

    curl -H "Authorization: Bearer token_api_oauth" \
    -X POST "https://api.smsapi.com/sms/sendernames/{sender}/commands\
    /make_default"
    
    
    <?php
    
    function DefaultSendername($token,$sender)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/sms/sendernames/'.$sender.'commands/make_default';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    $sender = "sender_name";
    
    echo DefaultSendername($token,$sender);
    
    ?>
    
    
    import pl.smsapi.OAuthClient;
    import pl.smsapi.api.action.sms.sendernames.SendernameMakeDefault;
    import pl.smsapi.api.action.sms.sendernames.SendernamesFactory;
    import pl.smsapi.exception.SmsapiException;
    import pl.smsapi.proxy.ProxyNative;
    
    public class MakeDefaultSendername {
        public static void main(String[] args) {
            try {
                String oauthToken = "00000000000000000000000000000000";
                OAuthClient client = new OAuthClient(oauthToken);
                ProxyNative proxy = new ProxyNative("https://api.smsapi.com/");
    
                SendernamesFactory sendernamesApi = new SendernamesFactory(client, proxy);
    
                SendernameMakeDefault action = sendernamesApi.actionMakeDefault("default_sender_name");
    
                action.execute();
    
            } catch (SmsapiException e) {
                System.out.println("Exception: " + e.getMessage());
            }
        }
    }
    

    Example response:

    a) in case of success:

    
        Only HTTP204 is returned
    
    

    b) in case of failure:

    
    {
        "message":"Sendername not exists",
        "error":"not_found_sendername",
        "errors":[
            {
                "error":"not_found_sendername",
                "message":"Sendername not exists"
            }
        ]
    }
    
    

    Default sender name is the name that will be used when parameter &from= is empty or when this parameter is missing. Default sender name has to be active. For setting default sender name parameter &default=sender_name is used, where sender_name is the name that should be set as default.

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    {sender} Sender name that should be set as default

    14. Price list

    curl -X GET -H "Authorization: Bearer token_api_oauth"\
    "https://api.smsapi.com/profile/prices?limit=ALL"
    
    
    <?php
    
    function getPrices($token)
    {
    
        static $content;
    
        $url = 'https://api.smsapi.com/profile/prices?limit=ALL';
    
        $c = curl_init();
        curl_setopt($c, CURLOPT_URL, $url);
        curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($c, CURLOPT_HTTPHEADER, array(
            "Authorization: Bearer $token"
        ));
    
        $content = curl_exec($c);
    
        curl_close($c);
        return $content;
    }
    
    $token = "token_api_oauth"; //https://ssl.smsapi.com/react/oauth/manage
    
    echo getPrices($token);
    ?>
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Profile;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Profile $profile */
    $profile = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->profileFeature()
        ->findProfilePrices();
    
    var_dump($profile);
    
    

    Example response:

    a) in case of success:

    
    {
        "collection":[
        {
            "type":"sms",
            "country":{
                "name":"Falkland Islands",
                "mcc":750
            },
            "network":{
                "name":"sure (Batelco)",
                "mnc":1
            },
            "changed_at":"2015-06-30",
            "price":{
                "amount":0.0413,
                "currency":"EUR"
            }
        }
        ],
        "size": 1
    }
    
    

    b) in case of failure:

    
    {
        "message":"Error message",
        "error":"something_failed",
        "developer_description":null,
        "errors":null
    }
    
    

    Endpoint profile/prices allows downloading current prices for services on SMSAPI platform.

    Parameter Description
    token_api_oauth OAuth token used to authenticate in our system.
    Response data Description
    type Service type
    country.name Country name
    network.name Network name
    country.mcc Mobile Country Code
    network.mnc Mobile Network Code
    changed_at Date of the last price change, expressed in UNIX timestamp
    price.amount Amount per unit
    price.currency Currency of amount

    15. SMS Authenticator

    SMS Authenticator is an implementation of one factor, that can be a part Multi-factor authentication (MFA) and allows to make user/client authorization simple. It's realized in two steps. Firstly, shipment of automatic generated authorization code in SMS message. Second, verification that the code typed by the user is valid. Authorization code is valid for 180 seconds.

    Messages sent via SMS Authenticator are by default FAST messages (cost 50% more than normal message). If messages are to be sent without the FAST option, the parameter fast = 0 should be added in the request.

    Code sending

    
    curl -H "Authorization: Bearer token_api_oauth" \
    -H "Content-Type: application/json" -X POST -d\
    '{"phone_number":"49500500500","from":"Test","content":"Your code: [%code%]","fast":"1"}'\
    https://api.smsapi.com/mfa/codes
    
    
    
    <?php
    $url = 'https://api.smsapi.com/mfa/codes';
    $ch = curl_init($url);
    $params = array(
        'phone_number' => '49500500500',          //recipient phone number
        'from'         => 'Test',                 //sendername made in https://ssl.smsapi.com/sms_settings/sendernames
        'content'      => 'Your code: [%code%]',  //content of one message with [%code%] filed (optional parameter)
        'fast'         => '1'                     //message type (default fast=1)
    );
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer token_api_oauth'));
    $result = curl_exec($ch);
    ?>  
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Mfa;
    use Smsapi\Client\Feature\Mfa\Bag\CreateMfaBag;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    $createMfaBag = new CreateMfaBag('49500500500');
    $createMfaBag->from = 'Test';
    $createMfaBag->content = 'Your code: [%code%]';
    
    /** @var Mfa $mfa */
    $mfa = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->mfaFeature()
        ->generateMfa($createMfaBag);
    
    var_dump($mfa);
    
    

    Example Response:

    {
      "id":"5ADEF4DC3738305BEED02B0C",
      "code":"123456",
      "phone_number":"49500500500",
      "from":"Test"
    }
    

    Shipment with authorization code could be made by POST request to API with recipient mobile number as a parameter.

    Parameter Description
    token_api_oauth OAuth token generated in SMSAPI Customer Portal
    phone_number Mobile number of authorization SMS recipient
    from The sender name from which the authorization SMS will be sent. If the from parameter is missing, the message will be sent with the default sender name for the account
    content Personalized authorization message with the [%code%] field. If the content parameter is missing, the message will be sent with the default content
    fast Setting the priority of the sent message, by default fast=1 with quickest possible time of delivery, costs 50% more than normal message

    The result of a response is json with parameters:

    Parameter Description
    id Event ID
    code Authorization code sent to recipient
    phone_number Mobile number of authorization SMS recipient
    from The sender name from which the authorization SMS was sent

    Checking the validity of the code

    
    curl -H "Authorization: Bearer token_api_oauth"\
    -H "Content-Type: application/json" -X POST -i -d\
    '{"phone_number":"49500500500","code":"123456"}'\
    https://api.smsapi.com/mfa/codes/verifications
    
    
    
    <?php
    $url = 'https://api.smsapi.com/mfa/codes/verifications';
    $ch = curl_init($url);
    $params = array(
        'phone_number' => '49500500500',    // phone number 
        'code'         => '123456'          // code to check
    );
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer token_api_oauth'));
    $result = curl_exec($ch);
    ?>  
    
    
    
    <?php
    
    declare(strict_types=1);
    
    require_once 'vendor/autoload.php';
    
    use Smsapi\Client\Feature\Mfa;
    use Smsapi\Client\Feature\Mfa\Bag\VerificationMfaBag;
    use Smsapi\Client\Curl\SmsapiHttpClient;
    
    /** @var Mfa $mfa */
    $mfa = (new SmsapiHttpClient())
        ->smsapiComService('token_api_oauth')
        ->mfaFeature()
        ->verifyMfa(new VerificationMfaBag('123456', '49500500500'));
    
    var_dump($mfa);
    
    

    Example Response:

    
    HTTP/1.1 204 
    
    

    Verification of authorization code could be made by POST request to API with two parameters, recipient mobile phone number, and authorization code that user typed.

    Parameter Description
    token_api_oauth OAuth token generated in SMSAPI Customer Portal
    code Authorization code typed by SMS recipient
    phone_number Mobile number of authorization SMS recipient

    The result of a response is HTTP CODE that supported 3 events:

    Status Description
    204 Valid code
    404 Wrong code
    408 Expired code (valid for 180 seconds)

    16. Special characters

    List of special chars that may be changed to normal ones using parameter &normalize:

    'normalize_chars' => array(
                            'Š'=>'S', 'š'=>'s', 'Ś'=>'S', 'ś'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'ź'=>'z', 'ż'=>'z','Ź'=>'Z',
                            'Ż'=>'Z', 'Ž'=>'Z','ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c', 'À'=>'A', 'Ą'=>'A', 
                            'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
                            'Ę'=>'E', 'ę'=>'e', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I','Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N',
                            'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Ł'=>'L', 'ł'=>'l', 'Ń'=>'N', 'ń'=>'n', 'Õ'=>'O','Ö'=>'O',
                            'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'þ'=>'B', 'ß'=>'Ss','à'=>'a', 
                            'ą'=>'a','á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 
                            'é'=>'e', 'ê'=>'e', 'ë'=>'e','ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n',
                            'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o','ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u',
                            'ý'=>'y',  'þ'=>'b', 'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',
                            }
    
    

    Special characters are these that don't fulfil regular expression: @£$¥èéùìòÇØøÅå_^{}\[~]|ÆæßÉ!"#¤%&'()*+,-./0- 9:;<=>?A-ZÄÖÑܧ¿a-zäöñüà"enter"

    Points charges table:

    Without special characters

    Characters amount Number of parts
    160 1 part
    306 2 parts
    459 3 parts
    612 4 parts
    765 5 parts
    918 6 parts

    With special characters

    Characters amount Number of parts
    70 1 part
    134 2 parts
    201 3 parts
    268 4 parts
    335 5 parts
    402 6 parts

    17. Delivery statuses

    Status list:

    Number Status Description
    401 NOT_FOUND Wrong ID or report has expired
    402 EXPIRED Messages expired.
    403 SENT Message is sent without a final delivery report.
    404 DELIVERED Message is delivered to the recipient
    405 UNDELIVERED Message is undelivered (invalid number, roaming error etc)
    406 FAILED Sending message failed – please report it to us
    407 REJECTED Message is undelivered (invalid number, roaming error etc)
    408 UNKNOWN No report (the message may be either delivered or not)
    409 QUEUE Message is waiting to be sent
    410 ACCEPTED Message is delivered to the operator
    412 STOP Bulk has been stopped by the user.

    18. Error codes

    Error codes list:

    ERROR Description
    7 Short links disabled on account
    8 Error in request (Please report)
    11 The message is too long or there is no message or parameter: nounicode is set and special characters (including Polish characters) are used
    12 The message has more parts than defined in &max_parts parameter.
    13 Lack of valid phone numbers (invalid or blacklisted numbers)
    14 Wrong sender name
    17 FLASH message cannot contain special characters
    18 Invalid number of parameters
    19 Too many messages in one request (number of messages in on request exceeded, when short link is used, limit is 100)
    20 Invalid number of IDX parameters
    25 Parameters &normalize and &datacoding mustn't appear in the same request.
    27 Too long IDX parameter. Maximum 255 chars.
    28 Invalid time_restriction parameter value. Available values are: follow, ignore or nearest_available
    30 Wrong UDH parameter when &datacoding=bin
    40 No group with given name in contacts database
    41 Chosen group is empty
    50 Messages may be scheduled up to 3 months in the future
    52 Too many attempts of sending messages to one number (maximum 10 attempts within 60s)
    53 Not unique idx parameter, message with the same idx has been already sent and &check_idx=1.
    54 Wrong date - (only unix timestamp and ISO 8601)
    56 The difference between date sent and expiration date can't be less than 1 and more than 72 hours.
    57 The number is blacklisted for this user.
    59 Number is added to OptOut list
    70 Invalid URL in notify_url parameter.
    74 Sending date doesn't match date sent restrictions set for the account.
    76 Invalid characters in request parameters
    93 Message parameters and group parameter cannot be used simultaneously.
    94 Not allowed to send messages with link.
    96 Account country volumes restrictions have been reached
    98 Your account is restricted. You can send only to number used in account registration process.
    101 Invalid authorization info
    102 Invalid username or password
    103 Insufficient credits on Your account
    104 No such template
    105 Wrong IP address (for IP filter turned on)
    106 Invalid cut.li link
    110 Action not allowed for your account
    112 Sending messages to phone numbers from this country is restricted on your account
    200 Unsuccessful message submission
    201 System internal error (please report)
    202 Too many simultaneous request, the message won't be sent
    203 Too many requests. Please try again later. Refers to https://api.smsapi.pl/subusers
    301 ID of messages doesn't exist
    400 Invalid message ID of a status response
    401 Token don't have permissions for this action
    409 Value already exists
    997 HTTP requests have been disabled for your account, please use secure connection (HTTPS)
    998 Short url service is unavailable
    999 System internal error (please report)
    1000 Action available only for the main user
    1001 Invalid action (expected one of following parameters: add_user, set_user, get_user, credits)
    1010 Sub-user-s adding error
    1020 Sub-user-s editing error
    1021 No data to edit, at least one parameter has to be edited
    1030 Checking user's data error
    1032 Sub-user doesn't exist for this main user. This error may also occur when trying to get a subuser which does not contain main account username prefix and not using without_prefix parameter.
    1100 Sub-user's data error
    1110 Invalid new sub-user's name
    1111 New sub-user's name is missing
    1112 Too short new sub-user's name, it has to contain minimum 3 characters
    1113 Too long new sub-user's name, sub-user's name with main user's prefix may contain maximum 32 characters
    1114 Not allowed characters occurred in sub-user's name, following are allowed: letters [A – Z], digits [0 – 9] and following others @, -, _ and .
    1115 Another user with the same name exists
    1120 New sub-user's password error
    1121 Password too short
    1122 Password too long
    1123 Password should be hashed with MD5
    1130 Credit limit error
    1131 Parameter limit ought to be a number
    1140 Month limit error
    1141 Parameter month_limit ought to be a number
    1150 Wrong senders parameter value, binary 0 and 1 values allowed
    1160 Wrong phonebook parameter value, binary 0 and 1 values allowed
    1170 Wrong active parameter value, binary 0 and 1 values allowed
    1180 Parameter info error
    1183 Parameter info is too long
    1190 API password for sub-user's account error
    1192 Wrong API password length (password hashed with MD5 should have 32 chars)
    1193 API password should be hashed with MD5
    2001 Invalid action (parameter add, status, delete or list expected)
    2010 New sender name adding error
    2030 Sender name's status checking error
    2031 Such sender name doesn't exist
    2060 Default sender name error
    2061 Sender name has to be active for setting it as default
    2062 This sender name is already set as default
    2100 Data error
    2110 Sender name error
    2111 Sender name is missing for adding new sender name action (parameter &add is empty)
    2112 Invalid Sender Name's name (i.e. Name containing special chars or name too long), sender name may contain up to 11 chars, chars allowed: a-z A-Z 0-9 - . [space]
    2115 Sender name already exists
    4000 General contacts database error.
    4001 Action not available for this account.
    4002 Invalid action.
    4003 Invalid parameter usage.
    4004 Too large limit parameter value (i.e. for list_contacts action maximum value is 200).
    4100 General groups' action error.
    4101 Group not found.
    4110 General group's name error.
    4111 Invalid group's name.
    4112 Group's name cannot not be empty.
    4113 Group's name too short (min 2 chars).
    4114 Group's name too long (max 32 chars).
    4115 Forbidden chars appeared in group's name.
    4116 Group already exists.
    4121 Invalid Info field value for groups.
    4122 Too long Info field value for contact (max 200 chars).
    4200 General contact error.
    4201 Contact not found.
    4210 General phone number error.
    4211 Invalid phone number.
    4212 Contact has to contain a phone number.
    4213 Phone number is too short.
    4214 Phone number is too long.
    4220 First name error.
    4221 First name too short (min 2 chars).
    4222 First name too long (max 100 chars).
    4230 Last name error.
    4231 Last name too long (min2 chars).
    4232 Last name too long (max 100 chars).
    4240 Contact Info field error.
    4241 Too long Info field value for contact (max 200 chars).
    4250 E-mail address error for this contact.
    4260 Birthdate error of this contact.
    4270 Group error for this contact.
    4271 Group not found.
    4272 Group name is necessary for group actions.
    4280 Gender error.

    HLR error code list

    HLR errors list

    Error Description
    UNKNOWN_SUBSCRIBER Invalid, not active number. Error is permanent.
    ABSENT_SUBSCRIBER Number turned off or out of range. Number is considered to be inactive but it may change back to active once it is in range. Error is temporary.
    TELESERVICE_NOT_PROVISIONED The recipient has no SMS subscription. Error is permanent.
    SYSTEM_FAILURE Temporary network or protocol failure
    HLR_LOCAL_CANCEL / HLR_ABORT Temporary problem or lost reach
    CALL_BARRED Barring of the recipient's number. Error is permanent.

    19. 7-bit GSM alphabet

    This is the 7 bit default alphabet as specified by GSM 03.38.

    All chars outside this charset are considered to be special chars and cause shortening single message from 160 chars to 70 chars. Using only chars from this list won't shorten the message.

    Notice that characters ^ { } [ ] \ ~ | [enter] € are counted double when sending message without special chars because of GSM specification requirements.

    Character Character name HEX DEC
    @ COMMERCIAL AT 0x00 0
    £ POUND SIGN 0x01 1
    $ DOLLAR SIGN 0x02 2
    ¥ YEN SIGN 0x03 3
    è LATIN SMALL LETTER E WITH GRAVE 0x04 4
    é LATIN SMALL LETTER E WITH ACUTE 0x05 5
    ù LATIN SMALL LETTER U WITH GRAVE 0x06 6
    ì LATIN SMALL LETTER I WITH GRAVE 0x07 7
    ò LATIN SMALL LETTER O WITH GRAVE 0x08 8
    Ç LATIN CAPITAL LETTER C WITH CEDILLA 0x09 9
    LINE FEED 0x0A 10
    Ø LATIN CAPITAL LETTER O WITH STROKE 0x0B 11
    ø LATIN SMALL LETTER O WITH STROKE 0x0C 12
    CARRIAGE RETURN 0x0D 13
    Å LATIN CAPITAL LETTER A WITH RING ABOVE 0x0E 14
    å LATIN SMALL LETTER A WITH RING ABOVE 0x0F 15
    Δ GREEK CAPITAL LETTER DELTA 0x10 16
    _ LOW LINE 0x11 17
    Φ GREEK CAPITAL LETTER PHI 0x12 18
    Γ GREEK CAPITAL LETTER GAMMA 0x13 19
    Λ GREEK CAPITAL LETTER LAMBDA 0x14 20
    Ω GREEK CAPITAL LETTER OMEGA 0x15 21
    Π GREEK CAPITAL LETTER PI 0x16 22
    Ψ GREEK CAPITAL LETTER PSI 0x17 23
    Σ GREEK CAPITAL LETTER SIGMA 0x18 24
    Θ GREEK CAPITAL LETTER THETA 0x19 25
    Ξ GREEK CAPITAL LETTER XI 0x1A 26
    ESCAPE TO EXTENSION TABLE 0x1B 27
    FORM FEED 0x1B0A 27 10
    ^ CIRCUMFLEX ACCENT 0x1B14 27 20
    { LEFT CURLY BRACKET 0x1B28 27 40
    } RIGHT CURLY BRACKET 0x1B29 27 41
    '\' REVERSE SOLIDUS (BACKSLASH) 0x1B2F 27 47
    [ LEFT SQUARE BRACKET 0x1B3C 27 60
    ~ TILDE 0x1B3D 27 61
    ] RIGHT SQUARE BRACKET 0x1B3E 27 62
    VERTICAL BAR 0x1B40 27 64
    EURO SIGN 0x1B65 27 101
    Æ LATIN CAPITAL LETTER AE 0x1C 28
    æ LATIN SMALL LETTER AE 0x1D 29
    ß LATIN SMALL LETTER SHARP S (German) 0x1E 30
    É LATIN CAPITAL LETTER E WITH ACUTE 0x1F 31
    SPACE 0x20 32
    ! EXCLAMATION MARK 0x21 33
    \" QUOTATION MARK 0x22 34
    # NUMBER SIGN 0x23 35
    ¤ CURRENCY SIGN 0x24 36
    % PERCENT SIGN 0x25 37
    & AMPERSAND 0x26 38
    ' APOSTROPHE 0x27 39
    ( LEFT PARENTHESIS 0x28 40
    ) RIGHT PARENTHESIS 0x29 41
    * ASTERISK 0x2A 42
    + PLUS SIGN 0x2B 43
    , COMMA 0x2C 44
    - HYPHEN-MINUS 0x2D 45
    . FULL STOP 0x2E 46
    / SOLIDUS (SLASH) 0x2F 47
    0 DIGIT ZERO 0x30 48
    1 DIGIT ONE 0x31 49
    2 DIGIT TWO 0x32 50
    3 DIGIT THREE 0x33 51
    4 DIGIT FOUR 0x34 52
    5 DIGIT FIVE 0x35 53
    6 DIGIT SIX 0x36 54
    7 DIGIT SEVEN 0x37 55
    8 DIGIT EIGHT 0x38 56
    9 DIGIT NINE 0x39 57
    : COLON 0x3A 58
    ; SEMICOLON 0x3B 59
    < LESS-THAN SIGN 0x3C 60
    = EQUALS SIGN 0x3D 61
    > GREATER-THAN SIGN 0x3E 62
    ? QUESTION MARK 0x3F 63
    ¡ INVERTED EXCLAMATION MARK 0x40 64
    A LATIN CAPITAL LETTER A 0x41 65
    B LATIN CAPITAL LETTER B 0x42 66
    C LATIN CAPITAL LETTER C 0x43 67
    D LATIN CAPITAL LETTER D 0x44 68
    E LATIN CAPITAL LETTER E 0x45 69
    F LATIN CAPITAL LETTER F 0x46 70
    G LATIN CAPITAL LETTER G 0x47 71
    H LATIN CAPITAL LETTER H 0x48 72
    I LATIN CAPITAL LETTER I 0x49 73
    J LATIN CAPITAL LETTER J 0x4A 74
    K LATIN CAPITAL LETTER K 0x4B 75
    L LATIN CAPITAL LETTER L 0x4C 76
    M LATIN CAPITAL LETTER M 0x4D 77
    N LATIN CAPITAL LETTER N 0x4E 78
    O LATIN CAPITAL LETTER O 0x4F 79
    P LATIN CAPITAL LETTER P 0x50 80
    Q LATIN CAPITAL LETTER Q 0x51 81
    R LATIN CAPITAL LETTER R 0x52 82
    S LATIN CAPITAL LETTER S 0x53 83
    T LATIN CAPITAL LETTER T 0x54 84
    U LATIN CAPITAL LETTER U 0x55 85
    V LATIN CAPITAL LETTER V 0x56 86
    W LATIN CAPITAL LETTER W 0x57 87
    X LATIN CAPITAL LETTER X 0x58 88
    Y LATIN CAPITAL LETTER Y 0x59 89
    Z LATIN CAPITAL LETTER Z 0x5A 90
    Ä LATIN CAPITAL LETTER A WITH DIAERESIS 0x5B 91
    Ö LATIN CAPITAL LETTER O WITH DIAERESIS 0x5C 92
    Ñ LATIN CAPITAL LETTER N WITH TILDE 0x5D 93
    Ü LATIN CAPITAL LETTER U WITH DIAERESIS 0x5E 94
    § SECTION SIGN 0x5F 95
    ¿ INVERTED QUESTION MARK 0x60 96
    a LATIN SMALL LETTER A 0x61 97
    b LATIN SMALL LETTER B 0x62 98
    c LATIN SMALL LETTER C 0x63 99
    d LATIN SMALL LETTER D 0x64 100
    e LATIN SMALL LETTER E 0x65 101
    f LATIN SMALL LETTER F 0x66 102
    g LATIN SMALL LETTER G 0x67 103
    h LATIN SMALL LETTER H 0x68 104
    i LATIN SMALL LETTER I 0x69 105
    j LATIN SMALL LETTER J 0x6A 106
    k LATIN SMALL LETTER K 0x6B 107
    l LATIN SMALL LETTER L 0x6C 108
    m LATIN SMALL LETTER M 0x6D 109
    n LATIN SMALL LETTER N 0x6E 110
    o LATIN SMALL LETTER O 0x6F 111
    p LATIN SMALL LETTER P 0x70 112
    q LATIN SMALL LETTER Q 0x71 113
    r LATIN SMALL LETTER R 0x72 114
    s LATIN SMALL LETTER S 0x73 115
    t LATIN SMALL LETTER T 0x74 116
    u LATIN SMALL LETTER U 0x75 117
    v LATIN SMALL LETTER V 0x76 118
    w LATIN SMALL LETTER W 0x77 119
    x LATIN SMALL LETTER X 0x78 120
    y LATIN SMALL LETTER Y 0x79 121
    z LATIN SMALL LETTER Z 0x7A 122
    ä LATIN SMALL LETTER A WITH DIAERESIS 0x7B 123
    ö LATIN SMALL LETTER O WITH DIAERESIS 0x7C 124
    ñ LATIN SMALL LETTER N WITH TILDE 0x7D 125
    ü LATIN SMALL LETTER U WITH DIAERESIS 0x7E 126
    à LATIN SMALL LETTER A WITH GRAVE 0x7F 127

    Number of characters per message:

    Parts Without special chars With special chars
    1 part 160 chars 70 chars
    2 parts 306 chars 134 chars
    3 parts 459 chars 201 chars
    4 parts 612 chars 268 chars
    5 parts 765 chars 335 chars
    6 parts 918 chars 402 chars
    7 parts 1071 chars 469 chars
    8 parts 1224 chars 536 chars
    9 parts 1377 chars 603 chars
    10 parts 1530 chars 670 chars

    20. Encoding

    Example:

    curl -H "Authorization: Bearer token_api_oauth" \
    "https://api.smsapi.com/sms.do?\
    from=sender_name&\
    to=44123456789&\
    encoding=utf-8&\
    message=message_content"
    
    <?php
    
    $params = [
        'to' => '44123456789',
        'message' => "Hello world!",
        'encoding' => 'utf-8'
    ];
    
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, 'https://api.smsapi.com/sms.do');
    curl_setopt($c, CURLOPT_POST, true);
    curl_setopt($c, CURLOPT_POSTFIELDS, $params);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_HTTPHEADER, ["Authorization: Bearer %SMSAPI_ACCESS_TOKEN%"]);
    curl_exec($c);
    

    Default encoding is utf-8. However, you can set different encoding of messages by additional parameter &encoding in your HTTP request. Available encoding types are:

    21. Integrations

    E-commerce sector is using more often potential of mobile communications, especially that it translates into both introductions of savings and support of sales. You can always browse complete list of our Integrations.

    Gmail

    Gmail is a free, email service provided by Google. The Gmail user interface is user-friendly with its focus on search and conversation threading of emails, grouping several messages between two or more people onto a single page. Integration with SMSAPI allows setting automatic SMS notifications about received e-mails.

    Gmail configuration

    Script monitors messages by their labels. To set automatic label assignment, you'll need to login to your Gmail account, then click the gear icon and go to settings.

    Gmail settings needed for integration with SMSAPI

    In the settings, go to Filters and Blocked Addresses tab and choose the option to create a new filter.

    Gmail filter settings

    In the next step, you must specify parameters that proper label will be assigned for.

    Create filters with the SMSAPI label in Gmail

    Select option Apply the label, then create new or select one from the list.

    Create filters with the SMSAPI label in Gmail

    Script configuration

    function SMSapi() {
    
      // Configuration
      /*******************************************************/
    
      var MAIL_LABEL = 'SMSAPI'; // label name (in Gmail) that notifications are going to be sent for 
    
      var SMSAPI_TOKEN = 'token_api_oauth';
    
    
      var SMSAPI_SENDERNAME = 'Test';     // sender name made in https://ssl.smsapi.com/sms_settings/sendernames
      var SMSAPI_RECIVER  = 'tel_number'; // recipient phone number
    
      var MESSAGE = 'New email from: :SENDER, topic: :TITLE'; // sms content with extra parameters :SENDER, :TITLE
     /*******************************************************/
    
      var threads = GmailApp.getUserLabelByName(MAIL_LABEL).getThreads();
    
      for(i in threads)
        UrlFetchApp.fetch('https://api.smsapi.com/sms.do?encoding=utf-8&access_token='+SMSAPI_TOKEN+'&from='+SMSAPI_SENDERNAME+'&to='+encodeURIComponent(SMSAPI_RECIVER)+"&message="+encodeURIComponent(MESSAGE.replace(':SENDER',threads[i].getMessages()[0].getFrom()).replace(':TITLE', threads[i].getMessages()[0].getSubject())));
    
      GmailApp.getUserLabelByName(MAIL_LABEL).removeFromThreads(threads);
    
    }
    

    For proper script working, all variables listed below should be filled:

    
      * MAIL_LABEL – name of monitored, previously set Gmail label
      * SMSAPI_TOKEN - your token in SMSAPI service
      * SMSAPI_SENDERNAME – sender name made in https://ssl.smsapi.com/sms_settings/sendernames
      * SMSAPI_RECIVER – recipient phone number
      * MESSAGE – message content
    
    

    In order to configure SMSAPI service in Google Mail, make sure if you're logged into the proper account in Google service. Then go to https://script.google.com

    Click "Start Scripting" and then "Blank Project"

    Google Script Site

    Creating a new script in Google Scripts

    To set script executing frequency, click Click icon and add new trigger

    Trigger settings for the current project

    While saving, system can ask you for permission in order to get the script working.

    Authorization of SMSAPI script in Google Mail

    Google Calendar

    function SmsApiCalendar()
    {
      /* Configuration */
    
      var SMSAPI_TOKEN   = 'token_api_oauth';
    
      var SMSAPI_RECEIVER   = '48XXXXXXXXX';
      var SMSAPI_SENDERNAME = 'Test';       // sender name made in https://ssl.smsapi.com/sms_settings/sendernames
    
      var SMSAPI_URL     = 'https://api.smsapi.com/sms.do?';
    
      var HOURS = 0;
      var MINUTES  = 30;
      var MESSAGE = 'GOOGLE Calendar: Coming events: :TITLE that begin :TIME';
      /****************/
    
      SMSAPI_URL += 'access_token='+SMSAPI_TOKEN;
      SMSAPI_URL += '&from='+SMSAPI_SENDERNAME;
      SMSAPI_URL += '&to='+encodeURIComponent(SMSAPI_RECEIVER);
    
      var period = (HOURS * 3600000) + (MINUTES * 60000);
      var now = new Date();
      var periodFromNow = new Date(now.getTime() + period);
    
    
      var calendar = CalendarApp.getDefaultCalendar(); // for default Calendar
      //or
      // var calendar = CalendarApp.getCalendarsByNAme('Calendar name')         for specific calendar
    
      var events = calendar.getEvents(now, periodFromNow);
    
      for (var i in events) {
        var event = events[i];
    
        var has_smsapi_status = false;
        var tag_keys = event.getAllTagKeys();
        for (var k = 0; k < tag_keys.length; ++k) {
          if (tag_keys[k] === 'smsapi_status') {
            has_smsapi_status = true;
            break;
          }
        }
    
        if (has_smsapi_status) {
          if (event.getTag('smsapi_status') === 'ok') {
            continue;
          }
        }
        var idx = event.getId();
        var message = MESSAGE.replace(':TITLE', event.getTitle()).replace(':TIME', event.getStartTime());
        var url = SMSAPI_URL+"&encoding=utf8&message="+encodeURIComponent(message)+"&check_idx=1&idx="+encodeURIComponent(idx);
        UrlFetchApp.fetch(url);
        event.setTag('smsapi_status', 'ok');
      }
    }
    
    

    It's required to enter values of variables:

    
        * 'SMSAPI_TOKEN' - your token in SMSAPI service
        * 'SMSAPI_RECIVER' - mobile phone number SMS notification will be sent to
        * 'SMSAPI_SENDERNAME' - free-registered SMS notification sender name
        * 'HOURS' - defines in hours how long before the event SMS notification should be sent
        * 'MINUTES' - defines in minutes how long before the event SMS notification should be sent
        * 'MESSAGE' - content of SMS notification
        * ':TITLE' - replace event name
        * ':TIME' replace event date
    
    

    Google Calendar is a time-management web application and mobile app created by Google. It became available on April 13, 2006. Integrating with SMSAPI allows to configuring automatic SMS notifications about upcoming events.

    In order to work properly, the script should be given appropriate permissions. The script retrieves information about dates and names of the events directly from Google Calendar. Then properly prepared references to our API are performed, which results in sending SMS notification.

    To configure SMSAPI service make sure that you are logged into desired Google account. After that go to address https://script.google.com/

    Click "Start Scripting" and then "Blank Project"

    Google Script Site

    Creating a new script in Google Scripts

    Changing script name from 'Code.gs' to 'SmsApiCalendar.gs' is unnecessary.

    To set the script to execute frequency choose Click 'Current project's triggers' then 'No triggers set up. Click here to add one now' and change settings on 'Minutes timer' and 'Every minute'.

    Setting the frequency of script execution in Google Calendar in integration with SMSAPI

    Script needs some permissions in order to work properly. Script gets info about title and date of event. Then it constructs proper request to API that result in SMS notifications.

    SMSAPI access preference settings for Google Calendar

    Zapier

    Zapier lets you connect APP to hundreds of other web services. Automated connections called Zaps, set up in minutes with no coding, can automate your day-to-day tasks and build workflows between apps that otherwise wouldn't be possible.

    Each Zap has one app as the Trigger, where your information comes from and which causes one or more Actions in other apps, where your data gets sent automatically.

    Getting Started with Zapier

    Sign up for a free Zapier account, from there you can jump right in. To help you hit the ground running, there are some popular pre-made Zaps.

    How do I connect APP to Zapier?

    Log in to your Zapier account or create a new account. Navigate to "Connected Accounts" from the top menu bar. Now click on "Connect new account" and search for "APP" Use your credentials to connect your APP account to Zapier. Once that's done you can start creating an automation! Use a pre-made Zap or create your own with the Zap Editor. Creating a Zap requires no coding knowledge and you'll be walked step-by-step through the setup. Need inspiration? See everything that's possible with SMSAPI and Zapier.

    OAuth2 webflow

    OAuth - an authorization method that enables the integration of external applications with SMSAPI. Before starting the integration process, please contact us at support@smsapi.com to assign client_id and client_secret.

    Example of first request (the user is redirected to SMSAPI, where they log in and confirm the integration):

    https://ssl.smsapi.com/oauth/access?client_id=123456&redirect_uri=https://www.sample.com/&scope=sms
    

    Example response:

    https://www.sample.com/?code=11112222
    

    In the first step, the user is redirected to SMSAPI Customer Portal, where they log in and confirm the integration. After successful authorization, the user is redirected to the page specified in redirect_uri and receives the code, which is required for the second step.

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    redirect_uri URL address to which the user will be redirected after completing the authorization
    scope Defined permission for resources
    state Optional parameter that contains your CSRF token

    Available scope parameters:

    Parameter Description
    sms Access to SMS
    sms_sender Access to managing sender names
    hlr Access to HLR
    contacts Access to contacts database
    subuser Access to managing subusers
    blacklist Access to managing blacklist
    mfa Access to MFA
    callback Access to managing callbacks
    short_url Access to managing short links
    profile Access to managing user profile

    After receiving a positive verification in the first request, send client_secret, code and parameters from step 1 using the POST method to complete the authorization process. You can use the received access_token to authorize your SMSAPI requests.

    Example of second request:

    curl -X POST "https://api.smsapi.com/oauth/token" -d "client_id=1112223334444\
    &client_secret=111222333444&code=11112222&grant_type=authorization_code\
    &redirect_uri=https://www.sample.com/"
    

    Example response:

    {
        "access_token":"A1b***x2Z",
        "token_type":"Bearer",
        "expires":1577836800,
        "expires_in":604800,
        "refresh_token":"c3D*************************4eF"
    } 
    
      * access_token  token that allows access to resources via API
      * token_type  token type (always bearer for SMSAPI)
      * expires  token expiration date in UNIX timestamp 
      * expires_in  time of token validity (days, hours and minutes) 
      * refresh_token  refresh token that allows to extend the authorization validity
    

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    client_secret Private value unique for app
    code Authorization code given by SMSAPI after the first request
    grant_type Authorization type, should be set to "authorization_code"
    redirect_uri URL address where the response about successful authorization should be redirected

    To maintain the connection, send a request containing the refresh_token received in the second request. For subsequent requests, replace access_token and refresh_token values with the new ones received in this request.

    Example of request with refresh_token:

    
    curl -X POST "https://api.smsapi.com/oauth/token" -d "client_id=123456\
    &client_secret=111222333444&refresh_token=AaaaaBbbbbCccccDdddd\
    &grant_type=refresh_token"
    
    

    Example response:

    {
        "access_token":"BD1***p3k",
        "token_type":"Bearer",
        "expires":1577837800,
        "expires_in":604800,
        "refresh_token":"yn3*************************z54"
    }
    

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    client_secret Private value unique for app
    refresh_token Token received in the second request
    grant_type Authorization type, should be set to "refresh_token"

    PKCE

    SMSAPI also supports authorization using PKCE (Proof Key for Code Exchange). It differs from standard OAuth authorization in that a random string code_verifier must be generated to perform it. In the first step, a converted version of this string must be provided under the name code_challenge, and in the second step the code_verifier must be sent. The client_secret parameter sent in the second step is optional.

    You can create the code_challenge parameter by Base64 URL encoding the SHA256 hash of the code_verifier. You can perform Base64 URL encoding by taking a Base64-encoded string and changing '+' and '/' to '-' and '_' respectively, then trimming the trailing '='.

    Example of first request (the user is redirected to SMSAPI, where they log in and confirm the integration):

    https://ssl.smsapi.com/oauth/access?client_id=123456&redirect_uri=https://www.sample.com/&code_challenge=12345678&code_challenge_method=S256&scope=sms
    

    Example response:

    https://www.sample.com/?code=11112222
    

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    redirect_uri URL address to which the user will be redirected after completing the authorization
    code_challenge Parameter generated as described above
    code_challenge_method code_challenge generation method, has to be equal to S256
    scope Defined permission for resources
    state Optional parameter that contains your CSRF token

    Example of second request:

    curl -X POST "https://api.smsapi.com/oauth/token" -d "client_id=1112223334444\
    &code_verifier=111222333444&code=11112222&grant_type=authorization_code\
    &redirect_uri=https://www.sample.com/"
    

    Example response:

    {
        "access_token":"A1b***x2Z",
        "token_type":"Bearer",
        "expires":1577836800,
        "expires_in":604800,
        "refresh_token":"c3D*************************4eF"
    }
    
      * access_token  token that allows access to resources via API
      * token_type  token type (always bearer for SMSAPI)
      * expires  token expiration date in UNIX timestamp 
      * expires_in  time of token validity (days, hours and minutes) 
      * refresh_token  refresh token that allows to extend the authorization validity
    

    After receiving a positive verification in the first request, send the information using the POST method to complete the authorization process. You can use the received access_token to authorize your SMSAPI requests.

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    code Authorization code given by SMSAPI after the first request
    grant_type Authorization type, should be set to "authorization_code"
    redirect_uri URL address where the response about successful authorization should be redirected
    client_secret Optional parameter - private value unique for app

    To maintain the connection, send a request containing the refresh_token received in the second request. For subsequent requests, replace access_token and refresh_token values with the new ones received in this request.

    Example of request with refresh_token:

    
    curl -X POST "https://api.smsapi.com/oauth/token" -H "client_id=123456\
    &refresh_token=AaaaaBbbbbCccccDdddd&grant_type=refresh_token"
    
    

    Example response:

    {
        "access_token":"BD1*p3k",
        "token_type":"Bearer",
        "expires":1577837800,
        "expires_in":604800,
        "refresh_token":"yn3***********************z54"
    }
    

    Required parameters:

    Parameter Description
    client_id Unique ID for app
    refresh_token Token received in the second request
    grant_type Authorization type, should be set to "refresh_token"

    Other integrations

    We also have integrations with:

    You can check them all out at our Integrations page.