WhatsApp Business
WhatsApp Business API integration with managed OAuth. Send messages, manage templates, and handle conversations. Use this skill when users want to interact with WhatsApp Business. For other third part
WhatsApp Business API integration with managed OAuth. Send messages, manage templates, and handle conversations. Use this skill when users want to interact with WhatsApp Business. For other third part
Real data. Real impact.
Emerging
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Access the WhatsApp Business API with managed OAuth authentication. Send messages, manage message templates, handle media, and interact with customers through WhatsApp.
# Send a text message python <<'EOF' import urllib.request, os, json data = json.dumps({'messaging_product': 'whatsapp', 'to': '1234567890', 'type': 'text', 'text': {'body': 'Hello from WhatsApp Business!'}}).encode() req = urllib.request.Request('https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', 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
https://gateway.maton.ai/whatsapp-business/{native-api-path}
Replace {native-api-path} with the actual WhatsApp Business API endpoint path. The gateway proxies requests to graph.facebook.com and automatically injects your OAuth token.
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"
Manage your WhatsApp Business OAuth connections at https://ctrl.maton.ai.
python <<'EOF' import urllib.request, os, json req = urllib.request.Request('https://ctrl.maton.ai/connections?app=whatsapp-business&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': 'whatsapp-business'}).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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80", "status": "ACTIVE", "creation_time": "2025-12-08T07:20:53.488460Z", "last_updated_time": "2026-01-31T20:03:32.593153Z", "url": "https://connect.maton.ai/?session_token=...", "app": "whatsapp-business", "metadata": {} } }
Open the returned url in a browser to complete OAuth authorization.
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 WhatsApp Business connections, specify which one to use with the Maton-Connection header:
python <<'EOF' import urllib.request, os, json data = json.dumps({'messaging_product': 'whatsapp', 'to': '1234567890', 'type': 'text', 'text': {'body': 'Hello!'}}).encode() req = urllib.request.Request('https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', data=data, method='POST') req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}') req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80') req.add_header('Content-Type', 'application/json') print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2)) EOF
If omitted, the gateway uses the default (oldest) active connection.
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "recipient_type": "individual", "to": "1234567890", "type": "text", "text": { "preview_url": true, "body": "Hello! Check out https://example.com" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "template", "template": { "name": "hello_world", "language": { "code": "en_US" }, "components": [ { "type": "body", "parameters": [ {"type": "text", "text": "John"} ] } ] } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "image", "image": { "link": "https://example.com/image.jpg", "caption": "Check out this image!" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "document", "document": { "link": "https://example.com/document.pdf", "caption": "Here's the document", "filename": "report.pdf" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "video", "video": { "link": "https://example.com/video.mp4", "caption": "Watch this video" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "audio", "audio": { "link": "https://example.com/audio.mp3" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "location", "location": { "latitude": 37.7749, "longitude": -122.4194, "name": "San Francisco", "address": "San Francisco, CA, USA" } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "contacts", "contacts": [ { "name": { "formatted_name": "John Doe", "first_name": "John", "last_name": "Doe" }, "phones": [ {"phone": "+1234567890", "type": "MOBILE"} ] } ] }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "interactive", "interactive": { "type": "button", "body": { "text": "Would you like to proceed?" }, "action": { "buttons": [ {"type": "reply", "reply": {"id": "yes", "title": "Yes"}}, {"type": "reply", "reply": {"id": "no", "title": "No"}} ] } } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "to": "1234567890", "type": "interactive", "interactive": { "type": "list", "header": {"type": "text", "text": "Select an option"}, "body": {"text": "Choose from the list below"}, "action": { "button": "View Options", "sections": [ { "title": "Products", "rows": [ {"id": "prod1", "title": "Product 1", "description": "First product"}, {"id": "prod2", "title": "Product 2", "description": "Second product"} ] } ] } } }
POST /whatsapp-business/v21.0/{phone_number_id}/messages Content-Type: application/json { "messaging_product": "whatsapp", "status": "read", "message_id": "wamid.xxxxx" }
POST /whatsapp-business/v21.0/{phone_number_id}/media Content-Type: multipart/form-data file=@/path/to/file.jpg type=image/jpeg messaging_product=whatsapp
GET /whatsapp-business/v21.0/{media_id}
DELETE /whatsapp-business/v21.0/{media_id}
GET /whatsapp-business/v21.0/{whatsapp_business_account_id}/message_templates
Query parameters:
POST /whatsapp-business/v21.0/{whatsapp_business_account_id}/message_templates Content-Type: application/json { "name": "order_confirmation", "language": "en_US", "category": "UTILITY", "components": [ { "type": "HEADER", "format": "TEXT", "text": "Order Confirmation" }, { "type": "BODY", "text": "Hi {{1}}, your order #{{2}} has been confirmed!" }, { "type": "FOOTER", "text": "Thank you for your purchase" } ] }
Template categories: AUTHENTICATION, MARKETING, UTILITY
DELETE /whatsapp-business/v21.0/{whatsapp_business_account_id}/message_templates?name=template_name
GET /whatsapp-business/v21.0/{phone_number_id}
GET /whatsapp-business/v21.0/{whatsapp_business_account_id}/phone_numbers
GET /whatsapp-business/v21.0/{phone_number_id}/whatsapp_business_profile?fields=about,address,description,email,profile_picture_url,websites,vertical
POST /whatsapp-business/v21.0/{phone_number_id}/whatsapp_business_profile Content-Type: application/json { "messaging_product": "whatsapp", "about": "Your trusted partner", "address": "123 Business St", "description": "We provide excellent services", "email": "contact@example.com", "websites": ["https://example.com"], "vertical": "RETAIL" }
const headers = { 'Authorization': `Bearer ${process.env.MATON_API_KEY}`, 'Content-Type': 'application/json' }; // Send text message await fetch( 'https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', { method: 'POST', headers, body: JSON.stringify({ messaging_product: 'whatsapp', to: '1234567890', type: 'text', text: { body: 'Hello from WhatsApp!' } }) } ); // Send template message await fetch( 'https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', { method: 'POST', headers, body: JSON.stringify({ messaging_product: 'whatsapp', to: '1234567890', type: 'template', template: { name: 'hello_world', language: { code: 'en_US' } } }) } );
import os import requests headers = { 'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}', 'Content-Type': 'application/json' } # Send text message response = requests.post( 'https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', headers=headers, json={ 'messaging_product': 'whatsapp', 'to': '1234567890', 'type': 'text', 'text': {'body': 'Hello from WhatsApp!'} } ) # Send template message response = requests.post( 'https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages', headers=headers, json={ 'messaging_product': 'whatsapp', 'to': '1234567890', 'type': 'template', 'template': { 'name': 'hello_world', 'language': {'code': 'en_US'} } } )
| Status | Meaning |
|---|---|
| 400 | Missing WhatsApp Business connection or invalid request |
| 401 | Invalid or missing Maton API key |
| 404 | Phone number or resource not found |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from WhatsApp Business API |
Common error codes from WhatsApp:
echo $MATON_API_KEY
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 whatsapp-business. For example:
Correct: https://gateway.maton.ai/whatsapp-business/v21.0/PHONE_NUMBER_ID/messages
Incorrect: https://gateway.maton.ai/v21.0/PHONE_NUMBER_ID/messages
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.