Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
ClickSend API integration with managed authentication. Send SMS, MMS, and voice messages, manage contacts and lists. Use this skill when users want to send text messages, make voice calls, manage contact lists, or track message delivery. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
ClickSend API integration with managed authentication. Send SMS, MMS, and voice messages, manage contacts and lists. Use this skill when users want to send text messages, make voice calls, manage contact lists, or track message delivery. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Access the ClickSend API with managed authentication. Send SMS, MMS, and voice messages, manage contacts and lists, and track message delivery.
# 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
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.
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"
Sign in or create an account at maton.ai Go to maton.ai/settings Copy your API key
Manage your ClickSend connections at https://ctrl.maton.ai.
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
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
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": {} } }
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
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.
All ClickSend API responses follow this structure: { "http_code": 200, "response_code": "SUCCESS", "response_msg": "Description of the result", "data": { ... } }
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": "$" } } }
POST /clicksend/v3/sms/send Content-Type: application/json { "messages": [ { "to": "+15551234567", "body": "Hello from ClickSend!", "source": "api" } ] } Parameters: FieldTypeDescriptiontostringRecipient phone number (E.164 format)bodystringSMS message contentsourcestringSource identifier (e.g., "api", "sdk")fromstringSender ID (optional)scheduleintUnix timestamp for scheduled send (optional)custom_stringstringCustom reference (optional)
POST /clicksend/v3/sms/price Content-Type: application/json { "messages": [ { "to": "+15551234567", "body": "Test message", "source": "api" } ] }
GET /clicksend/v3/sms/history Query Parameters: ParameterDescriptiondate_fromUnix timestamp for start datedate_toUnix timestamp for end datepagePage number (default: 1)limitResults per page (default: 15)
GET /clicksend/v3/sms/inbound
GET /clicksend/v3/sms/receipts
PUT /clicksend/v3/sms/{message_id}/cancel
PUT /clicksend/v3/sms/cancel-all
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" } ] } }
POST /clicksend/v3/sms/templates Content-Type: application/json { "template_name": "Welcome Message", "body": "Hello {name}, welcome to our service!" }
PUT /clicksend/v3/sms/templates/{template_id} Content-Type: application/json { "template_name": "Updated Template", "body": "Updated message content" }
DELETE /clicksend/v3/sms/templates/{template_id}
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" } ] }
GET /clicksend/v3/mms/history
POST /clicksend/v3/mms/price Content-Type: application/json { "messages": [...] }
GET /clicksend/v3/mms/receipts
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: FieldDescriptiontoRecipient phone numberbodyText to be spokenvoiceVoice gender: male or femalelangLanguage code (e.g., en-us, en-gb, de-de)scheduleUnix timestamp for scheduled callrequire_inputRequire keypad input (0-1)machine_detectionDetect answering machine (0-1)
GET /clicksend/v3/voice/lang Returns list of supported languages with codes and available genders.
GET /clicksend/v3/voice/history Note: Requires voice access enabled on account.
POST /clicksend/v3/voice/price
PUT /clicksend/v3/voice/{message_id}/cancel
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 /clicksend/v3/lists/{list_id}
POST /clicksend/v3/lists Content-Type: application/json { "list_name": "My New List" }
PUT /clicksend/v3/lists/{list_id} Content-Type: application/json { "list_name": "Updated List Name" }
DELETE /clicksend/v3/lists/{list_id}
PUT /clicksend/v3/lists/{list_id}/remove-duplicates
GET /clicksend/v3/lists/{list_id}/contacts Query Parameters: ParameterDescriptionpagePage numberlimitResults per pageupdated_afterFilter contacts updated after timestamp
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" } }
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: FieldDescriptionphone_numberPhone number (E.164 format)first_nameFirst namelast_nameLast nameemailEmail addressfax_numberFax numberorganization_nameCompany namecustom_1 - custom_4Custom fieldsaddress_line_1, address_line_2Addressaddress_city, address_state, address_postal_code, address_countryAddress components
PUT /clicksend/v3/lists/{list_id}/contacts/{contact_id} Content-Type: application/json { "first_name": "Jane", "last_name": "Smith" }
DELETE /clicksend/v3/lists/{list_id}/contacts/{contact_id}
PUT /clicksend/v3/lists/{from_list_id}/contacts/{contact_id}/copy/{to_list_id}
PUT /clicksend/v3/lists/{from_list_id}/contacts/{contact_id}/transfer/{to_list_id}
GET /clicksend/v3/email/addresses
POST /clicksend/v3/email/addresses Content-Type: application/json { "email_address": "sender@example.com" }
DELETE /clicksend/v3/email/addresses/{email_address_id}
GET /clicksend/v3/countries Returns list of all supported countries with codes.
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)
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);
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']}")
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
StatusMeaning200Success400Bad request401Unauthorized - invalid credentials403Forbidden - insufficient permissions404Resource not found429Rate limited500Internal server error Response codes: SUCCESS - Operation completed successfully FORBIDDEN - Access denied to resource BAD_REQUEST - Invalid request parameters INVALID_RECIPIENT - Invalid phone number
Check that the MATON_API_KEY environment variable is set: echo $MATON_API_KEY 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
Ensure your URL path starts with clicksend. For example: Correct: https://gateway.maton.ai/clicksend/v3/account Incorrect: https://gateway.maton.ai/v3/account
ClickSend Developer Portal ClickSend REST API v3 Documentation ClickSend PHP SDK ClickSend Help Center Maton Community Maton Support
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.