Get the FREE Ultimate OpenClaw Setup Guide →
b

ClickSend

Scanned

@byungkyu

npx machina-cli add skill @byungkyu/clicksend --openclaw
Files (1)
SKILL.md
15.7 KB

ClickSend

Access the ClickSend API with managed authentication. Send SMS, MMS, and voice messages, manage contacts and lists, and track message delivery.

Quick Start

# Get account info
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/clicksend/v3/account')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Base URL

https://gateway.maton.ai/clicksend/{native-api-path}

Replace {native-api-path} with the actual ClickSend API endpoint path. The gateway proxies requests to rest.clicksend.com and automatically injects your authentication.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your ClickSend connections at https://ctrl.maton.ai.

List Connections

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=clicksend&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'clicksend'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Get Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "37beee67-29f7-43b6-b0b2-5f0f7a5d6440",
    "status": "ACTIVE",
    "creation_time": "2026-02-10T10:04:12.418030Z",
    "last_updated_time": "2026-02-10T10:06:17.059090Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "clicksend",
    "metadata": {}
  }
}

Delete Connection

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple ClickSend connections, specify which one to use with the Maton-Connection header:

python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/clicksend/v3/account')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '37beee67-29f7-43b6-b0b2-5f0f7a5d6440')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If omitted, the gateway uses the default (oldest) active connection.

API Reference

Response Format

All ClickSend API responses follow this structure:

{
  "http_code": 200,
  "response_code": "SUCCESS",
  "response_msg": "Description of the result",
  "data": { ... }
}

Account

Get Account

GET /clicksend/v3/account

Response:

{
  "http_code": 200,
  "response_code": "SUCCESS",
  "response_msg": "Here's your account",
  "data": {
    "user_id": 672721,
    "username": "user@example.com",
    "user_email": "user@example.com",
    "balance": "2.005718",
    "user_phone": "+18019234886",
    "user_first_name": "John",
    "user_last_name": "Doe",
    "country": "US",
    "default_country_sms": "US",
    "timezone": "America/Chicago",
    "_currency": {
      "currency_name_short": "USD",
      "currency_prefix_d": "$"
    }
  }
}

SMS

Send SMS

POST /clicksend/v3/sms/send
Content-Type: application/json

{
  "messages": [
    {
      "to": "+15551234567",
      "body": "Hello from ClickSend!",
      "source": "api"
    }
  ]
}

Parameters:

FieldTypeDescription
tostringRecipient phone number (E.164 format)
bodystringSMS message content
sourcestringSource identifier (e.g., "api", "sdk")
fromstringSender ID (optional)
scheduleintUnix timestamp for scheduled send (optional)
custom_stringstringCustom reference (optional)

Get SMS Price

POST /clicksend/v3/sms/price
Content-Type: application/json

{
  "messages": [
    {
      "to": "+15551234567",
      "body": "Test message",
      "source": "api"
    }
  ]
}

SMS History

GET /clicksend/v3/sms/history

Query Parameters:

ParameterDescription
date_fromUnix timestamp for start date
date_toUnix timestamp for end date
pagePage number (default: 1)
limitResults per page (default: 15)

Inbound SMS

GET /clicksend/v3/sms/inbound

SMS Receipts (Delivery Reports)

GET /clicksend/v3/sms/receipts

Cancel Scheduled SMS

PUT /clicksend/v3/sms/{message_id}/cancel

Cancel All Scheduled SMS

PUT /clicksend/v3/sms/cancel-all

SMS Templates

List Templates

GET /clicksend/v3/sms/templates

Response:

{
  "http_code": 200,
  "response_code": "SUCCESS",
  "response_msg": "Here are your templates.",
  "data": {
    "total": 1,
    "per_page": 15,
    "current_page": 1,
    "data": [
      {
        "template_id": 632497,
        "body": "Hello {name}, this is a test message.",
        "template_name": "Test Template"
      }
    ]
  }
}

Create Template

POST /clicksend/v3/sms/templates
Content-Type: application/json

{
  "template_name": "Welcome Message",
  "body": "Hello {name}, welcome to our service!"
}

Update Template

PUT /clicksend/v3/sms/templates/{template_id}
Content-Type: application/json

{
  "template_name": "Updated Template",
  "body": "Updated message content"
}

Delete Template

DELETE /clicksend/v3/sms/templates/{template_id}

MMS

Send MMS

POST /clicksend/v3/mms/send
Content-Type: application/json

{
  "messages": [
    {
      "to": "+15551234567",
      "body": "Check out this image!",
      "media_file": "https://example.com/image.jpg",
      "source": "api"
    }
  ]
}

MMS History

GET /clicksend/v3/mms/history

Get MMS Price

POST /clicksend/v3/mms/price
Content-Type: application/json

{
  "messages": [...]
}

MMS Receipts

GET /clicksend/v3/mms/receipts

Voice

Send Voice Message

POST /clicksend/v3/voice/send
Content-Type: application/json

{
  "messages": [
    {
      "to": "+15551234567",
      "body": "Hello, this is a voice message.",
      "voice": "female",
      "lang": "en-us",
      "source": "api"
    }
  ]
}

Voice Parameters:

FieldDescription
toRecipient phone number
bodyText to be spoken
voiceVoice gender: male or female
langLanguage code (e.g., en-us, en-gb, de-de)
scheduleUnix timestamp for scheduled call
require_inputRequire keypad input (0-1)
machine_detectionDetect answering machine (0-1)

Available Languages

GET /clicksend/v3/voice/lang

Returns list of supported languages with codes and available genders.

Voice History

GET /clicksend/v3/voice/history

Note: Requires voice access enabled on account.

Get Voice Price

POST /clicksend/v3/voice/price

Cancel Voice Message

PUT /clicksend/v3/voice/{message_id}/cancel

Contact Lists

List All Lists

GET /clicksend/v3/lists

Response:

{
  "http_code": 200,
  "response_code": "SUCCESS",
  "response_msg": "Here are your contact lists.",
  "data": {
    "total": 2,
    "data": [
      {
        "list_id": 3555277,
        "list_name": "Opt-Out List",
        "_contacts_count": 0
      },
      {
        "list_id": 3555278,
        "list_name": "Example List",
        "_contacts_count": 10
      }
    ]
  }
}

Get List

GET /clicksend/v3/lists/{list_id}

Create List

POST /clicksend/v3/lists
Content-Type: application/json

{
  "list_name": "My New List"
}

Update List

PUT /clicksend/v3/lists/{list_id}
Content-Type: application/json

{
  "list_name": "Updated List Name"
}

Delete List

DELETE /clicksend/v3/lists/{list_id}

Remove Duplicates

PUT /clicksend/v3/lists/{list_id}/remove-duplicates

Contacts

List Contacts in a List

GET /clicksend/v3/lists/{list_id}/contacts

Query Parameters:

ParameterDescription
pagePage number
limitResults per page
updated_afterFilter contacts updated after timestamp

Get Contact

GET /clicksend/v3/lists/{list_id}/contacts/{contact_id}

Response:

{
  "http_code": 200,
  "response_code": "SUCCESS",
  "data": {
    "contact_id": 1581565666,
    "list_id": 3555278,
    "phone_number": "+18019234886",
    "first_name": "John",
    "last_name": "Doe",
    "email": "john@example.com",
    "custom_1": "",
    "custom_2": "",
    "custom_3": "",
    "custom_4": "",
    "organization_name": "",
    "address_city": "",
    "address_state": "",
    "address_country": "US"
  }
}

Create Contact

POST /clicksend/v3/lists/{list_id}/contacts
Content-Type: application/json

{
  "phone_number": "+15551234567",
  "first_name": "John",
  "last_name": "Doe",
  "email": "john@example.com"
}

Contact Fields:

FieldDescription
phone_numberPhone number (E.164 format)
first_nameFirst name
last_nameLast name
emailEmail address
fax_numberFax number
organization_nameCompany name
custom_1 - custom_4Custom fields
address_line_1, address_line_2Address
address_city, address_state, address_postal_code, address_countryAddress components

Update Contact

PUT /clicksend/v3/lists/{list_id}/contacts/{contact_id}
Content-Type: application/json

{
  "first_name": "Jane",
  "last_name": "Smith"
}

Delete Contact

DELETE /clicksend/v3/lists/{list_id}/contacts/{contact_id}

Copy Contact to Another List

PUT /clicksend/v3/lists/{from_list_id}/contacts/{contact_id}/copy/{to_list_id}

Transfer Contact to Another List

PUT /clicksend/v3/lists/{from_list_id}/contacts/{contact_id}/transfer/{to_list_id}

Email Addresses

List Verified Email Addresses

GET /clicksend/v3/email/addresses

Add Email Address

POST /clicksend/v3/email/addresses
Content-Type: application/json

{
  "email_address": "sender@example.com"
}

Delete Email Address

DELETE /clicksend/v3/email/addresses/{email_address_id}

Utility Endpoints

List Countries

GET /clicksend/v3/countries

Returns list of all supported countries with codes.


Pagination

ClickSend uses page-based pagination:

GET /clicksend/v3/lists?page=2&limit=50

Response includes:

{
  "data": {
    "total": 100,
    "per_page": 50,
    "current_page": 2,
    "last_page": 2,
    "next_page_url": null,
    "prev_page_url": "...?page=1",
    "from": 51,
    "to": 100,
    "data": [...]
  }
}

Parameters:

  • page - Page number (default: 1)
  • limit - Results per page (default: 15)

Code Examples

JavaScript

const response = await fetch(
  'https://gateway.maton.ai/clicksend/v3/sms/send',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      messages: [
        {
          to: '+15551234567',
          body: 'Hello from ClickSend!',
          source: 'api'
        }
      ]
    })
  }
);
const data = await response.json();
console.log(data);

Python

import os
import requests

response = requests.post(
    'https://gateway.maton.ai/clicksend/v3/sms/send',
    headers={
        'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
        'Content-Type': 'application/json'
    },
    json={
        'messages': [
            {
                'to': '+15551234567',
                'body': 'Hello from ClickSend!',
                'source': 'api'
            }
        ]
    }
)
data = response.json()
print(f"Status: {data['response_code']}")

Notes

  • Phone numbers must be in E.164 format (e.g., +15551234567)
  • All timestamps are Unix timestamps (seconds since epoch)
  • Use source field to identify your application in analytics
  • Templates support placeholders like {name}, {custom_1}, etc.
  • SMS messages over 160 characters are split into multiple segments
  • Voice access requires account-level permissions
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments

Error Handling

StatusMeaning
200Success
400Bad request
401Unauthorized - invalid credentials
403Forbidden - insufficient permissions
404Resource not found
429Rate limited
500Internal server error

Response codes:

  • SUCCESS - Operation completed successfully
  • FORBIDDEN - Access denied to resource
  • BAD_REQUEST - Invalid request parameters
  • INVALID_RECIPIENT - Invalid phone number

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with clicksend. For example:
  • Correct: https://gateway.maton.ai/clicksend/v3/account
  • Incorrect: https://gateway.maton.ai/v3/account

Resources

Source

git clone https://clawhub.ai/byungkyu/clicksendView on GitHub

Overview

ClickSend provides a managed-auth API to send SMS, MMS, and voice messages, with contact and list management and delivery tracking. It uses a gateway that proxies requests to rest.clicksend.com and injects authentication, simplifying integration for messaging workflows.

How This Skill Works

Call endpoints through https://gateway.maton.ai/clicksend/{native-api-path} with Authorization: Bearer $MATON_API_KEY. The Maton gateway forwards requests to rest.clicksend.com and can inject a Maton-Connection header when selecting a specific connection; you can manage connections at ctrl.maton.ai as shown in the docs.

When to Use It

  • Send SMS, MMS, or voice messages to customers at scale
  • Manage contact lists and recipient groups for campaigns
  • Track delivery status and receipts for reliable messaging
  • Integrate ClickSend into CRMs, helpdesks, or marketing stacks
  • Use a dedicated ClickSend connection via Maton-Connection for multi-connection setups

Quick Start

  1. Step 1: Export MATON_API_KEY="YOUR_API_KEY"
  2. Step 2: Fetch account info via the gateway using Authorization: Bearer $MATON_API_KEY
  3. Step 3: (Optional) Use Maton-Connection to select a specific ClickSend connection and manage endpoints

Best Practices

  • Store MATON_API_KEY securely (environment variable, not in code) and rotate regularly
  • Use the correct base URL and native-api-path for each endpoint
  • Specify Maton-Connection when multiple connections exist to route to the right account
  • Validate recipient phone numbers and message content before sending
  • Monitor delivery responses and implement retry/logging for failed messages

Example Use Cases

  • Send a transactional SMS alert to customers via /account
  • Send an MMS with media URL to a contact list
  • Place a voice message call to confirm an order
  • Sync and maintain a contact list for a marketing campaign
  • Retrieve account information to verify quota and status

Frequently Asked Questions

Add this skill to your agents
Sponsor this space

Reach thousands of developers