From 3b224ddf2b254f8fea2188e99d06c79e0b690da0 Mon Sep 17 00:00:00 2001 From: Uku Loskit Date: Mon, 1 Jun 2026 13:02:32 +0300 Subject: [PATCH] Add Messente documentation --- .../global-business/cancel-message.cs | 30 ++ .../global-business/cancel-message.java | 23 ++ .../global-business/cancel-message.js | 16 + .../global-business/cancel-message.php | 18 + .../global-business/cancel-message.py | 14 + .../global-business/cancel-message.rb | 16 + .../global-business/cancel-message.sh | 4 + .../messaging/global-business/get-dlr.cs | 9 + .../messaging/global-business/get-dlr.java | 5 + .../messaging/global-business/get-dlr.js | 9 + .../messaging/global-business/get-dlr.php | 10 + .../messaging/global-business/get-dlr.py | 9 + .../messaging/global-business/get-dlr.rb | 5 + .../messaging/global-business/get-dlr.sh | 16 + .../messaging/global-business/get-sync-dlr.cs | 30 ++ .../global-business/get-sync-dlr.java | 23 ++ .../messaging/global-business/get-sync-dlr.js | 16 + .../global-business/get-sync-dlr.php | 18 + .../messaging/global-business/get-sync-dlr.py | 15 + .../messaging/global-business/get-sync-dlr.rb | 16 + .../messaging/global-business/get-sync-dlr.sh | 4 + .../global-business/schedule-message.cs | 42 +++ .../global-business/schedule-message.java | 36 ++ .../global-business/schedule-message.js | 27 ++ .../global-business/schedule-message.php | 31 ++ .../global-business/schedule-message.py | 29 ++ .../global-business/schedule-message.rb | 27 ++ .../global-business/schedule-message.sh | 16 + .../global-business/send-fallback.cs | 46 +++ .../global-business/send-fallback.java | 38 +++ .../global-business/send-fallback.js | 28 ++ .../global-business/send-fallback.php | 35 ++ .../global-business/send-fallback.py | 40 +++ .../global-business/send-fallback.rb | 27 ++ .../global-business/send-fallback.sh | 15 + .../global-business/send-single-sms.cs | 42 +++ .../global-business/send-single-sms.java | 35 ++ .../global-business/send-single-sms.js | 26 ++ .../global-business/send-single-sms.php | 30 ++ .../global-business/send-single-sms.py | 31 ++ .../global-business/send-single-sms.rb | 26 ++ .../global-business/send-single-sms.sh | 15 + .../sms/global-business/delivery-report.md | 210 ++++++++++++ .../global-business/development-libraries.md | 161 +++++++++ .../sms/global-business/inbound-messages.md | 55 +++ docs/messaging/sms/global-business/index.md | 323 ++++++++++++++++++ .../requests-and-authentication.md | 60 ++++ .../sms/global-business/scheduled-messages.md | 116 +++++++ .../sms/global-business/sender-name.md | 38 +++ .../sms/global-business/sms-message.md | 126 +++++++ mkdocs.yml | 9 + 51 files changed, 2046 insertions(+) create mode 100644 code-samples/messaging/global-business/cancel-message.cs create mode 100644 code-samples/messaging/global-business/cancel-message.java create mode 100644 code-samples/messaging/global-business/cancel-message.js create mode 100644 code-samples/messaging/global-business/cancel-message.php create mode 100644 code-samples/messaging/global-business/cancel-message.py create mode 100644 code-samples/messaging/global-business/cancel-message.rb create mode 100644 code-samples/messaging/global-business/cancel-message.sh create mode 100644 code-samples/messaging/global-business/get-dlr.cs create mode 100644 code-samples/messaging/global-business/get-dlr.java create mode 100644 code-samples/messaging/global-business/get-dlr.js create mode 100644 code-samples/messaging/global-business/get-dlr.php create mode 100644 code-samples/messaging/global-business/get-dlr.py create mode 100644 code-samples/messaging/global-business/get-dlr.rb create mode 100644 code-samples/messaging/global-business/get-dlr.sh create mode 100644 code-samples/messaging/global-business/get-sync-dlr.cs create mode 100644 code-samples/messaging/global-business/get-sync-dlr.java create mode 100644 code-samples/messaging/global-business/get-sync-dlr.js create mode 100644 code-samples/messaging/global-business/get-sync-dlr.php create mode 100644 code-samples/messaging/global-business/get-sync-dlr.py create mode 100644 code-samples/messaging/global-business/get-sync-dlr.rb create mode 100644 code-samples/messaging/global-business/get-sync-dlr.sh create mode 100644 code-samples/messaging/global-business/schedule-message.cs create mode 100644 code-samples/messaging/global-business/schedule-message.java create mode 100644 code-samples/messaging/global-business/schedule-message.js create mode 100644 code-samples/messaging/global-business/schedule-message.php create mode 100644 code-samples/messaging/global-business/schedule-message.py create mode 100644 code-samples/messaging/global-business/schedule-message.rb create mode 100644 code-samples/messaging/global-business/schedule-message.sh create mode 100644 code-samples/messaging/global-business/send-fallback.cs create mode 100644 code-samples/messaging/global-business/send-fallback.java create mode 100644 code-samples/messaging/global-business/send-fallback.js create mode 100644 code-samples/messaging/global-business/send-fallback.php create mode 100644 code-samples/messaging/global-business/send-fallback.py create mode 100644 code-samples/messaging/global-business/send-fallback.rb create mode 100644 code-samples/messaging/global-business/send-fallback.sh create mode 100644 code-samples/messaging/global-business/send-single-sms.cs create mode 100644 code-samples/messaging/global-business/send-single-sms.java create mode 100644 code-samples/messaging/global-business/send-single-sms.js create mode 100644 code-samples/messaging/global-business/send-single-sms.php create mode 100644 code-samples/messaging/global-business/send-single-sms.py create mode 100644 code-samples/messaging/global-business/send-single-sms.rb create mode 100644 code-samples/messaging/global-business/send-single-sms.sh create mode 100644 docs/messaging/sms/global-business/delivery-report.md create mode 100644 docs/messaging/sms/global-business/development-libraries.md create mode 100644 docs/messaging/sms/global-business/inbound-messages.md create mode 100644 docs/messaging/sms/global-business/index.md create mode 100644 docs/messaging/sms/global-business/requests-and-authentication.md create mode 100644 docs/messaging/sms/global-business/scheduled-messages.md create mode 100644 docs/messaging/sms/global-business/sender-name.md create mode 100644 docs/messaging/sms/global-business/sms-message.md diff --git a/code-samples/messaging/global-business/cancel-message.cs b/code-samples/messaging/global-business/cancel-message.cs new file mode 100644 index 00000000..62e6805f --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.cs @@ -0,0 +1,30 @@ +using System; +using com.Messente.Api.Api; +using com.Messente.Api.Client; + +namespace Example +{ + public class CancelMessage + { + public static void Main() + { + Configuration conf = new Configuration + { + Username = "YOUR_MESSENTE_API_USERNAME", + Password = "YOUR_MESSENTE_API_PASSWORD" + }; + + var apiInstance = new OmnimessageApi(conf); + + try + { + apiInstance.CancelScheduledMessage(""); + Console.WriteLine("Scheduled omnimessage cancelled"); + } + catch (Exception e) + { + Console.WriteLine("Exception when cancelling an omnimessage: " + e.Message); + } + } + } +} diff --git a/code-samples/messaging/global-business/cancel-message.java b/code-samples/messaging/global-business/cancel-message.java new file mode 100644 index 00000000..dc07a34d --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.java @@ -0,0 +1,23 @@ +import com.messente.ApiClient; +import com.messente.ApiException; +import com.messente.api.*; +import com.messente.auth.HttpBasicAuth; + +public class CancelMessage { + public static void main(String[] args) { + ApiClient apiClient = new ApiClient(); + OmnimessageApi apiInstance = new OmnimessageApi(apiClient); + + HttpBasicAuth basicAuth = (HttpBasicAuth) apiClient.getAuthentication("basicAuth"); + basicAuth.setUsername("YOUR_MESSENTE_API_USERNAME"); + basicAuth.setPassword("YOUR_MESSENTE_API_PASSWORD"); + + try { + apiInstance.cancelScheduledMessage(""); + System.out.println("Scheduled omnimessage cancelled"); + } catch (ApiException e) { + System.err.println("Exception when cancelling an omnimessage"); + System.err.println(e.getResponseBody()); + } + } +} diff --git a/code-samples/messaging/global-business/cancel-message.js b/code-samples/messaging/global-business/cancel-message.js new file mode 100644 index 00000000..d84fe3bb --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.js @@ -0,0 +1,16 @@ +const MessenteApi = require('messente_api'); + +const defaultClient = MessenteApi.ApiClient.instance; +const basicAuth = defaultClient.authentications['basicAuth']; +basicAuth.username = 'YOUR_MESSENTE_API_USERNAME'; +basicAuth.password = 'YOUR_MESSENTE_API_PASSWORD'; + +const api = new MessenteApi.OmnimessageApi(); + +api.cancelScheduledMessage('', (error) => { + if (error) { + console.error(error); + } else { + console.log('Scheduled omnimessage cancelled'); + } +}); diff --git a/code-samples/messaging/global-business/cancel-message.php b/code-samples/messaging/global-business/cancel-message.php new file mode 100644 index 00000000..2ab9dffa --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.php @@ -0,0 +1,18 @@ +setUsername('YOUR_MESSENTE_API_USERNAME') + ->setPassword('YOUR_MESSENTE_API_PASSWORD'); + +$apiInstance = new OmnimessageApi(new GuzzleHttp\Client(), $config); + +try { + $apiInstance->cancelScheduledMessage(''); + echo 'Scheduled omnimessage cancelled', PHP_EOL; +} catch (Exception $e) { + echo 'Exception when cancelling an omnimessage: ', $e->getMessage(), PHP_EOL; +} diff --git a/code-samples/messaging/global-business/cancel-message.py b/code-samples/messaging/global-business/cancel-message.py new file mode 100644 index 00000000..99393618 --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.py @@ -0,0 +1,14 @@ +from messente_api import ApiClient, Configuration, OmnimessageApi +from messente_api.rest import ApiException + +configuration = Configuration() +configuration.username = "YOUR_MESSENTE_API_USERNAME" +configuration.password = "YOUR_MESSENTE_API_PASSWORD" + +api_instance = OmnimessageApi(ApiClient(configuration)) + +try: + api_instance.cancel_scheduled_message("") + print("Scheduled omnimessage cancelled") +except ApiException as exception: + print("Exception when cancelling an omnimessage: %s\n" % exception) diff --git a/code-samples/messaging/global-business/cancel-message.rb b/code-samples/messaging/global-business/cancel-message.rb new file mode 100644 index 00000000..7e5944ac --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.rb @@ -0,0 +1,16 @@ +require 'messente_api' + +MessenteApi.configure do |config| + config.username = 'YOUR_MESSENTE_API_USERNAME' + config.password = 'YOUR_MESSENTE_API_PASSWORD' +end + +api_instance = MessenteApi::OmnimessageApi.new + +begin + api_instance.cancel_scheduled_message('') + puts 'Scheduled omnimessage cancelled' +rescue MessenteApi::ApiError => e + puts "Exception when cancelling an omnimessage: #{e}" + puts e.response_body +end diff --git a/code-samples/messaging/global-business/cancel-message.sh b/code-samples/messaging/global-business/cancel-message.sh new file mode 100644 index 00000000..b8a7d3d3 --- /dev/null +++ b/code-samples/messaging/global-business/cancel-message.sh @@ -0,0 +1,4 @@ +curl -X DELETE \ + 'https://api.messente.com/v1/omnimessage/' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Accept: application/json' diff --git a/code-samples/messaging/global-business/get-dlr.cs b/code-samples/messaging/global-business/get-dlr.cs new file mode 100644 index 00000000..ac840164 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.cs @@ -0,0 +1,9 @@ +// 1. Get a temporary WebHook URL from https://webhook.site. +// Leave the website open. This is where you'll see your incoming delivery reports. +// 2. Edit the previous code example by adding the delivery URL to the request. +var omnimessage = new Omnimessage( + to: "", + dlrUrl: "", + messages: new System.Collections.Generic.List { smsInner } +); +// 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.java b/code-samples/messaging/global-business/get-dlr.java new file mode 100644 index 00000000..3f036168 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.java @@ -0,0 +1,5 @@ +// 1. Get a temporary WebHook URL from https://webhook.site. +// Leave the website open. This is where you'll see your incoming delivery reports. +// 2. Edit the previous code example by adding the delivery URL to the request. +omnimessage.setDlrUrl(""); +// 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.js b/code-samples/messaging/global-business/get-dlr.js new file mode 100644 index 00000000..88ce61a3 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.js @@ -0,0 +1,9 @@ +// 1. Get a temporary WebHook URL from https://webhook.site. +// Leave the website open. This is where you'll see your incoming delivery reports. +// 2. Edit the previous code example by adding the delivery URL to the request. +const omnimessage = MessenteApi.Omnimessage.constructFromObject({ + messages: [sms], + to: '', + dlrUrl: '', +}); +// 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.php b/code-samples/messaging/global-business/get-dlr.php new file mode 100644 index 00000000..80dd6470 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.php @@ -0,0 +1,10 @@ + '', + 'dlr_url' => '', + 'messages' => [$sms], +]); +// 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.py b/code-samples/messaging/global-business/get-dlr.py new file mode 100644 index 00000000..eef3dd4b --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.py @@ -0,0 +1,9 @@ +# 1. Get a temporary WebHook URL from https://webhook.site. +# Leave the website open. This is where you'll see your incoming delivery reports. +# 2. Edit the previous code example by adding the delivery URL to the request. +omnimessage = Omnimessage( + messages=[sms_inner], + to="", + dlr_url="", +) +# 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.rb b/code-samples/messaging/global-business/get-dlr.rb new file mode 100644 index 00000000..be212573 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.rb @@ -0,0 +1,5 @@ +# 1. Get a temporary WebHook URL from https://webhook.site. +# Leave the website open. This is where you'll see your incoming delivery reports. +# 2. Edit the previous code example by adding the delivery URL to the request. +omnimessage.dlr_url = '' +# 3. Send an SMS with the script and monitor the incoming requests on the webhook's website. diff --git a/code-samples/messaging/global-business/get-dlr.sh b/code-samples/messaging/global-business/get-dlr.sh new file mode 100644 index 00000000..030fe9d1 --- /dev/null +++ b/code-samples/messaging/global-business/get-dlr.sh @@ -0,0 +1,16 @@ +curl -X POST \ + 'https://api.messente.com/v1/omnimessage' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "to": "", + "dlr_url": "", + "messages": [ + { + "channel": "sms", + "sender": "", + "text": "hello sms" + } + ] + }' diff --git a/code-samples/messaging/global-business/get-sync-dlr.cs b/code-samples/messaging/global-business/get-sync-dlr.cs new file mode 100644 index 00000000..283c24c2 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.cs @@ -0,0 +1,30 @@ +using System; +using com.Messente.Api.Api; +using com.Messente.Api.Client; + +namespace Example +{ + public class GetSyncDlr + { + public static void Main() + { + Configuration conf = new Configuration + { + Username = "YOUR_MESSENTE_API_USERNAME", + Password = "YOUR_MESSENTE_API_PASSWORD" + }; + + var apiInstance = new DeliveryReportApi(conf); + + try + { + var result = apiInstance.RetrieveDeliveryReport(""); + Console.WriteLine(result.ToJson()); + } + catch (Exception e) + { + Console.WriteLine("Exception when retrieving delivery report: " + e.Message); + } + } + } +} diff --git a/code-samples/messaging/global-business/get-sync-dlr.java b/code-samples/messaging/global-business/get-sync-dlr.java new file mode 100644 index 00000000..57907010 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.java @@ -0,0 +1,23 @@ +import com.messente.ApiClient; +import com.messente.ApiException; +import com.messente.api.*; +import com.messente.auth.HttpBasicAuth; + +public class GetSyncDlr { + public static void main(String[] args) { + ApiClient apiClient = new ApiClient(); + DeliveryReportApi apiInstance = new DeliveryReportApi(apiClient); + + HttpBasicAuth basicAuth = (HttpBasicAuth) apiClient.getAuthentication("basicAuth"); + basicAuth.setUsername("YOUR_MESSENTE_API_USERNAME"); + basicAuth.setPassword("YOUR_MESSENTE_API_PASSWORD"); + + try { + Object result = apiInstance.retrieveDeliveryReport(""); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when retrieving delivery report"); + System.err.println(e.getResponseBody()); + } + } +} diff --git a/code-samples/messaging/global-business/get-sync-dlr.js b/code-samples/messaging/global-business/get-sync-dlr.js new file mode 100644 index 00000000..64d56411 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.js @@ -0,0 +1,16 @@ +const MessenteApi = require('messente_api'); + +const defaultClient = MessenteApi.ApiClient.instance; +const basicAuth = defaultClient.authentications['basicAuth']; +basicAuth.username = 'YOUR_MESSENTE_API_USERNAME'; +basicAuth.password = 'YOUR_MESSENTE_API_PASSWORD'; + +const api = new MessenteApi.DeliveryReportApi(); + +api.retrieveDeliveryReport('', (error, data) => { + if (error) { + console.error(error); + } else { + console.log('API called successfully. Returned data: ', data); + } +}); diff --git a/code-samples/messaging/global-business/get-sync-dlr.php b/code-samples/messaging/global-business/get-sync-dlr.php new file mode 100644 index 00000000..6a0a8d62 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.php @@ -0,0 +1,18 @@ +setUsername('YOUR_MESSENTE_API_USERNAME') + ->setPassword('YOUR_MESSENTE_API_PASSWORD'); + +$apiInstance = new DeliveryReportApi(new GuzzleHttp\Client(), $config); + +try { + $result = $apiInstance->retrieveDeliveryReport(''); + print_r($result); +} catch (Exception $e) { + echo 'Exception when retrieving delivery report: ', $e->getMessage(), PHP_EOL; +} diff --git a/code-samples/messaging/global-business/get-sync-dlr.py b/code-samples/messaging/global-business/get-sync-dlr.py new file mode 100644 index 00000000..49debdee --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.py @@ -0,0 +1,15 @@ +from pprint import pprint +from messente_api import ApiClient, Configuration, DeliveryReportApi +from messente_api.rest import ApiException + +configuration = Configuration() +configuration.username = "YOUR_MESSENTE_API_USERNAME" +configuration.password = "YOUR_MESSENTE_API_PASSWORD" + +api_instance = DeliveryReportApi(ApiClient(configuration)) + +try: + response = api_instance.retrieve_delivery_report("") + pprint(response) +except ApiException as exception: + print("Exception when retrieving delivery report: %s\n" % exception) diff --git a/code-samples/messaging/global-business/get-sync-dlr.rb b/code-samples/messaging/global-business/get-sync-dlr.rb new file mode 100644 index 00000000..99518f65 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.rb @@ -0,0 +1,16 @@ +require 'messente_api' + +MessenteApi.configure do |config| + config.username = 'YOUR_MESSENTE_API_USERNAME' + config.password = 'YOUR_MESSENTE_API_PASSWORD' +end + +api_instance = MessenteApi::DeliveryReportApi.new + +begin + result = api_instance.retrieve_delivery_report('') + puts result +rescue MessenteApi::ApiError => e + puts "Exception when retrieving delivery report: #{e}" + puts e.response_body +end diff --git a/code-samples/messaging/global-business/get-sync-dlr.sh b/code-samples/messaging/global-business/get-sync-dlr.sh new file mode 100644 index 00000000..da1fa9a9 --- /dev/null +++ b/code-samples/messaging/global-business/get-sync-dlr.sh @@ -0,0 +1,4 @@ +curl -X GET \ + 'https://api.messente.com/v1/omnimessage//status' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Accept: application/json' diff --git a/code-samples/messaging/global-business/schedule-message.cs b/code-samples/messaging/global-business/schedule-message.cs new file mode 100644 index 00000000..2dcd62fc --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.cs @@ -0,0 +1,42 @@ +using System; +using com.Messente.Api.Api; +using com.Messente.Api.Client; +using com.Messente.Api.Model; + +namespace Example +{ + public class ScheduleMessage + { + public static void Main() + { + Configuration conf = new Configuration + { + Username = "YOUR_MESSENTE_API_USERNAME", + Password = "YOUR_MESSENTE_API_PASSWORD" + }; + + var apiInstance = new OmnimessageApi(conf); + var sms = new SMS(sender: "", text: "hello sms"); + OmnimessageMessagesInner smsInner = new OmnimessageMessagesInner(sms) + { + ActualInstance = sms + }; + + var omnimessage = new Omnimessage( + to: "", + timeToSend: "2019-06-22T09:05:07+04:00", + messages: new System.Collections.Generic.List { smsInner } + ); + + try + { + var result = apiInstance.SendOmnimessage(omnimessage); + Console.WriteLine(result.ToJson()); + } + catch (Exception e) + { + Console.WriteLine("Exception when scheduling an omnimessage: " + e.Message); + } + } + } +} diff --git a/code-samples/messaging/global-business/schedule-message.java b/code-samples/messaging/global-business/schedule-message.java new file mode 100644 index 00000000..13e7fc5d --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.java @@ -0,0 +1,36 @@ +import com.messente.ApiClient; +import com.messente.ApiException; +import com.messente.api.*; +import com.messente.auth.HttpBasicAuth; + +import java.util.Collections; + +public class ScheduleMessage { + public static void main(String[] args) { + ApiClient apiClient = new ApiClient(); + OmnimessageApi apiInstance = new OmnimessageApi(apiClient); + + HttpBasicAuth basicAuth = (HttpBasicAuth) apiClient.getAuthentication("basicAuth"); + basicAuth.setUsername("YOUR_MESSENTE_API_USERNAME"); + basicAuth.setPassword("YOUR_MESSENTE_API_PASSWORD"); + + SMS sms = new SMS(); + sms.text("hello sms"); + sms.sender(""); + OmnimessageMessagesInner smsInner = new OmnimessageMessagesInner(sms); + smsInner.setActualInstance(sms); + + Omnimessage omnimessage = new Omnimessage(); + omnimessage.setMessages(Collections.singletonList(smsInner)); + omnimessage.setTo(""); + omnimessage.setTimeToSend("2019-06-22T09:05:07+04:00"); + + try { + OmniMessageCreateSuccessResponse result = apiInstance.sendOmnimessage(omnimessage); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when scheduling an omnimessage"); + System.err.println(e.getResponseBody()); + } + } +} diff --git a/code-samples/messaging/global-business/schedule-message.js b/code-samples/messaging/global-business/schedule-message.js new file mode 100644 index 00000000..96486ef2 --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.js @@ -0,0 +1,27 @@ +const MessenteApi = require('messente_api'); + +const defaultClient = MessenteApi.ApiClient.instance; +const basicAuth = defaultClient.authentications['basicAuth']; +basicAuth.username = 'YOUR_MESSENTE_API_USERNAME'; +basicAuth.password = 'YOUR_MESSENTE_API_PASSWORD'; + +const api = new MessenteApi.OmnimessageApi(); + +const sms = MessenteApi.SMS.constructFromObject({ + text: 'hello sms', + sender: '', +}); + +const omnimessage = MessenteApi.Omnimessage.constructFromObject({ + messages: [sms], + to: '', + timeToSend: '2019-06-22T09:05:07+04:00', +}); + +api.sendOmnimessage(omnimessage, (error, data) => { + if (error) { + console.error(error); + } else { + console.log('API called successfully. Returned data: ', data); + } +}); diff --git a/code-samples/messaging/global-business/schedule-message.php b/code-samples/messaging/global-business/schedule-message.php new file mode 100644 index 00000000..6fb42c68 --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.php @@ -0,0 +1,31 @@ +setUsername('YOUR_MESSENTE_API_USERNAME') + ->setPassword('YOUR_MESSENTE_API_PASSWORD'); + +$apiInstance = new OmnimessageApi(new GuzzleHttp\Client(), $config); + +$sms = new SMS([ + 'text' => 'hello sms', + 'sender' => '', +]); + +$omnimessage = new Omnimessage([ + 'to' => '', + 'time_to_send' => '2019-06-22T09:05:07+04:00', + 'messages' => [$sms], +]); + +try { + $result = $apiInstance->sendOmnimessage($omnimessage); + print_r($result); +} catch (Exception $e) { + echo 'Exception when scheduling an omnimessage: ', $e->getMessage(), PHP_EOL; +} diff --git a/code-samples/messaging/global-business/schedule-message.py b/code-samples/messaging/global-business/schedule-message.py new file mode 100644 index 00000000..8da01699 --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.py @@ -0,0 +1,29 @@ +from pprint import pprint +from messente_api import ( + ApiClient, + Configuration, + Omnimessage, + OmnimessageApi, + OmnimessageMessagesInner, + SMS, +) +from messente_api.rest import ApiException + +configuration = Configuration() +configuration.username = "YOUR_MESSENTE_API_USERNAME" +configuration.password = "YOUR_MESSENTE_API_PASSWORD" + +api_instance = OmnimessageApi(ApiClient(configuration)) +sms = SMS(sender="", text="hello sms") +sms_inner = OmnimessageMessagesInner(sms) +omnimessage = Omnimessage( + messages=[sms_inner], + to="", + time_to_send="2019-06-22T09:05:07+04:00", +) + +try: + response = api_instance.send_omnimessage(omnimessage) + pprint(response) +except ApiException as exception: + print("Exception when scheduling an omnimessage: %s\n" % exception) diff --git a/code-samples/messaging/global-business/schedule-message.rb b/code-samples/messaging/global-business/schedule-message.rb new file mode 100644 index 00000000..7562de43 --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.rb @@ -0,0 +1,27 @@ +require 'messente_api' + +MessenteApi.configure do |config| + config.username = 'YOUR_MESSENTE_API_USERNAME' + config.password = 'YOUR_MESSENTE_API_PASSWORD' +end + +api_instance = MessenteApi::OmnimessageApi.new + +sms = MessenteApi::SMS.new( + sender: '', + text: 'hello sms' +) + +omnimessage = MessenteApi::Omnimessage.new( + to: '', + time_to_send: '2019-06-22T09:05:07+04:00', + messages: [sms] +) + +begin + result = api_instance.send_omnimessage(omnimessage) + puts result +rescue MessenteApi::ApiError => e + puts "Exception when scheduling an omnimessage: #{e}" + puts e.response_body +end diff --git a/code-samples/messaging/global-business/schedule-message.sh b/code-samples/messaging/global-business/schedule-message.sh new file mode 100644 index 00000000..6d5b053e --- /dev/null +++ b/code-samples/messaging/global-business/schedule-message.sh @@ -0,0 +1,16 @@ +curl -X POST \ + 'https://api.messente.com/v1/omnimessage' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "to": "", + "time_to_send": "2019-06-22T09:05:07+04:00", + "messages": [ + { + "channel": "sms", + "sender": "", + "text": "hello sms" + } + ] + }' diff --git a/code-samples/messaging/global-business/send-fallback.cs b/code-samples/messaging/global-business/send-fallback.cs new file mode 100644 index 00000000..6ee22cee --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.cs @@ -0,0 +1,46 @@ +// PM > Install-Package com.Messente.Api + +using System; +using com.Messente.Api.Api; +using com.Messente.Api.Client; +using com.Messente.Api.Model; + +namespace Example +{ + public class SendOmniMessageExample + { + public static void Main() + { + Configuration conf = new Configuration + { + Username = "YOUR_MESSENTE_API_USERNAME", + Password = "YOUR_MESSENTE_API_PASSWORD" + }; + + var apiInstance = new OmnimessageApi(conf); + + var sms = new SMS(sender: "", text: "Hello SMS!"); + OmnimessageMessagesInner smsOmnimessageInner = new OmnimessageMessagesInner(sms) + { + ActualInstance = sms + }; + + var omnimessage = new Omnimessage( + to: "", + messages: new List { + smsOmnimessageInner + } + ); + + try + { + var result = apiInstance.SendOmnimessage(omnimessage); + Console.WriteLine(result.ToJson()); + } + catch (Exception e) + { + Console.WriteLine("Exception when calling SendOmnimessage: " + e.Message); + } + } + } +} diff --git a/code-samples/messaging/global-business/send-fallback.java b/code-samples/messaging/global-business/send-fallback.java new file mode 100644 index 00000000..53d550fe --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.java @@ -0,0 +1,38 @@ +import com.messente.ApiClient; +import com.messente.ApiException; +import com.messente.api.*; +import com.messente.auth.HttpBasicAuth; + +import java.util.Collections; + +// repositories { mavenCentral() } +// dependencies { implementation 'com.messente.api:messente-api' } + +public class Main { + public static void main(String[] args) { + ApiClient apiClient = new ApiClient(); + OmnimessageApi apiInstance = new OmnimessageApi(apiClient); + + HttpBasicAuth basicAuth = (HttpBasicAuth) apiClient.getAuthentication("basicAuth"); + basicAuth.setUsername("YOUR_MESSENTE_API_USERNAME"); + basicAuth.setPassword("YOUR_MESSENTE_API_PASSWORD"); + + SMS sms = new SMS(); + sms.text("hello sms"); + sms.sender(""); + OmnimessageMessagesInner smsOmnimessageInner = new OmnimessageMessagesInner(sms); + smsOmnimessageInner.setActualInstance(sms); + + Omnimessage omnimessage = new Omnimessage(); + omnimessage.setMessages(Collections.singletonList(smsOmnimessageInner)); + omnimessage.setTo(""); + + try { + OmniMessageCreateSuccessResponse result = apiInstance.sendOmnimessage(omnimessage); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling sendOmnimessage"); + System.err.println(e.getResponseBody()); + } + } +} diff --git a/code-samples/messaging/global-business/send-fallback.js b/code-samples/messaging/global-business/send-fallback.js new file mode 100644 index 00000000..7a49decf --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.js @@ -0,0 +1,28 @@ +const MessenteApi = require('messente_api'); + +const defaultClient = MessenteApi.ApiClient.instance; + +// Configure HTTP basic authorization: basicAuth +const basicAuth = defaultClient.authentications['basicAuth']; +basicAuth.username = 'YOUR_MESSENTE_API_USERNAME'; +basicAuth.password = 'YOUR_MESSENTE_API_PASSWORD'; + +const api = new MessenteApi.OmnimessageApi(); + +const sms = MessenteApi.SMS.constructFromObject({ + text: 'Hello SMS!', + sender: '', +}); + +const omnimessage = MessenteApi.Omnimessage.constructFromObject({ + messages: [sms], + to: '', +}); + +api.sendOmnimessage(omnimessage, (error, data) => { + if (error) { + console.error(error); + } else { + console.log('API called successfully. Returned data: ', data); + } +}); diff --git a/code-samples/messaging/global-business/send-fallback.php b/code-samples/messaging/global-business/send-fallback.php new file mode 100644 index 00000000..3e895c42 --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.php @@ -0,0 +1,35 @@ +setUsername('') + ->setPassword(''); + +$apiInstance = new OmnimessageApi( + new GuzzleHttp\Client(), + $config +); + +$sms = new SMS( + ["text" => "Hello SMS!", "sender" => "MySmsSender"] +); + +$omnimessage = new Omnimessage([ + "to" => "", + "messages" => [$sms] +]); + +try { + $result = $apiInstance->sendOmnimessage($omnimessage); + print_r($result); +} catch (Exception $e) { + echo 'Exception when calling sendOmnimessage: ', $e->getMessage(), PHP_EOL; +} +?> diff --git a/code-samples/messaging/global-business/send-fallback.py b/code-samples/messaging/global-business/send-fallback.py new file mode 100644 index 00000000..e8e88d47 --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.py @@ -0,0 +1,40 @@ +from pprint import pprint +from messente_api import ( + OmnimessageApi, + Omnimessage, + OmnimessageMessagesInner, + Configuration, + ApiClient, + SMS, +) +from messente_api.rest import ApiException + +# API information from https://dashboard.messente.com/api-settings +configuration = Configuration() +configuration.username = '' +configuration.password = '' + +# create an instance of the API class +api_instance = OmnimessageApi(ApiClient(configuration)) + +sms = SMS( + sender='', + text='hello python', +) +sms_inner = OmnimessageMessagesInner(sms) + +omnimessage = Omnimessage( + messages=(sms_inner,), + to='', +) # Omnimessage | Omnimessage object that is to be sent + +try: + # Sends an Omnimessage + response = api_instance.send_omnimessage(omnimessage) + print( + 'Successfully sent Omnimessage with id: %s that consists of the following messages:' % response.omnimessage_id + ) + for message in response.messages: + pprint(message) +except ApiException as exception: + print('Exception when sending an omnimessage: %s\n' % exception) diff --git a/code-samples/messaging/global-business/send-fallback.rb b/code-samples/messaging/global-business/send-fallback.rb new file mode 100644 index 00000000..c27a93f0 --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.rb @@ -0,0 +1,27 @@ +require 'messente_api' + +# setup authorization +MessenteApi.configure do |config| + # Configure HTTP basic authorization: basicAuth + config.username = '' + config.password = '' +end + +api_instance = MessenteApi::OmnimessageApi.new +omnimessage = MessenteApi::Omnimessage.new +omnimessage.to = '' + +sms = MessenteApi::SMS.new( + sender: "", + text: "Hello SMS!" +) + +omnimessage.messages = [sms] + +begin + result = api_instance.send_omnimessage(omnimessage) + puts result +rescue MessenteApi::ApiError => e + puts "Exception when calling send_omnimessage: #{e}" + puts e.response_body +end diff --git a/code-samples/messaging/global-business/send-fallback.sh b/code-samples/messaging/global-business/send-fallback.sh new file mode 100644 index 00000000..07506485 --- /dev/null +++ b/code-samples/messaging/global-business/send-fallback.sh @@ -0,0 +1,15 @@ +curl -X POST \ + 'https://api.messente.com/v1/omnimessage' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "to": "", + "messages": [ + { + "channel": "sms", + "sender": "", + "text": "hello sms" + } + ] + }' diff --git a/code-samples/messaging/global-business/send-single-sms.cs b/code-samples/messaging/global-business/send-single-sms.cs new file mode 100644 index 00000000..cb901536 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.cs @@ -0,0 +1,42 @@ +using System; +using com.Messente.Api.Api; +using com.Messente.Api.Client; +using com.Messente.Api.Model; + +namespace Example +{ + public class SendSingleSms + { + public static void Main() + { + Configuration conf = new Configuration + { + Username = "YOUR_MESSENTE_API_USERNAME", + Password = "YOUR_MESSENTE_API_PASSWORD" + }; + + var apiInstance = new OmnimessageApi(conf); + + var sms = new SMS(sender: "", text: "hello sms"); + OmnimessageMessagesInner smsInner = new OmnimessageMessagesInner(sms) + { + ActualInstance = sms + }; + + var omnimessage = new Omnimessage( + to: "", + messages: new System.Collections.Generic.List { smsInner } + ); + + try + { + var result = apiInstance.SendOmnimessage(omnimessage); + Console.WriteLine(result.ToJson()); + } + catch (Exception e) + { + Console.WriteLine("Exception when calling SendOmnimessage: " + e.Message); + } + } + } +} diff --git a/code-samples/messaging/global-business/send-single-sms.java b/code-samples/messaging/global-business/send-single-sms.java new file mode 100644 index 00000000..422fa065 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.java @@ -0,0 +1,35 @@ +import com.messente.ApiClient; +import com.messente.ApiException; +import com.messente.api.*; +import com.messente.auth.HttpBasicAuth; + +import java.util.Collections; + +public class SendSingleSms { + public static void main(String[] args) { + ApiClient apiClient = new ApiClient(); + OmnimessageApi apiInstance = new OmnimessageApi(apiClient); + + HttpBasicAuth basicAuth = (HttpBasicAuth) apiClient.getAuthentication("basicAuth"); + basicAuth.setUsername("YOUR_MESSENTE_API_USERNAME"); + basicAuth.setPassword("YOUR_MESSENTE_API_PASSWORD"); + + SMS sms = new SMS(); + sms.text("hello sms"); + sms.sender(""); + OmnimessageMessagesInner smsInner = new OmnimessageMessagesInner(sms); + smsInner.setActualInstance(sms); + + Omnimessage omnimessage = new Omnimessage(); + omnimessage.setMessages(Collections.singletonList(smsInner)); + omnimessage.setTo(""); + + try { + OmniMessageCreateSuccessResponse result = apiInstance.sendOmnimessage(omnimessage); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling sendOmnimessage"); + System.err.println(e.getResponseBody()); + } + } +} diff --git a/code-samples/messaging/global-business/send-single-sms.js b/code-samples/messaging/global-business/send-single-sms.js new file mode 100644 index 00000000..edb7c1a3 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.js @@ -0,0 +1,26 @@ +const MessenteApi = require('messente_api'); + +const defaultClient = MessenteApi.ApiClient.instance; +const basicAuth = defaultClient.authentications['basicAuth']; +basicAuth.username = 'YOUR_MESSENTE_API_USERNAME'; +basicAuth.password = 'YOUR_MESSENTE_API_PASSWORD'; + +const api = new MessenteApi.OmnimessageApi(); + +const sms = MessenteApi.SMS.constructFromObject({ + text: 'hello sms', + sender: '', +}); + +const omnimessage = MessenteApi.Omnimessage.constructFromObject({ + messages: [sms], + to: '', +}); + +api.sendOmnimessage(omnimessage, (error, data) => { + if (error) { + console.error(error); + } else { + console.log('API called successfully. Returned data: ', data); + } +}); diff --git a/code-samples/messaging/global-business/send-single-sms.php b/code-samples/messaging/global-business/send-single-sms.php new file mode 100644 index 00000000..87147ad2 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.php @@ -0,0 +1,30 @@ +setUsername('YOUR_MESSENTE_API_USERNAME') + ->setPassword('YOUR_MESSENTE_API_PASSWORD'); + +$apiInstance = new OmnimessageApi(new GuzzleHttp\Client(), $config); + +$sms = new SMS([ + 'text' => 'hello sms', + 'sender' => '', +]); + +$omnimessage = new Omnimessage([ + 'to' => '', + 'messages' => [$sms], +]); + +try { + $result = $apiInstance->sendOmnimessage($omnimessage); + print_r($result); +} catch (Exception $e) { + echo 'Exception when calling sendOmnimessage: ', $e->getMessage(), PHP_EOL; +} diff --git a/code-samples/messaging/global-business/send-single-sms.py b/code-samples/messaging/global-business/send-single-sms.py new file mode 100644 index 00000000..4beb442b --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.py @@ -0,0 +1,31 @@ +# pip install messente-api +from pprint import pprint +from messente_api import ( + OmnimessageApi, + SMS, + Omnimessage, + Configuration, + ApiClient, + OmnimessageMessagesInner, +) +from messente_api.rest import ApiException + +configuration = Configuration() +configuration.username = "YOUR_MESSENTE_API_USERNAME" +configuration.password = "YOUR_MESSENTE_API_PASSWORD" + +api_instance = OmnimessageApi(ApiClient(configuration)) +sms = SMS(sender="", text="hello sms") +sms_inner = OmnimessageMessagesInner(sms) +omnimessage = Omnimessage(messages=[sms_inner], to="") + +try: + response = api_instance.send_omnimessage(omnimessage) + print( + "Successfully sent Omnimessage with id: %s that consists of the following messages:" + % response.omnimessage_id + ) + for message in response.messages: + pprint(message) +except ApiException as exception: + print("Exception when sending an omnimessage: %s\n" % exception) diff --git a/code-samples/messaging/global-business/send-single-sms.rb b/code-samples/messaging/global-business/send-single-sms.rb new file mode 100644 index 00000000..a13daf71 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.rb @@ -0,0 +1,26 @@ +require 'messente_api' + +MessenteApi.configure do |config| + config.username = 'YOUR_MESSENTE_API_USERNAME' + config.password = 'YOUR_MESSENTE_API_PASSWORD' +end + +api_instance = MessenteApi::OmnimessageApi.new + +sms = MessenteApi::SMS.new( + sender: '', + text: 'hello sms' +) + +omnimessage = MessenteApi::Omnimessage.new( + to: '', + messages: [sms] +) + +begin + result = api_instance.send_omnimessage(omnimessage) + puts result +rescue MessenteApi::ApiError => e + puts "Exception when calling send_omnimessage: #{e}" + puts e.response_body +end diff --git a/code-samples/messaging/global-business/send-single-sms.sh b/code-samples/messaging/global-business/send-single-sms.sh new file mode 100644 index 00000000..07506485 --- /dev/null +++ b/code-samples/messaging/global-business/send-single-sms.sh @@ -0,0 +1,15 @@ +curl -X POST \ + 'https://api.messente.com/v1/omnimessage' \ + -u 'YOUR_MESSENTE_API_USERNAME:YOUR_MESSENTE_API_PASSWORD' \ + -H 'Content-Type: application/json' \ + -H 'Accept: application/json' \ + -d '{ + "to": "", + "messages": [ + { + "channel": "sms", + "sender": "", + "text": "hello sms" + } + ] + }' diff --git a/docs/messaging/sms/global-business/delivery-report.md b/docs/messaging/sms/global-business/delivery-report.md new file mode 100644 index 00000000..6019ebb5 --- /dev/null +++ b/docs/messaging/sms/global-business/delivery-report.md @@ -0,0 +1,210 @@ +# Delivery Report + +Delivery reports are a way to track if your messages are getting sent properly. + +--- + +## What is a delivery report? + +After receiving a message, the handset responds to the operator with Delivery Report (DLR) so that Messente knows if and when the message was delivered. + +Each time you send a message, Messente generates an ID that is unique to this particular message. + +!!! note + There are 2 ways you can get the status of the sent messages: + + * Add a callback URL to your message. Messente will make a POST request with the relevant information to the callback any time the message status changes (suggested option). + * You can request a delivery report by manually making a call to the API. + +!!! tip + The easiest way to use Omnichannel API is with our [official libraries](development-libraries.md). They will take care of authentication, request validation and response handling automatically. + +--- + +## Option 1. Add a callback URL to the message + +Messente will make a HTTP POST request to the URL in dlr_url property for every status update. + +### Callback URL + +The provided Delivery report URL (dlr_url) endpoint should respond with a HTTP status code within the range 200-399, otherwise the DRL will be considered undelivered. + +To [validate the authenticity](https://messente.com/documentation/api-setup/security/) of callback request, you can use the X-Messente-Signature header. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/get-dlr.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/get-dlr.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/get-dlr.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/get-dlr.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/get-dlr.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/get-dlr.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/get-dlr.sh !} + ``` + +### Report structure in callback request + +Example of a successful message. + +```json +{ + "status": "DELIVRD", + "sender": "MySender", + "err": 0, + "message_id": "3e28ec48-d620-4191-a96e-d91ba8ecc949", + "to": "+3725555555", + "channel": "sms", + "error": null, + "omnimessage_id": "d7248cda-6c1a-4436-acf5-aaf249bb67d3", + "timestamp": "2020-02-04T08:09:42.389630", + "price_info": { + "part_price": "0.1", + "parts_count": 2, + "total_price": "0.2" + } +} +``` + +--- + +## Option 2. Make an API call + +For most cases using dlr_url is a more suitable approach. Sometimes it's useful (usually for debugging purposes) to request the status of a specific message. In that case you can make a request to the API with the Omnimessage ID you need status of. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/get-sync-dlr.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/get-sync-dlr.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/get-sync-dlr.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/get-sync-dlr.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/get-sync-dlr.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/get-sync-dlr.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/get-sync-dlr.sh !} + ``` + +!!! danger "Caution" + Requesting regular updates for every message via API calls is very resource-heavy and costly approach. Before implementing, please consider using Option 1. + +### Report structure in API response + +Example of a successful message. + +```json +{ + "omnimessage_id": "6e29aeef-f43d-4dc0-bd12-195374c845fa", + "statuses": [ + { + "status": "DELIVRD", + "sender": "MySender", + "err": 0, + "message_id": "3e28ec48-d620-4191-a96e-d91ba8ecc949", + "to": "+3725555555", + "channel": "sms", + "error": null, + "omnimessage_id": "d7248cda-6c1a-4436-acf5-aaf249bb67d3", + "timestamp": "2020-02-04T08:09:42.389630", + "price_info": { + "part_price": "0.1", + "parts_count": 2, + "total_price": "0.2" + } + } + ], + "to": "RECIPIENT" +} +``` + +### Difference between `omnimessage_id` and `message_id` +`message_id` is a unique identifier for a single message and `omnimessage_id` groups messages that are sent with multi-channel fallback. + +Although Omnichannel API can easily be used to send single messages we've built it with multi-channel capabilities in mind. To allow easy migration between the two we add `omnimessage_id` to every message. + +--- + +## List of Message Statuses + +There can be various reasons why a message wasn't delivered or hasn't been delivered yet. + +| Status Constant | Description | +| --- | --- | +| ACK | Operator has accepted the message for delivery | +| DELIVRD | The message has been successfully delivered to the handset | +| UNDELIV | Unable to deliver message to the handset | +| FAILED | Failed to deliver message to the handset | +| UNKNOWN | Unknown status has been reported by the operator | +| ACCEPTD | Message has been accepted for the delivery and is in the operators's delivery queue | +| REJECTD | The message was rejected by the operator | +| EXPIRED | Delivery of the message expired | +| NACK | The message delivery has been rejected | +| SEEN | The message has been seen by the recipient | + +[Complete API Specification](https://messente.com/documentation/messente-api/omnimessage/) + +## Our IP Addresses + +For security reasons, you might want to restrict access to your callback URL. Here is the list of IP addresses we use to send requests from, which you can whitelist: + +* 95.216.221.43 +* 159.69.33.20 diff --git a/docs/messaging/sms/global-business/development-libraries.md b/docs/messaging/sms/global-business/development-libraries.md new file mode 100644 index 00000000..a4b29720 --- /dev/null +++ b/docs/messaging/sms/global-business/development-libraries.md @@ -0,0 +1,161 @@ +# Development Libraries + +Develop with our API libraries to get the fastest integration experience. + +--- + +!!! warning + Make sure you have [signed up](https://dashboard.messente.com/register) and have your [API keys](https://dashboard.messente.com/api-settings). + +## Install a library + +We have API libraries for various programming languages. Select your preferred programming language and follow the instructions. + +=== "Python" + + ### With PIP + + To install the API client library, simply execute: + + ```bash + pip install messente-api + ``` + + ### Or with Setuptools + + To install the API client library, simply execute: + + ```bash + python setup.py install --user + ``` + + then import the package: + + ```python + import messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-python) and [PyPI](https://pypi.org/project/messente-api) pages. + +=== "Node" + + ### Install with npm + + ```bash + npm i messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-node) and [npm](https://www.npmjs.com/package/messente_api) pages. + +=== "PHP" + + ### Install with composer + + ```bash + composer require messente/messente-api-php + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-php) and [packagist](https://packagist.org/packages/messente/messente-api-php) pages. + +=== "Java" + + ### Maven users + + Allow fetching messente-api from jcenter by placing a settings.xml file to ~/.m2 maven folder containing the following: + + ```xml + + + + + bintray + + + central + bintray + https://jcenter.bintray.com + + false + + + + + + + bintray + + + ``` + + To install the API client library to your local Maven repository, add the dependency to your project's POM: + + ```xml + + com.messente.api + messente-api + 4.2.0 + + ``` + + Now, you can install the library by running: + + ```bash + mvn clean install + ``` + + ### Gradle users + + Add jcenter repository to your project's build file: + + ```groovy + repositories { jcenter() } + ``` + + Also add the dependency to your project's build file: + + ```groovy + dependencies { implementation 'com.messente.api:messente-api' } + ``` + + ### Others + + Firstly, generate the JAR by executing: + + ```bash + mvn package -Dmaven.javadoc.skip=true + ``` + + Then manually install the following JARs: + + * target/messente-api-$VERSION_NUMBER.jar + * target/messente-api-$VERSION_NUMBER-sources.jar + * target/lib/*.jar + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-java) and [Bintray](https://bintray.com/messente/messente-api/messente-api) pages. + +=== "Ruby" + + ### Install using gem + + ```bash + gem install messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-ruby) page and [RubyGems](https://rubygems.org/gems/messente_api) pages. + +=== ".NET" + + ### Install using NuGet + + ```powershell + Install-Package com.Messente.Api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-csharp) and [NuGet](https://www.nuget.org/packages/com.Messente.Api) pages. + +[Let us know if your preferred language is not in the list](https://messente.com/contact) + +!!! warning + These libraries only contain Omnichannel and Phonebook API features. For other Messente features, you need to install different set of libraries. [Libraries page](https://messente.com/documentation/tools/libraries/) contains the list of all our SDKs. diff --git a/docs/messaging/sms/global-business/inbound-messages.md b/docs/messaging/sms/global-business/inbound-messages.md new file mode 100644 index 00000000..0dc8aea9 --- /dev/null +++ b/docs/messaging/sms/global-business/inbound-messages.md @@ -0,0 +1,55 @@ +--- +id: inbound-messages +title: Inbound Messages +slug: /omnichannel-api/inbound-messages +--- + +# Inbound Messages + +Handling inbound SMS for two-way communication. + +--- + +!!! tip + The easiest way to use Omnichannel API is with our [official libraries](development-libraries.md). Libraries will take care of authentication, request validation and response handling. + +## Inbound Message Callback + +Messente makes a HTTP POST request with JSON content to configured Inbound Number Callback URL with the following request parameters: + +* msg_id +* sub_msg_id +* channel +* recipient +* time +* text +* sender + +### Example request +```json +POST / HTTP/1.1 +Content-Type: application/json +X-Messente-Signature: 9a398f4a9ce4f96077e70b65d208420640aabb158c224bd0f29391d673ba6b3d + +{ + "msg_id": "1f5197ec-b4d7-4d5f-8bba-e005d1cadba1", + "sub_msg_id": "d276e75e-e9f5-4b44-88aa-d5c7b38a1e4a", + "channel": "sms", + "recipient": "1234", + "time": "2021-02-23T14:51:13.000000Z", + "text": "This is a test message content", + "sender": "+44000000000" +} +``` + +## Validating the request authenticity + +Messente provides every request with signature calculated using [HMAC](https://en.wikipedia.org/wiki/HMAC). The signature is calculated using the Shared Secret, available in the Inbound Numbers section of the Developers view. + +Calculated signature is provided in the HTTP headers called `X-Messente-Signature`. + +### Signature calculation formula + +```php +HMAC_SHA256("$shared_secret", "$http_request_body") +``` diff --git a/docs/messaging/sms/global-business/index.md b/docs/messaging/sms/global-business/index.md new file mode 100644 index 00000000..1ab48812 --- /dev/null +++ b/docs/messaging/sms/global-business/index.md @@ -0,0 +1,323 @@ +# Overview + +Follow the guide to add SMS messages to your application in minutes. + +--- + +Sending a message using the API is a three-step process. + +1. [Sign up](https://dashboard.messente.com/register) to Messente and [receive your API keys](https://dashboard.messente.com/api-settings) (no credit card required). +2. Verify your phone number as sender ID or request a [branded Sender name](sender-name.md). +3. Using the API keys, make an API request with the desired message and recipient. + +!!! tip + Upon sign up we will add you some free credits so you can test out the service immediately. With it you can send a few test messages. + +!!! warning "API key required" + Follow this guide to send a message, once you have [received your API keys](https://dashboard.messente.com/api-settings). + +## Install a library + +The fastest way to get started with the API is to use our official libraries. + +Select your preferred programming language and follow the instructions. + +=== "Python" + + ### With PIP + + To install the API client library, simply execute: + + ```bash + pip install messente-api + ``` + + ### Or with Setuptools + + To install the API client library, simply execute: + + ```bash + python setup.py install --user + ``` + + then import the package: + + ```python + import messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-python) and [PyPI](https://pypi.org/project/messente-api) pages. + +=== "Node" + + ### Install with npm + + ```bash + npm i messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-node) and [npm](https://www.npmjs.com/package/messente_api) pages. + +=== "PHP" + + ### Install with composer + + ```bash + composer require messente/messente-api-php + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-php) and [packagist](https://packagist.org/packages/messente/messente-api-php) pages. + +=== "Java" + + ### Maven users + + Allow fetching messente-api from jcenter by placing a settings.xml file to ~/.m2 maven folder containing the following: + + ```xml + + + + + bintray + + + central + bintray + https://jcenter.bintray.com + + false + + + + + + + bintray + + + ``` + + To install the API client library to your local Maven repository, add the dependency to your project's POM: + + ```xml + + com.messente.api + messente-api + 4.2.0 + + ``` + + Now, you can install the library by running: + + ```bash + mvn clean install + ``` + + ### Gradle users + + Add jcenter repository to your project's build file: + + ```groovy + repositories { jcenter() } + ``` + + Also add the dependency to your project's build file: + + ```groovy + dependencies { implementation 'com.messente.api:messente-api' } + ``` + + ### Others + + Firstly, generate the JAR by executing: + + ```bash + mvn package -Dmaven.javadoc.skip=true + ``` + + Then manually install the following JARs: + + * target/messente-api-$VERSION_NUMBER.jar + * target/messente-api-$VERSION_NUMBER-sources.jar + * target/lib/*.jar + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-java) and [Bintray](https://bintray.com/messente/messente-api/messente-api) pages. + +=== "Ruby" + + ### Install using gem + + ```bash + gem install messente_api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-ruby) page and [RubyGems](https://rubygems.org/gems/messente_api) pages. + +=== ".NET" + + ### Install using NuGet + + ```powershell + Install-Package com.Messente.Api + ``` + + Take a look at the library's [GitHub](https://github.com/messente/messente-api-csharp) and [NuGet](https://www.nuget.org/packages/com.Messente.Api) pages. + +[Let us know if your preferred language is not in the list](https://messente.com/contact) + +!!! warning + These libraries only contain Omnichannel and Phonebook API features. For other Messente features, you need to install different set of libraries. [Libraries page](https://messente.com/documentation/tools/libraries/) contains the list of all our SDKs. + +## Send a single SMS + +Use the following example to send an SMS using Omnichannel API. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/send-single-sms.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/send-single-sms.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/send-single-sms.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/send-single-sms.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/send-single-sms.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/send-single-sms.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/send-single-sms.sh !} + ``` + +[Detailed API Reference on sending an SMS](https://messente.com/documentation/messente-api/omnimessage/) + +## Get delivery reports + +Messente tracks your sent message and reports [status updates](delivery-report.md) back to you. + +To be able to view the status, you must add a callback URL to the message. Messente will use this URL to make HTTP POST requests, if there is a status update. + +Here is a code snippet for you to test it out quickly. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/get-dlr.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/get-dlr.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/get-dlr.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/get-dlr.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/get-dlr.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/get-dlr.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/get-dlr.sh !} + ``` + +[Learn more about the delivery status](delivery-report.md) + +## Send an SMS with Omnichannel API + +You can also use the Omnichannel API to send an SMS message directly. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/send-fallback.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/send-fallback.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/send-fallback.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/send-fallback.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/send-fallback.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/send-fallback.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/send-fallback.sh !} + ``` + +## Next steps + +Integrating SMS to your application should never take more than a day. +Now that you have things set up it's time to get yourself a proper [sender name](sender-name.md). diff --git a/docs/messaging/sms/global-business/requests-and-authentication.md b/docs/messaging/sms/global-business/requests-and-authentication.md new file mode 100644 index 00000000..7bf92512 --- /dev/null +++ b/docs/messaging/sms/global-business/requests-and-authentication.md @@ -0,0 +1,60 @@ +--- +id: requests-and-authentication +title: Requests & Authentication +slug: /omnichannel-api/requests-and-authentication +--- + +# Requests & Authentication + +Learn the basics of how to make a request and authenticate yourself. + +--- + +!!! tip + The easiest way to use Omnichannel API is with our [official libraries](development-libraries.md). They will take care of authentication, request validation and response handling automatically. + +## Request + +### Authentication + +Authentication is done using HTTP Basic Authentication with your API username and password. [Sign up](https://dashboard.messente.com/register) to Messente and [receive your API credentials](https://dashboard.messente.com/api-settings) (no credit card required). + +### Making a Request + +API requests are made to the following server: + +```text +https://api.messente.com +``` + +You need to pass the Content-Type headers to the API so the response would be in the correct format. + +```text +Accept: application/json +Content-Type: application/json +``` + +!!! warning + You need to pass Content-Type and Authentication headers with every request. + +Basic request example: + +```bash +curl -X POST \ + 'https://api.messente.com/v1/omnimessage' \ + -u MESSENTE_API_USERNAME:MESSENTE_API_PASSWORD \ + -H "Content-Type: application/json" \ + -H "Accept: application/json" \ + -d '{ "to": "RECIPIENT_PHONE_NUMBER", "messages": [{ "channel": "sms", "sender": "YOUR_PHONE_NUMBER", "text": "Happy messaging!" }] }, "dlr_url": "YOUR_WEBHOOK_URL"' +``` + +### IP Address Whitelisting + +Configure your account in the [dashboard](https://dashboard.messente.com/api-settings) to allow API requests only from certain IPs. + +If you do not have a fixed IP address, you can also specify the [IP address ranges](https://messente.com/blog/messente/whitelist-ip-address-range-sms-api) in CIDR notation. + +If you need to disable IP address validation, you can set the value to 0.0.0.0/0 (enable all IPv4 addresses). + +!!! danger "Security Warning" + It is strongly encouraged to whitelist only IP addresses that are used to make HTTP calls to Messente's API. diff --git a/docs/messaging/sms/global-business/scheduled-messages.md b/docs/messaging/sms/global-business/scheduled-messages.md new file mode 100644 index 00000000..0daacadc --- /dev/null +++ b/docs/messaging/sms/global-business/scheduled-messages.md @@ -0,0 +1,116 @@ +--- +id: scheduled-messages +title: Scheduled Messages +slug: /omnichannel-api/scheduled-messages +--- + +# Scheduled Messages + +Schedule messages to be sent for later. + +--- + +!!! tip + The easiest way to use Omnichannel API is with our [official libraries](development-libraries.md). They will take care of authentication, request validation and response handling automatically. + +## Schedule a message + +Send a message with `time_to_send` parameter to schedule it for later. Learn how to compose a message in our [quickstart guide](index.md). + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/schedule-message.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/schedule-message.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/schedule-message.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/schedule-message.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/schedule-message.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/schedule-message.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/schedule-message.sh !} + ``` + +!!! note "Time format" + * Time must be specified in the ISO 8601 format. + * Default timezone is UTC. + + For example, both of the cases below are allowed: + + * `2019-06-22T09:05` - UTC is set as timezone + * `2019-06-22T09:05:07+04:00` - Default timezone is ignored and UTC+4 is used + + +## Cancel a scheduled message + +To cancel a scheduled message you need to know the omnimessage_id that you got when you sent out the message. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/cancel-message.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/cancel-message.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/cancel-message.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/cancel-message.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/cancel-message.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/cancel-message.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/cancel-message.sh !} + ``` diff --git a/docs/messaging/sms/global-business/sender-name.md b/docs/messaging/sms/global-business/sender-name.md new file mode 100644 index 00000000..1649dbbd --- /dev/null +++ b/docs/messaging/sms/global-business/sender-name.md @@ -0,0 +1,38 @@ +--- +id: sender-name +title: Sender Name +slug: /omnichannel-api/sender-name +--- + +# Sender Name + +Identify yourself with a telephone number or as a brand. + +--- + +## What is a Sender Name? +Your sender name (or Sender ID) is the phone number or name that the recipient sees as the sender of the message. +![Sender Name](https://messente.com/documentation/img/guides/sender_name_example.png) + +## Sender types +Messente supports 3 different types of sender IDs: + +* Regular phone number (eg +372 5555 6666) +* Shortcode (usually 3-6 characters) (eg 123, 20010) +* Branded sender name (Messente, Volvo, Coca Cola) + +!!! tip + You can have multiple Sender IDs connected to your account and they are free of charge. + +!!! info + Registering a branded sender name is a manual process and might take up to 24 hours. Registration for regular phone number as sender name is automatic and instantaneous. + +## Restrictions +**Phone numbers** as numeric Sender IDs can be up to 15 digits long (excluding the "+" sign) and can include country codes, mobile operator codes, individual phone numbers, destination codes, identifying the subscriber's operator, etc. It's also possible to reply to a phone number by just hitting the reply button. + +**Short codes** are special numbers, that are usually shorter than the standard phone numbers and are typically used for things like customer support service, voting or premium rate mobile services. + +**Alphanumeric Sender IDs** (or Branded sender names) may include characters from the alphabet (A-Z) numeric characters (0-9) and have the maximum length up to 11 characters. Please note that the SMS recipients cannot reply to alphanumeric Sender IDs. + +!!! warning + In some countries branded Sender IDs as a feature is not supported due to local legislation or local mobile operators. In these cases most often a random phone number will be displayed as the sender. Contact us for more details. diff --git a/docs/messaging/sms/global-business/sms-message.md b/docs/messaging/sms/global-business/sms-message.md new file mode 100644 index 00000000..dbb0fe40 --- /dev/null +++ b/docs/messaging/sms/global-business/sms-message.md @@ -0,0 +1,126 @@ +# SMS Message + +Sending SMS messages with Omnichannel API. + +--- + +!!! tip + The easiest way to use Omnichannel API is with our [official libraries](development-libraries.md). Libraries will take care of authentication, request validation and response handling. + +## Send a single SMS + +Use the following example to send an SMS using Omnichannel API. + +=== "Python" + + ```python + {!> code-samples/messaging/global-business/send-single-sms.py !} + ``` + +=== "Node" + + ```javascript + {!> code-samples/messaging/global-business/send-single-sms.js !} + ``` + +=== "PHP" + + ```php + {!> code-samples/messaging/global-business/send-single-sms.php !} + ``` + +=== "Java" + + ```java + {!> code-samples/messaging/global-business/send-single-sms.java !} + ``` + +=== "Ruby" + + ```ruby + {!> code-samples/messaging/global-business/send-single-sms.rb !} + ``` + +=== ".NET" + + ```csharp + {!> code-samples/messaging/global-business/send-single-sms.cs !} + ``` + +=== "cURL" + + ```bash + {!> code-samples/messaging/global-business/send-single-sms.sh !} + ``` + +The API will return a response with an **omnimessage_id**, as well as a **message_id** for each "sub-message" (fallback channel). You can use these IDs to track the [delivery status](delivery-report.md) of the message. + +```json +{ + "messages": [ + { + "channel": "sms", + "message_id": "fr593ce7-68de-5e44-bc50-044a3ad0a7fa", + "sender": "YOUR_PHONE_NUMBER" + } + ], + "omnimessage_id": "632c6f3d-49d0-4a8f-5k2n-74023d31e51d", + "to": "RECIPIENT_PHONE_NUMBER" +} +``` + +--- + +## Constructing Messages + +There are few things to keep in mind when composing SMS messages. + +### Be aware of non-GSM friendly characters + +A single SMS can contain 160 characters. However, SMS is built to use 7-bit GSM 03.38 character encoding set and this means that certain unicode characters (that are not in GSM character set) don't fit into the message. You can use our [SMS calculator](https://messente.com/sms-length-calculator) to check how many characters your message contains and how many SMS messages it will take to send it. + +If your message contains any characters not listed in the 7-bit alphabet then the message encoding will be set to UCS-2. With it, the message length is limited to 70 characters. + +**By default, the API will [convert all non-GSM](https://messente.com/documentation/tools/autoreplace/) friendly characters to similar characters in GSM 03.38 encoding set.** This allows you to send messages with non-unicode characters and not worry about the GSM specification. + +!!! info + You can turn the character replace feature off by configuring the `autoconvert` parameter in the message. + + ```text + autoconvert: on(default)|full|off + ``` + +[SMS Length Calculator](https://messente.com/sms-length-calculator) + +[How to configure which characters get replaced](https://messente.com/documentation/tools/autoreplace/) + +## Message Validity and Retry Policy + +Messente forwards the SMS request to the operators, who, in turn, will retry SMS delivery for a **minimum of 6 hours.** + +That being said, operators differ in their policies so some may retry SMS delivery up to 48 hours in total, starting with shorter retry intervals and switching to longer retry intervals towards the end. Some, on the other hand, may only retry for the required minimum of 6 hours indicated by us. + +!!! info "SMPP protocol" + Although we don't encourage it, we also support SMPP protocol for sending SMS messages. Learn how to set up [SMPP integration](https://messente.com/documentation/smpp-api/). + +### Error example + +```json +{ + "errors": [ + { + "code": "105", + "detail": "Invalid or disallowed sender Messente", + "source": "payload[sms][sender]", + "title": "Invalid data" + } + ] +} +``` + +| Field | Description | +| --- | --- | +| `title` | Error message | +| `detail` | Longer description of the error message | +| `source` | Location in the request body for this error message | +| `code` | Machine-readable error code:
101 - Not found
102 - Forbidden
103 - Unauthorized
104 - Internal Server Error
105 - Invalid data
106 - Missing data
107 - Method not allowed | diff --git a/mkdocs.yml b/mkdocs.yml index 7228b975..4b4f9b3a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -143,6 +143,15 @@ nav: # - 'Migration Guide': 'messaging/sms/migration-guide.md' - 'SMS Consent': - 'Consent management': 'messaging/sms/messaging-consent-management.md' + - 'Global Business SMS': + - 'Overview': 'messaging/sms/global-business/index.md' + - 'Development Libraries': 'messaging/sms/global-business/development-libraries.md' + - 'SMS Message': 'messaging/sms/global-business/sms-message.md' + - 'Sender Name': 'messaging/sms/global-business/sender-name.md' + - 'Delivery Report': 'messaging/sms/global-business/delivery-report.md' + - 'Inbound Messages': 'messaging/sms/global-business/inbound-messages.md' + - 'Scheduled Messages': 'messaging/sms/global-business/scheduled-messages.md' + - 'Requests and Authentication': 'messaging/sms/global-business/requests-and-authentication.md' - 'High Volume SMS': - 'Overview': 'messaging/sms/high-volume/index.md' - 'Best Practices': 'messaging/sms/high-volume/best-practices.md'