From 3355e98549954f4105f473b5b54256a216ae5988 Mon Sep 17 00:00:00 2001 From: kwtSMS Admin Date: Sat, 28 Mar 2026 17:23:17 +0300 Subject: [PATCH 1/2] Add kwtSMS Independent Publisher connector --- .../kwtSMS/README.md | 73 +++ .../kwtSMS/apiDefinition.swagger.json | 468 ++++++++++++++++++ .../kwtSMS/apiProperties.json | 79 +++ .../kwtSMS/icon.png | Bin 0 -> 13407 bytes 4 files changed, 620 insertions(+) create mode 100755 independent-publisher-connectors/kwtSMS/README.md create mode 100755 independent-publisher-connectors/kwtSMS/apiDefinition.swagger.json create mode 100755 independent-publisher-connectors/kwtSMS/apiProperties.json create mode 100755 independent-publisher-connectors/kwtSMS/icon.png diff --git a/independent-publisher-connectors/kwtSMS/README.md b/independent-publisher-connectors/kwtSMS/README.md new file mode 100755 index 0000000000..3d395c137e --- /dev/null +++ b/independent-publisher-connectors/kwtSMS/README.md @@ -0,0 +1,73 @@ +# kwtSMS for Microsoft Power Automate + +[![OpenAPI Validation](https://github.com/boxlinknet/kwtsms-mspowerauto/actions/workflows/validate.yml/badge.svg)](https://github.com/boxlinknet/kwtsms-mspowerauto/actions/workflows/validate.yml) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Power Automate](https://img.shields.io/badge/Power%20Automate-Independent%20Publisher-blue)](https://learn.microsoft.com/en-us/connectors/custom-connectors/certification-submission-ip) +[![kwtSMS](https://img.shields.io/badge/kwtSMS-SMS%20Gateway-FFA200)](https://www.kwtsms.com) + +## About kwtSMS + +[kwtSMS](https://www.kwtsms.com) is a Kuwait-based SMS gateway that delivers messages to 200+ countries. Built for businesses that need reliable A2P (Application-to-Person) messaging: OTP verification, transactional alerts, marketing campaigns, and notifications. Full Arabic language support, pre-approved sender IDs, and a straightforward REST JSON interface. + +## About this integration + +A Microsoft Power Automate custom connector that brings kwtSMS into your automated workflows. Send SMS messages directly from Power Automate flows triggered by events in SharePoint, Dynamics 365, Outlook, Teams, or any of the 1,000+ connectors in the Power Platform ecosystem. + +Submitted as an [Independent Publisher](https://learn.microsoft.com/en-us/connectors/custom-connectors/certification-submission-ip) connector. + +**Publisher:** kwtSMS + +## Features + +- **Send SMS** - Send messages to one or up to 200 recipients in a single action. Supports English, Arabic, and Unicode content. +- **Check Balance** - Monitor your available SMS credits and total purchased credits from within your flows. +- **List Sender IDs** - Retrieve all approved sender IDs on your account for dynamic sender selection. +- **Check Coverage** - List active country codes to verify delivery availability before sending. +- **Validate Numbers** - Validate phone numbers in bulk. Returns numbers grouped as valid (OK), format error (ER), or no route (NR). +- **Test Mode** - Built-in test mode on Send SMS. Messages are queued but not delivered, credits are recoverable. + +## Prerequisites + +You need a kwtSMS account with API access enabled. [Sign up at kwtsms.com](https://www.kwtsms.com). + +## Obtaining Credentials + +1. Log in to your kwtSMS account at [kwtsms.com](https://www.kwtsms.com) +2. Your API credentials are the same username and password you use to log in +3. You need at least one approved Sender ID. The default testing sender is `KWT-SMS` + +**Note:** Your API username is NOT your mobile number. Use the account username and password. + +## Supported Operations + +| Operation | Description | +|-----------|-------------| +| **Send SMS** | Send a message to one or more recipients (max 200 per request). Optional test mode. | +| **Check Balance** | Get available and total purchased SMS credits. | +| **List Sender IDs** | Get all approved sender IDs for your account. | +| **Check Coverage** | List active country codes available for sending. | +| **Validate Numbers** | Validate phone numbers. Returns OK, ER (format error), NR (no route) arrays. | + +## Important Notes + +- Phone numbers must be in international format, digits only (for example `96598765432`). No `+` prefix, no spaces, no dashes. +- Sender ID is case sensitive. `KWT-SMS` is for testing only, register a private sender ID for production use. +- English messages: 160 characters per page. Arabic messages: 70 characters per page. +- Messages must not contain emojis or HTML tags. +- Maximum 200 numbers per Send SMS request. For larger lists, split into multiple requests. +- The `unix-timestamp` in responses uses GMT+3 (Asia/Kuwait) server time, not UTC. +- Set test mode to 1 during development. Messages are queued but not delivered, and credits can be recovered by deleting from the sending queue in your kwtSMS dashboard. + +## Known Issues and Limitations + +- Delivery reports (DLR) are not available for Kuwait numbers, only for international numbers. +- The default `KWT-SMS` sender ID may experience delays and is blocked on some carriers. Use a private sender ID for production. +- There is a 15-second minimum between messages to the same phone number (ERR028). + +## Links + +- [kwtSMS Website](https://www.kwtsms.com) +- [kwtSMS Integrations](https://www.kwtsms.com/integrations.html) +- [kwtSMS Support](https://www.kwtsms.com/support.html) +- [Power Automate Custom Connectors](https://learn.microsoft.com/en-us/connectors/custom-connectors/) +- [Independent Publisher Program](https://learn.microsoft.com/en-us/connectors/custom-connectors/certification-submission-ip) diff --git a/independent-publisher-connectors/kwtSMS/apiDefinition.swagger.json b/independent-publisher-connectors/kwtSMS/apiDefinition.swagger.json new file mode 100755 index 0000000000..054de579a2 --- /dev/null +++ b/independent-publisher-connectors/kwtSMS/apiDefinition.swagger.json @@ -0,0 +1,468 @@ +{ + "swagger": "2.0", + "info": { + "title": "kwtSMS", + "description": "Send single or bulk SMS messages worldwide through the kwtSMS gateway. Check your credit balance, list approved sender IDs, validate phone numbers, and verify country coverage.", + "version": "1.0", + "contact": { + "name": "kwtSMS Support", + "url": "https://www.kwtsms.com/support.html", + "email": "support@kwtsms.com" + } + }, + "host": "www.kwtsms.com", + "basePath": "/API", + "schemes": [ + "https" + ], + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "paths": { + "/balance/": { + "post": { + "summary": "Check Balance", + "description": "Check available SMS credits and total purchased credits for your account.", + "operationId": "CheckBalance", + "responses": { + "200": { + "description": "Balance retrieved successfully", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "OK on success, ERROR on failure", + "title": "Result" + }, + "available": { + "type": "number", + "description": "Available SMS credits", + "title": "Available Credits" + }, + "purchased": { + "type": "number", + "description": "Total purchased SMS credits", + "title": "Purchased Credits" + }, + "code": { + "type": "string", + "description": "Error code (only present on error)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description (only present on error)", + "title": "Error Description" + } + } + } + }, + "default": { + "description": "Error response", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "ERROR", + "title": "Result" + }, + "code": { + "type": "string", + "description": "Error code (for example ERR003)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description", + "title": "Error Description" + } + } + } + } + }, + "x-ms-visibility": "important" + } + }, + "/senderid/": { + "post": { + "summary": "List Sender IDs", + "description": "List all approved sender IDs for your kwtSMS account.", + "operationId": "ListSenderIDs", + "responses": { + "200": { + "description": "Sender IDs retrieved successfully", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "OK on success, ERROR on failure", + "title": "Result" + }, + "senderid": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of approved sender IDs", + "title": "Sender IDs" + }, + "code": { + "type": "string", + "description": "Error code (only present on error)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description (only present on error)", + "title": "Error Description" + } + } + } + }, + "default": { + "description": "Error response", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "ERROR", + "title": "Result" + }, + "code": { + "type": "string", + "description": "Error code (for example ERR003)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description", + "title": "Error Description" + } + } + } + } + }, + "x-ms-visibility": "advanced" + } + }, + "/coverage/": { + "post": { + "summary": "Check Coverage", + "description": "List active country codes available for sending SMS on your account.", + "operationId": "CheckCoverage", + "responses": { + "200": { + "description": "Coverage list retrieved successfully", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "OK on success, ERROR on failure", + "title": "Result" + }, + "prefixes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of active country codes", + "title": "Country Codes" + }, + "code": { + "type": "string", + "description": "Error code (only present on error)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description (only present on error)", + "title": "Error Description" + } + } + } + }, + "default": { + "description": "Error response", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "ERROR", + "title": "Result" + }, + "code": { + "type": "string", + "description": "Error code (for example ERR003)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description", + "title": "Error Description" + } + } + } + } + }, + "x-ms-visibility": "advanced" + } + }, + "/validate/": { + "post": { + "summary": "Validate Numbers", + "description": "Validate phone numbers before sending. Returns numbers grouped as OK (valid), ER (format error), or NR (no route).", + "operationId": "ValidateNumbers", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "mobile": { + "type": "string", + "description": "Phone number(s) to validate, comma-separated (digits only, international format, for example 96598765432)", + "title": "Mobile Number(s)" + } + }, + "required": [ + "mobile" + ] + } + } + ], + "responses": { + "200": { + "description": "Validation results", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "OK on success, ERROR on failure", + "title": "Result" + }, + "mobile": { + "type": "object", + "description": "Validation results grouped by status", + "title": "Validation Results", + "properties": { + "OK": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Valid and routable numbers", + "title": "Valid Numbers" + }, + "ER": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Numbers with format errors", + "title": "Error Numbers" + }, + "NR": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Numbers with no route (country not activated)", + "title": "No Route Numbers" + } + } + }, + "code": { + "type": "string", + "description": "Error code (only present on error)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description (only present on error)", + "title": "Error Description" + } + } + } + }, + "default": { + "description": "Error response", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "ERROR", + "title": "Result" + }, + "code": { + "type": "string", + "description": "Error code (for example ERR003)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description", + "title": "Error Description" + } + } + } + } + }, + "x-ms-visibility": "advanced" + } + }, + "/send/": { + "post": { + "summary": "Send SMS", + "description": "Send an SMS message to one or more recipients. For bulk sends, provide comma-separated numbers (max 200 per request). Numbers must be in international format, digits only (for example 96598765432).", + "operationId": "SendSMS", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "mobile": { + "type": "string", + "description": "Recipient phone number(s), comma-separated for bulk (max 200). Digits only, international format (for example 96598765432)", + "title": "Mobile Number(s)" + }, + "message": { + "type": "string", + "description": "Message content. English: 160 chars/page, Arabic: 70 chars/page. No emojis or HTML.", + "title": "Message" + }, + "test": { + "type": "integer", + "description": "Set to 1 for test mode (message queued but not delivered, credits recoverable). Default: 0", + "title": "Test Mode", + "default": 0, + "enum": [ + 0, + 1 + ], + "x-ms-visibility": "advanced" + } + }, + "required": [ + "mobile", + "message" + ] + } + } + ], + "responses": { + "200": { + "description": "SMS send result", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "OK on success, ERROR on failure", + "title": "Result" + }, + "msg-id": { + "type": "string", + "description": "Message identifier (save this for status lookups)", + "title": "Message ID" + }, + "numbers": { + "type": "integer", + "format": "int32", + "description": "Count of numbers accepted and dispatched", + "title": "Numbers Sent" + }, + "points-charged": { + "type": "integer", + "format": "int32", + "description": "SMS credits deducted", + "title": "Points Charged" + }, + "balance-after": { + "type": "number", + "description": "Account balance after deduction", + "title": "Balance After" + }, + "unix-timestamp": { + "type": "integer", + "format": "int64", + "description": "Server timestamp (GMT+3 Asia/Kuwait)", + "title": "Timestamp" + }, + "code": { + "type": "string", + "description": "Error code (only present on error)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description (only present on error)", + "title": "Error Description" + } + } + } + }, + "default": { + "description": "Error response", + "schema": { + "type": "object", + "properties": { + "result": { + "type": "string", + "description": "ERROR", + "title": "Result" + }, + "code": { + "type": "string", + "description": "Error code (for example ERR003)", + "title": "Error Code" + }, + "description": { + "type": "string", + "description": "Error description", + "title": "Error Description" + } + } + } + } + }, + "x-ms-visibility": "important" + } + } + }, + "definitions": {}, + "parameters": {}, + "responses": {}, + "securityDefinitions": {}, + "security": [], + "tags": [], + "x-ms-connector-metadata": [ + { + "propertyName": "Website", + "propertyValue": "https://www.kwtsms.com" + }, + { + "propertyName": "Privacy policy", + "propertyValue": "https://www.kwtsms.com/privacy.html" + }, + { + "propertyName": "Categories", + "propertyValue": "Communication" + } + ] +} \ No newline at end of file diff --git a/independent-publisher-connectors/kwtSMS/apiProperties.json b/independent-publisher-connectors/kwtSMS/apiProperties.json new file mode 100755 index 0000000000..1f30a3f90c --- /dev/null +++ b/independent-publisher-connectors/kwtSMS/apiProperties.json @@ -0,0 +1,79 @@ +{ + "properties": { + "connectionParameters": { + "username": { + "type": "string", + "uiDefinition": { + "displayName": "Username", + "description": "Your kwtSMS account username", + "tooltip": "Enter your kwtSMS username (not your mobile number)", + "constraints": { + "tabIndex": 1, + "required": "true" + } + } + }, + "password": { + "type": "securestring", + "uiDefinition": { + "displayName": "Password", + "description": "Your kwtSMS account password", + "tooltip": "Enter your kwtSMS password", + "constraints": { + "tabIndex": 2, + "clearText": false, + "required": "true" + } + } + }, + "senderID": { + "type": "string", + "uiDefinition": { + "displayName": "Sender ID", + "description": "Your approved sender ID", + "tooltip": "Enter your approved kwtSMS sender ID (case sensitive)", + "constraints": { + "tabIndex": 3, + "required": "true" + } + } + } + }, + "iconBrandColor": "#FFA200", + "capabilities": [], + "policyTemplateInstances": [ + { + "templateId": "setproperty", + "title": "Inject username into body", + "parameters": { + "x-ms-apimTemplateParameter.newPropertyParentPathTemplate": "@body()", + "x-ms-apimTemplateParameter.newPropertySubPathTemplate": "username", + "x-ms-apimTemplateParameter.propertyValuePathTemplate": "@connectionParameters('username')", + "x-ms-apimTemplate-policySection": "Request" + } + }, + { + "templateId": "setproperty", + "title": "Inject password into body", + "parameters": { + "x-ms-apimTemplateParameter.newPropertyParentPathTemplate": "@body()", + "x-ms-apimTemplateParameter.newPropertySubPathTemplate": "password", + "x-ms-apimTemplateParameter.propertyValuePathTemplate": "@connectionParameters('password')", + "x-ms-apimTemplate-policySection": "Request" + } + }, + { + "templateId": "setproperty", + "title": "Inject sender into body", + "parameters": { + "x-ms-apimTemplateParameter.newPropertyParentPathTemplate": "@body()", + "x-ms-apimTemplateParameter.newPropertySubPathTemplate": "sender", + "x-ms-apimTemplateParameter.propertyValuePathTemplate": "@connectionParameters('senderID')", + "x-ms-apimTemplate-policySection": "Request" + } + } + ], + "publisher": "kwtSMS", + "stackOwner": "kwtSMS" + } +} diff --git a/independent-publisher-connectors/kwtSMS/icon.png b/independent-publisher-connectors/kwtSMS/icon.png new file mode 100755 index 0000000000000000000000000000000000000000..8473f89a3f99c2ea34e3b021ec5a45a76c7ebeca GIT binary patch literal 13407 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 literal 0 HcmV?d00001 From fcce6215b5fa771d647c3d8c65f32afa2ea4e336 Mon Sep 17 00:00:00 2001 From: kwtSMS Admin Date: Sat, 28 Mar 2026 17:48:56 +0300 Subject: [PATCH 2/2] Add kwtSMS Independent Publisher connector --- independent-publisher-connectors/kwtSMS/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/independent-publisher-connectors/kwtSMS/README.md b/independent-publisher-connectors/kwtSMS/README.md index 3d395c137e..989ba28a4a 100755 --- a/independent-publisher-connectors/kwtSMS/README.md +++ b/independent-publisher-connectors/kwtSMS/README.md @@ -71,3 +71,4 @@ You need a kwtSMS account with API access enabled. [Sign up at kwtsms.com](https - [kwtSMS Support](https://www.kwtsms.com/support.html) - [Power Automate Custom Connectors](https://learn.microsoft.com/en-us/connectors/custom-connectors/) - [Independent Publisher Program](https://learn.microsoft.com/en-us/connectors/custom-connectors/certification-submission-ip) +