Refactor high-complexity React components in Dify frontend. Use when `pnpm analyze-component...
npx skills add gokapso/agent-skills --skill "whatsapp-messaging"
Install specific skill from multi-skill repository
# Description
Send and read WhatsApp messages via Kapso Meta proxy, manage templates (CRUD/send), and upload media. Use when sending messages, creating templates, or reading inbox history.
# SKILL.md
name: whatsapp-messaging
description: Send and read WhatsApp messages via Kapso Meta proxy, manage templates (CRUD/send), and upload media. Use when sending messages, creating templates, or reading inbox history.
WhatsApp Messaging
When to use
Use this skill when working with WhatsApp messaging via Kapso: sending messages, creating/managing templates, uploading media, or reading inbox history.
Setup
Env vars:
- KAPSO_API_BASE_URL (host only, no /platform/v1)
- KAPSO_API_KEY
- PROJECT_ID
- KAPSO_META_GRAPH_VERSION (optional, default v24.0)
Discover IDs first
Two Meta IDs are needed for different operations:
| ID | Used for | How to discover |
|---|---|---|
business_account_id (WABA) |
Template CRUD | node scripts/list-platform-phone-numbers.mjs |
phone_number_id |
Sending messages, media upload | node scripts/list-platform-phone-numbers.mjs |
SDK setup
Install:
npm install @kapso/whatsapp-cloud-api
Create client:
import { WhatsAppClient } from "@kapso/whatsapp-cloud-api";
const client = new WhatsAppClient({
baseUrl: "https://api.kapso.ai/meta/whatsapp",
kapsoApiKey: process.env.KAPSO_API_KEY!
});
How to
Send a text message
Via SDK:
await client.messages.sendText({
phoneNumberId: "<PHONE_NUMBER_ID>",
to: "+15551234567",
body: "Hello from Kapso"
});
Send a template message
- Discover IDs:
node scripts/list-platform-phone-numbers.mjs - Draft template payload from
assets/template-utility-order-status-update.json - Create:
node scripts/create-template.mjs --business-account-id <WABA_ID> --file <payload.json> - Check status:
node scripts/template-status.mjs --business-account-id <WABA_ID> --name <name> - Send:
node scripts/send-template.mjs --phone-number-id <ID> --file <send-payload.json>
Send an interactive message
Interactive messages require an active 24-hour session window. For outbound notifications outside the window, use templates.
- Discover
phone_number_id - Pick payload from
assets/send-interactive-*.json - Send:
node scripts/send-interactive.mjs --phone-number-id <ID> --file <payload.json>
Read inbox data
Use Meta proxy or SDK:
- Proxy: GET /{phone_number_id}/messages, GET /{phone_number_id}/conversations
- SDK: client.messages.query(), client.conversations.list()
Template rules
Creation:
- Use parameter_format: "NAMED" with {{param_name}} (preferred over positional)
- Include examples when using variables in HEADER/BODY
- Use language (not language_code)
- Don't interleave QUICK_REPLY with URL/PHONE_NUMBER buttons
- URL button variables must be at the end of the URL and use positional {{1}}
Send-time:
- For NAMED templates, include parameter_name in header/body params
- URL buttons need a button component with sub_type: "url" and index
- Media headers use either id or link (never both)
Scripts
| Script | Purpose | Required ID |
|---|---|---|
list-platform-phone-numbers.mjs |
Discover business_account_id + phone_number_id | โ |
list-connected-numbers.mjs |
List WABA phone numbers | business_account_id |
list-templates.mjs |
List templates (with filters) | business_account_id |
template-status.mjs |
Check single template status | business_account_id |
create-template.mjs |
Create a template | business_account_id |
update-template.mjs |
Update existing template | business_account_id |
send-template.mjs |
Send template message | phone_number_id |
send-interactive.mjs |
Send interactive message | phone_number_id |
upload-media.mjs |
Upload media for send-time headers | phone_number_id |
Assets
| File | Description |
|---|---|
template-utility-order-status-update.json |
UTILITY template with named params + URL button |
send-template-order-status-update.json |
Send-time payload for order_status_update |
template-utility-named.json |
UTILITY template showing button ordering rules |
template-marketing-media-header.json |
MARKETING template with IMAGE header |
template-authentication-otp.json |
AUTHENTICATION OTP template (COPY_CODE) |
send-interactive-buttons.json |
Interactive button message |
send-interactive-list.json |
Interactive list message |
send-interactive-cta-url.json |
Interactive CTA URL message |
send-interactive-location-request.json |
Location request message |
send-interactive-catalog-message.json |
Catalog message |
References
- references/templates-reference.md - Template creation rules, components cheat sheet, send-time components
- references/whatsapp-api-reference.md - Meta proxy payloads for messages and conversations
- references/whatsapp-cloud-api-js.md - SDK usage for sending and reading messages
Related skills
kapso-automation- Workflow automationwhatsapp-flows- WhatsApp Flowskapso-api- Platform API and customers
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.