{"id":"806035d3-3948-4a48-ad7f-40ee15d8ee93","shortId":"ABnHA8","kind":"skill","title":"integrate-whatsapp","tagline":"Connect WhatsApp to your product with Kapso: onboard customers with setup links, detect connections, receive events via webhooks, and send messages/templates/media. Also manage WhatsApp Flows (create/update/publish, data endpoints, encryption). Use when integrating WhatsApp end-t","description":"# Integrate WhatsApp\n\n## Setup\n\nPreferred path:\n- Kapso CLI installed and authenticated (`kapso login`)\n- Use `kapso status` to confirm project access before onboarding or messaging\n\nFallback path:\nEnv vars:\n- `KAPSO_API_BASE_URL` (host only, no `/platform/v1`)\n- `KAPSO_API_KEY`\n- `META_GRAPH_VERSION` (optional, default `v24.0`)\n\nAuth header (direct API calls):\n```\nX-API-Key: <api_key>\n```\n\nInstall deps (once):\n```bash\nnpm i\n```\n\n## Connect WhatsApp (setup links)\n\nPreferred onboarding path (CLI):\n\n1. Start onboarding: `kapso setup`\n2. If setup is blocked, resolve context with:\n   - `kapso projects list`\n   - `kapso projects use <project-id>`\n   - `kapso customers list`\n   - `kapso customers new --name \"<customer-name>\" --external-id <external-id>`\n   - `kapso setup --customer <customer-id>`\n3. Complete the hosted onboarding URL\n4. Confirm connected numbers: `kapso whatsapp numbers list --output json`\n5. Resolve the exact number you want to operate: `kapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json`\n\nFallback onboarding flow (direct API):\n\n1. Create customer: `POST /platform/v1/customers`\n2. Generate setup link: `POST /platform/v1/customers/:id/setup_links`\n3. Customer completes embedded signup\n4. Use `phone_number_id` to send messages and configure webhooks\n\nDetect connection:\n- Project webhook `whatsapp.phone_number.created` (recommended)\n- Success redirect URL query params (use for frontend UX)\n\nRecommended Kapso setup-link defaults:\n```json\n{\n  \"setup_link\": {\n    \"allowed_connection_types\": [\"dedicated\"],\n    \"provision_phone_number\": true,\n    \"phone_number_country_isos\": [\"US\"]\n  }\n}\n```\n\nNotes:\n- `kapso setup` and `kapso whatsapp numbers new` use dedicated plus provisioning by default.\n- Keep `phone_number_country_isos`, `phone_number_area_code`, `language`, and redirect URLs as optional overrides.\n\n- Platform API base: `/platform/v1`\n- Meta proxy base: `/meta/whatsapp/v24.0` (messaging, templates, media)\n- Use `phone_number_id` as the primary WhatsApp identifier\n\n## Receive events (webhooks)\n\nUse webhooks to receive:\n- Project events (connection lifecycle, workflow events)\n- Phone-number events (messages, conversations, delivery status)\n\nScope rules:\n- **Project webhooks**: only project-level events (connection lifecycle, workflow events)\n- **Phone-number webhooks**: only WhatsApp message + conversation events for that `phone_number_id`\n- WhatsApp message/conversation events (`whatsapp.message.*`, `whatsapp.conversation.*`) are **phone-number only**\n\nCreate a webhook:\n- Project-level: `node scripts/create.js --scope project --url <https://...> --events <csv>`\n- Phone-number: `node scripts/create.js --phone-number-id <id> --url <https://...> --events <csv>`\n\nCommon flags for create/update:\n- `--url <https://...>` - webhook destination\n- `--events <csv|json-array>` - event types (Kapso webhooks)\n- `--kind <kapso|meta>` - Kapso (event-based) vs raw Meta forwarding\n- `--payload-version <v1|v2>` - payload format (`v2` recommended)\n- `--buffer-enabled <true|false>` - enable buffering for `whatsapp.message.received`\n- `--buffer-window-seconds <n>` - 1-60 seconds\n- `--max-buffer-size <n>` - 1-100\n- `--active <true|false>` - enable/disable\n\nTest delivery:\n```bash\nnode scripts/test.js --webhook-id <id>\n```\n\nAlways verify signatures. See:\n- `references/webhooks-overview.md`\n- `references/webhooks-reference.md`\n\n## Send and read messages\n\n### Discover IDs first\n\nTwo Meta IDs are needed for different operations:\n\n| ID | Used for | How to discover |\n|----|----------|-----------------|\n| `business_account_id` (WABA) | Template CRUD | `kapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json` or `node scripts/list-platform-phone-numbers.mjs` |\n| `phone_number_id` | Sending messages, media upload | `kapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json` or `node scripts/list-platform-phone-numbers.mjs` |\n\n### Operate with the CLI first\n\nCommon commands:\n```bash\nkapso whatsapp numbers list --output json\nkapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json\nkapso whatsapp messages send --phone-number-id <PHONE_NUMBER_ID> --to <wa-id> --text \"Hello from Kapso\"\nkapso whatsapp messages list --phone-number-id <PHONE_NUMBER_ID> --limit 50 --output json\nkapso whatsapp messages get <MESSAGE_ID> --phone-number-id <PHONE_NUMBER_ID> --output json\nkapso whatsapp conversations list --phone-number-id <PHONE_NUMBER_ID> --output json\nkapso whatsapp templates list --phone-number-id <PHONE_NUMBER_ID> --output json\nkapso whatsapp templates get <TEMPLATE_ID> --phone-number-id <PHONE_NUMBER_ID> --output json\n```\n\n### SDK setup\n\nInstall:\n```bash\nnpm install @kapso/whatsapp-cloud-api\n```\n\nCreate client:\n```ts\nimport { WhatsAppClient } from \"@kapso/whatsapp-cloud-api\";\n\nconst client = new WhatsAppClient({\n  baseUrl: \"https://api.kapso.ai/meta/whatsapp\",\n  kapsoApiKey: process.env.KAPSO_API_KEY!\n});\n```\n\n### Send a text message\n\nVia SDK:\n```ts\nawait client.messages.sendText({\n  phoneNumberId: \"<PHONE_NUMBER_ID>\",\n  to: \"+15551234567\",\n  body: \"Hello from Kapso\"\n});\n```\n\n### Send a template message\n\n1. Discover IDs: `node scripts/list-platform-phone-numbers.mjs`\n2. Draft template payload from `assets/template-utility-order-status-update.json`\n3. Create: `node scripts/create-template.mjs --business-account-id <WABA_ID> --file <payload.json>`\n4. Check status: `node scripts/template-status.mjs --business-account-id <WABA_ID> --name <name>`\n5. Send: `node scripts/send-template.mjs --phone-number-id <ID> --file <send-payload.json>`\n\n### Send an interactive message\n\nInteractive messages require an active 24-hour session window. For outbound notifications outside the window, use templates.\n\n1. Discover `phone_number_id`\n2. Pick payload from `assets/send-interactive-*.json`\n3. Send: `node scripts/send-interactive.mjs --phone-number-id <ID> --file <payload.json>`\n\n### Read inbox data\n\nPreferred path:\n- CLI: `kapso whatsapp messages ...`, `kapso whatsapp conversations ...`, `kapso whatsapp templates ...`\n\nFallback path:\n- Proxy: `GET /{phone_number_id}/messages`, `GET /{phone_number_id}/conversations`\n- SDK: `client.messages.query()`, `client.messages.get()`, `client.conversations.list()`, `client.conversations.get()`, `client.templates.get()`\n\n### Embed the inbox\n\nUse Platform API inbox embeds when the user wants to place Kapso's inbox inside their own app.\n\nCreate:\n- `POST /platform/v1/inbox_embeds`\n- Envelope: `inbox_embed`\n- Public scopes: `project`, `customer`, `phone_number`\n- `scope_id` is blank for `project`, a customer UUID for `customer`, and WhatsApp `phone_number_id` for `phone_number`\n- Create returns `token` and `embed_url` once. Store `embed_url`; list/get/update omit secrets.\n\nExample:\n```json\n{\n  \"inbox_embed\": {\n    \"name\": \"Support inbox\",\n    \"scope_type\": \"phone_number\",\n    \"scope_id\": \"1234567890\",\n    \"allowed_origins\": [\"https://app.example.com\"],\n    \"default_mode\": \"system\"\n  }\n}\n```\n\nManage:\n- `GET /platform/v1/inbox_embeds`\n- `GET /platform/v1/inbox_embeds/:id`\n- `PATCH /platform/v1/inbox_embeds/:id`\n- `DELETE /platform/v1/inbox_embeds/:id` (revokes)\n\n### Template rules\n\nCreation:\n- Use `parameter_format: \"NAMED\"` with `{{param_name}}` (preferred over positional)\n- Include examples when using variables in HEADER/BODY\n- Use `language` (not `language_code`)\n- Don't interleave QUICK_REPLY with URL/PHONE_NUMBER buttons\n- URL button variables must be at the end of the URL and use positional `{{1}}`\n\nSend-time:\n- For NAMED templates, include `parameter_name` in header/body params\n- URL buttons need a `button` component with `sub_type: \"url\"` and `index`\n- Media headers use either `id` or `link` (never both)\n\n## WhatsApp Flows\n\nUse Flows to build native WhatsApp forms. Read `references/whatsapp-flows-spec.md` before editing Flow JSON.\n\n### Create and publish a flow\n\n1. Create flow: `node scripts/create-flow.js --phone-number-id <id> --name <name>`\n2. Update JSON: `node scripts/update-flow-json.js --flow-id <id> --json-file <path>`\n3. Publish: `node scripts/publish-flow.js --flow-id <id>`\n4. Test: `node scripts/send-test-flow.js --phone-number-id <id> --flow-id <id> --to <phone>`\n\n### Attach a data endpoint (dynamic flows)\n\n1. Set up encryption: `node scripts/setup-encryption.js --flow-id <id>`\n2. Create endpoint: `node scripts/set-data-endpoint.js --flow-id <id> --code-file <path>`\n3. Deploy: `node scripts/deploy-data-endpoint.js --flow-id <id>`\n4. Register: `node scripts/register-data-endpoint.js --flow-id <id>`\n\n### Flow JSON rules\n\nStatic flows (no data endpoint):\n- Use `version: \"7.3\"`\n- `routing_model` and `data_api_version` are optional\n- See `assets/sample-flow.json`\n\nDynamic flows (with data endpoint):\n- Use `version: \"7.3\"` with `data_api_version: \"3.0\"`\n- `routing_model` is required (defines valid screen transitions)\n- See `assets/dynamic-flow.json`\n\n### Data endpoint rules\n\nHandler signature:\n```js\nasync function handler(request, env) {\n  const body = await request.json();\n  // body.data_exchange.action: INIT | data_exchange | BACK\n  // body.data_exchange.screen: current screen id\n  // body.data_exchange.data: user inputs\n  return Response.json({\n    version: \"3.0\",\n    screen: \"NEXT_SCREEN_ID\",\n    data: { }\n  });\n}\n```\n\n- Do not use `export` or `module.exports`\n- Completion uses `screen: \"SUCCESS\"` with `extension_message_response.params`\n- Do not include `endpoint_uri` or `data_channel_uri` (Kapso injects these)\n\n### Troubleshooting\n\n- Preview shows `\"flow_token is missing\"`: flow is dynamic without a data endpoint. Attach one and refresh.\n- Encryption setup errors: enable encryption in Settings for the phone number/WABA.\n- OAuthException 139000 (Integrity): WABA must be verified in Meta security center.\n\n## Scripts\n\n### Webhooks\n\n| Script | Purpose |\n|--------|---------|\n| `list.js` | List webhooks |\n| `get.js` | Get webhook details |\n| `create.js` | Create a webhook |\n| `update.js` | Update a webhook |\n| `delete.js` | Delete a webhook |\n| `test.js` | Send a test event |\n\n### Messaging and templates\n\n| Script | Purpose | Required ID |\n|--------|---------|-------------|\n| `list-platform-phone-numbers.mjs` | Discover business_account_id + phone_number_id | — |\n| `list-connected-numbers.mjs` | List WABA phone numbers | business_account_id |\n| `list-templates.mjs` | List templates (with filters) | business_account_id |\n| `template-status.mjs` | Check single template status | business_account_id |\n| `create-template.mjs` | Create a template | business_account_id |\n| `update-template.mjs` | Update existing template | business_account_id |\n| `send-template.mjs` | Send template message | phone_number_id |\n| `send-interactive.mjs` | Send interactive message | phone_number_id |\n| `upload-media.mjs` | Upload media for send-time headers | phone_number_id |\n\n### Flows\n\n| Script | Purpose |\n|--------|---------|\n| `list-flows.js` | List all flows |\n| `create-flow.js` | Create a new flow |\n| `get-flow.js` | Get flow details |\n| `read-flow-json.js` | Read flow JSON |\n| `update-flow-json.js` | Update flow JSON (creates new version) |\n| `publish-flow.js` | Publish a flow |\n| `get-data-endpoint.js` | Get data endpoint config |\n| `set-data-endpoint.js` | Create/update data endpoint code |\n| `deploy-data-endpoint.js` | Deploy data endpoint |\n| `register-data-endpoint.js` | Register data endpoint with Meta |\n| `get-encryption-status.js` | Check encryption status |\n| `setup-encryption.js` | Set up flow encryption |\n| `send-test-flow.js` | Send a test flow message |\n| `delete-flow.js` | Delete a flow |\n| `list-flow-responses.js` | List stored flow responses |\n| `list-function-logs.js` | List function logs |\n| `list-function-invocations.js` | List function invocations |\n\n### OpenAPI\n\n| Script | Purpose |\n|--------|---------|\n| `openapi-explore.mjs` | Explore OpenAPI (search/op/schema/where) |\n\nExamples:\n```bash\nnode scripts/openapi-explore.mjs --spec whatsapp search \"template\"\nnode scripts/openapi-explore.mjs --spec whatsapp op sendMessage\nnode scripts/openapi-explore.mjs --spec whatsapp schema TemplateMessage\nnode scripts/openapi-explore.mjs --spec platform ops --tag \"WhatsApp Flows\"\nnode scripts/openapi-explore.mjs --spec platform op setupWhatsappFlowEncryption\nnode scripts/openapi-explore.mjs --spec platform search \"setup link\"\n```\n\n## Assets\n\n| File | Description |\n|------|-------------|\n| `template-utility-order-status-update.json` | UTILITY template with named params + URL button |\n| `send-template-order-status-update.json` | Send-time payload for order_status_update |\n| `template-utility-named.json` | UTILITY template showing button ordering rules |\n| `template-marketing-media-header.json` | MARKETING template with IMAGE header |\n| `template-authentication-otp.json` | AUTHENTICATION OTP template (COPY_CODE) |\n| `send-interactive-buttons.json` | Interactive button message |\n| `send-interactive-list.json` | Interactive list message |\n| `send-interactive-cta-url.json` | Interactive CTA URL message |\n| `send-interactive-location-request.json` | Location request message |\n| `send-interactive-catalog-message.json` | Catalog message |\n| `sample-flow.json` | Static flow example (no endpoint) |\n| `dynamic-flow.json` | Dynamic flow example (with endpoint) |\n| `webhooks-example.json` | Webhook create/update payload example |\n\n## References\n\n- [references/getting-started.md](references/getting-started.md) - Platform onboarding\n- [references/platform-api-reference.md](references/platform-api-reference.md) - Full endpoint reference\n- [references/setup-links.md](references/setup-links.md) - Setup link configuration\n- [references/detecting-whatsapp-connection.md](references/detecting-whatsapp-connection.md) - Connection detection methods\n- [references/webhooks-overview.md](references/webhooks-overview.md) - Webhook types, signature verification, retries\n- [references/webhooks-event-types.md](references/webhooks-event-types.md) - Available events\n- [references/webhooks-reference.md](references/webhooks-reference.md) - Webhook API and payload notes\n- [references/templates-reference.md](references/templates-reference.md) - Template creation rules, components cheat sheet, send-time components\n- [references/whatsapp-api-reference.md](references/whatsapp-api-reference.md) - Meta proxy payloads for messages and conversations\n- [references/whatsapp-cloud-api-js.md](references/whatsapp-cloud-api-js.md) - SDK usage for sending and reading messages\n- [references/whatsapp-flows-spec.md](references/whatsapp-flows-spec.md) - Flow JSON spec\n\n## Related skills\n\n- `automate-whatsapp` - Workflows, agents, and automations\n- `observe-whatsapp` - Debugging, logs, health checks\n\n<!-- FILEMAP:BEGIN -->\n```text\n[integrate-whatsapp file map]|root: .\n|.:{package.json,SKILL.md}\n|assets:{dynamic-flow.json,sample-flow.json,send-interactive-buttons.json,send-interactive-catalog-message.json,send-interactive-cta-url.json,send-interactive-list.json,send-interactive-location-request.json,send-template-order-status-update.json,template-authentication-otp.json,template-marketing-media-header.json,template-utility-named.json,template-utility-order-status-update.json,webhooks-example.json}\n|references:{detecting-whatsapp-connection.md,getting-started.md,platform-api-reference.md,setup-links.md,templates-reference.md,webhooks-event-types.md,webhooks-overview.md,webhooks-reference.md,whatsapp-api-reference.md,whatsapp-cloud-api-js.md,whatsapp-flows-spec.md}\n|scripts:{create-flow.js,create-function.js,create-template.mjs,create.js,delete-flow.js,delete.js,deploy-data-endpoint.js,deploy-function.js,get-data-endpoint.js,get-encryption-status.js,get-flow.js,get-function.js,get.js,list-connected-numbers.mjs,list-flow-responses.js,list-flows.js,list-function-invocations.js,list-function-logs.js,list-platform-phone-numbers.mjs,list-templates.mjs,list.js,openapi-explore.mjs,publish-flow.js,read-flow-json.js,register-data-endpoint.js,send-interactive.mjs,send-template.mjs,send-test-flow.js,set-data-endpoint.js,setup-encryption.js,submit-template.mjs,template-status.mjs,test.js,update-flow-json.js,update-function.js,update-template.mjs,update.js,upload-media.mjs,upload-template-header-handle.mjs}\n|scripts/lib:{args.mjs,cli.js,env.js,env.mjs,http.js,output.js,output.mjs,request.mjs,run.js,whatsapp-flow.js}\n|scripts/lib/webhooks:{args.js,kapso-api.js,webhook.js}\n```\n<!-- FILEMAP:END -->","tags":["integrate","whatsapp","agent","skills","gokapso","agent-skills","kapso"],"capabilities":["skill","source-gokapso","skill-integrate-whatsapp","topic-agent-skills","topic-kapso","topic-skills","topic-whatsapp"],"categories":["agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/gokapso/agent-skills/integrate-whatsapp","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add gokapso/agent-skills","source_repo":"https://github.com/gokapso/agent-skills","install_from":"skills.sh"}},"qualityScore":"0.507","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 114 github stars · SKILL.md body (16,410 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:56:18.331Z","embedding":null,"createdAt":"2026-04-18T20:32:17.190Z","updatedAt":"2026-05-18T18:56:18.331Z","lastSeenAt":"2026-05-18T18:56:18.331Z","tsv":"'+15551234567':633 '-100':431 '-60':424 '/conversations':749 '/messages':744 '/meta/whatsapp':617 '/meta/whatsapp/v24.0':280 '/platform/v1':74,276 '/platform/v1/customers':182,188 '/platform/v1/inbox_embeds':779,843,845,848,851 '1':107,178,423,430,642,702,901,955,1001 '1234567890':834 '139000':1169 '2':112,183,647,707,965,1010 '24':690 '3':139,190,653,713,976,1021 '3.0':1068,1109 '4':145,195,662,983,1028 '5':155,672 '50':553 '7.3':1045,1063 'access':58 'account':472,659,669,1217,1228,1236,1244,1251,1258 'activ':432,689 'agent':1571 'allow':230,835 'also':25 'alway':444 'api':68,76,87,91,177,274,620,761,1050,1066,1526 'api.kapso.ai':616 'api.kapso.ai/meta/whatsapp':615 'app':776 'app.example.com':837 'area':264 'args.js':1668 'args.mjs':1657 'array':385 'asset':1416,1590 'assets/dynamic-flow.json':1078 'assets/sample-flow.json':1055 'assets/send-interactive-':711 'assets/template-utility-order-status-update.json':652 'async':1085 'attach':995,1153 'auth':84 'authent':49,1450 'autom':1568,1573 'automate-whatsapp':1567 'avail':1521 'await':629,1092 'back':1098 'base':69,275,279,396 'baseurl':614 'bash':96,438,515,599,1376 'blank':792 'block':116 'bodi':634,1091 'body.data_exchange.action':1094 'body.data_exchange.data':1103 'body.data_exchange.screen':1099 'buffer':411,416,420,428 'buffer-en':410 'buffer-window-second':419 'build':940 'busi':471,658,668,1216,1227,1235,1243,1250,1257 'business-account-id':657,667 'button':886,888,915,918,1426,1440,1457 'call':88 'catalog':1473 'center':1178 'channel':1134 'cheat':1536 'check':663,1239,1337,1580 'cli':46,106,511,727 'cli.js':1658 'client':604,611 'client.conversations.get':754 'client.conversations.list':753 'client.messages.get':752 'client.messages.query':751 'client.messages.sendtext':630 'client.templates.get':755 'code':265,878,1019,1325,1454 'code-fil':1018 'command':514 'common':374,513 'complet':140,192,1121 'compon':919,1535,1541 'config':1320 'configur':204,1506 'confirm':56,146 'connect':4,17,99,147,207,231,302,323,1509 'const':610,1090 'context':118 'convers':311,334,568,733,1550 'copi':1453 'countri':240,260 'creat':179,351,603,654,777,808,950,956,1011,1191,1247,1293,1309 'create-flow.js':1292,1617 'create-function.js':1618 'create-template.mjs':1246,1619 'create.js':1190,1620 'create/update':377,1322,1489 'create/update/publish':29 'creation':856,1533 'crud':476 'csv':382 'cta':1465 'current':1100 'custom':12,127,130,138,180,191,786,796,799 'data':30,724,997,1041,1049,1059,1065,1079,1096,1114,1133,1151,1318,1323,1328,1332 'debug':1577 'dedic':233,252 'default':82,226,256,838 'defin':1073 'delet':850,1199,1352 'delete-flow.js':1351,1621 'delete.js':1198,1622 'deliveri':312,437 'dep':94 'deploy':1022,1327 'deploy-data-endpoint.js':1326,1623 'deploy-function.js':1624 'descript':1418 'destin':380 'detail':1189,1300 'detect':16,206,1510 'detecting-whatsapp-connection.md':1605 'differ':463 'direct':86,176 'discov':454,470,643,703,1215 'draft':648 'dynam':999,1056,1148,1482 'dynamic-flow.json':1481,1591 'edit':947 'either':929 'emb':756,763,782,812,816,824 'embed':193 'enabl':412,415,1160 'enable/disable':435 'encrypt':32,1004,1157,1161,1338,1344 'end':38,894 'end-t':37 'endpoint':31,998,1012,1042,1060,1080,1130,1152,1319,1324,1329,1333,1480,1486,1500 'env':65,1089 'env.js':1659 'env.mjs':1660 'envelop':780 'error':1159 'event':19,294,301,305,309,322,326,335,343,362,373,381,386,395,1206,1522 'event-bas':394 'exact':158 'exampl':821,868,1375,1478,1484,1491 'exchang':1097 'exist':1255 'explor':1372 'export':1118 'extension_message_response.params':1126 'extern':134 'external-id':133 'fallback':63,173,737 'fals':414,434 'file':661,680,721,975,1020,1417,1585 'filter':1234 'first':456,512 'flag':375 'flow':28,175,936,938,948,954,957,971,981,992,1000,1008,1016,1026,1033,1035,1039,1057,1142,1146,1285,1291,1296,1299,1303,1307,1315,1343,1349,1354,1358,1402,1477,1483,1562 'flow-id':970,980,991,1007,1015,1025,1032 'form':943 'format':407,859 'forward':400 'frontend':219 'full':1499 'function':1086,1362,1366 'generat':184 'get':559,589,740,745,842,844,1187,1298,1317 'get-data-endpoint.js':1316,1625 'get-encryption-status.js':1336,1626 'get-flow.js':1297,1627 'get-function.js':1628 'get.js':1186,1629 'getting-started.md':1606 'graph':79 'handler':1082,1087 'header':85,927,1281,1448 'header/body':873,912 'health':1579 'hello':541,635 'host':71,142 'hour':691 'http.js':1661 'id':135,199,287,340,371,443,455,459,465,473,491,538,551,563,573,583,593,644,660,670,679,706,720,743,748,790,804,833,846,849,852,930,963,972,982,990,993,1009,1017,1027,1034,1102,1113,1213,1218,1221,1229,1237,1245,1252,1259,1266,1273,1284 'id/setup_links':189 'identifi':292 'imag':1447 'import':606 'inbox':723,758,762,772,781,823,827 'includ':867,908,1129 'index':925 'init':1095 'inject':1137 'input':1105 'insid':773 'instal':47,93,598,601 'integr':2,35,40,1170,1583 'integrate-whatsapp':1,1582 'interact':683,685,1269,1456,1460,1464 'interleav':881 'invoc':1367 'iso':241,261 'js':1084 'json':154,172,227,384,485,504,521,530,555,565,575,585,595,712,822,949,967,974,1036,1304,1308,1563 'json-array':383 'json-fil':973 'kapso':10,45,50,53,67,75,110,120,123,126,129,136,149,164,222,244,247,388,391,393,477,496,516,522,531,543,544,556,566,576,586,637,728,731,734,770,1136 'kapso-api.js':1669 'kapso/whatsapp-cloud-api':602,609 'kapsoapikey':618 'keep':257 'key':77,92,621 'kind':390 'languag':266,875,877 'level':321,356 'lifecycl':303,324 'limit':552 'link':15,102,186,225,229,932,1415,1505 'list':122,128,152,519,547,569,579,1184,1223,1231,1289,1356,1361,1365,1461 'list-connected-numbers.mjs':1222,1630 'list-flow-responses.js':1355,1631 'list-flows.js':1288,1632 'list-function-invocations.js':1364,1633 'list-function-logs.js':1360,1634 'list-platform-phone-numbers.mjs':1214,1635 'list-templates.mjs':1230,1636 'list.js':1183,1637 'list/get/update':818 'locat':1469 'log':1363,1578 'login':51 'manag':26,841 'map':1586 'market':1444 'max':427 'max-buffer-s':426 'media':283,494,926,1276 'messag':62,202,281,310,333,453,493,533,546,558,625,641,684,686,730,1207,1263,1270,1350,1458,1462,1467,1471,1474,1548,1559 'message/conversation':342 'messages/templates/media':24 'meta':78,277,392,399,458,1176,1335,1544 'method':1511 'miss':1145 'mode':839 'model':1047,1070 'module.exports':1120 'must':890,1172 'name':132,671,825,860,863,906,910,964,1423 'nativ':941 'need':461,916 'never':933 'new':131,250,612,1295,1310 'next':1111 'node':357,366,439,487,506,645,655,665,674,715,958,968,978,985,1005,1013,1023,1030,1377,1383,1389,1395,1403,1409 'note':243,1529 'notif':696 'npm':97,600 'number':148,151,159,166,170,198,236,239,249,259,263,286,308,329,339,349,365,370,479,483,490,498,502,518,524,528,537,550,562,572,582,592,678,705,719,742,747,788,803,807,831,962,989,1220,1226,1265,1272,1283 'number/waba':1167 'oauthexcept':1168 'observ':1575 'observe-whatsapp':1574 'omit':819 'onboard':11,60,104,109,143,174,1496 'one':1154 'op':1387,1399,1407 'openapi':1368,1373 'openapi-explore.mjs':1371,1638 'oper':163,464,508 'option':81,271,1053 'order':1433,1441 'origin':836 'otp':1451 'outbound':695 'output':153,171,484,503,520,529,554,564,574,584,594 'output.js':1662 'output.mjs':1663 'outsid':697 'overrid':272 'package.json':1588 'param':216,862,913,1424 'paramet':858,909 'patch':847 'path':44,64,105,726,738 'payload':402,406,650,709,1431,1490,1528,1546 'payload-vers':401 'phone':169,197,235,238,258,262,285,307,328,338,348,364,369,482,489,501,527,536,549,561,571,581,591,677,704,718,741,746,787,802,806,830,961,988,1166,1219,1225,1264,1271,1282 'phone-numb':168,306,327,347,363,481,500,526 'phone-number-id':368,535,548,560,570,580,590,676,717,960,987 'phonenumberid':631 'pick':708 'place':769 'platform':273,760,1398,1406,1412,1495 'platform-api-reference.md':1607 'plus':253 'posit':866,900 'post':181,187,778 'prefer':43,103,725,864 'preview':1140 'primari':290 'process.env.kapso':619 'product':8 'project':57,121,124,208,300,316,320,355,360,785,794 'project-level':319,354 'provis':234,254 'proxi':278,739,1545 'public':783 'publish':952,977,1313 'publish-flow.js':1312,1639 'purpos':1182,1211,1287,1370 'queri':215 'quick':882 'raw':398 'read':452,722,944,1302,1558 'read-flow-json.js':1301,1640 'receiv':18,293,299 'recommend':211,221,409 'redirect':213,268 'refer':1492,1501,1604 'references/detecting-whatsapp-connection.md':1507,1508 'references/getting-started.md':1493,1494 'references/platform-api-reference.md':1497,1498 'references/setup-links.md':1502,1503 'references/templates-reference.md':1530,1531 'references/webhooks-event-types.md':1519,1520 'references/webhooks-overview.md':448,1512,1513 'references/webhooks-reference.md':449,1523,1524 'references/whatsapp-api-reference.md':1542,1543 'references/whatsapp-cloud-api-js.md':1551,1552 'references/whatsapp-flows-spec.md':945,1560,1561 'refresh':1156 'regist':1029,1331 'register-data-endpoint.js':1330,1641 'relat':1565 'repli':883 'request':1088,1470 'request.json':1093 'request.mjs':1664 'requir':687,1072,1212 'resolv':117,156,167,480,499,525 'respons':1359 'response.json':1107 'retri':1518 'return':809,1106 'revok':853 'root':1587 'rout':1046,1069 'rule':315,855,1037,1081,1442,1534 'run.js':1665 'sample-flow.json':1475,1592 'schema':1393 'scope':314,359,784,789,828,832 'screen':1075,1101,1110,1112,1123 'script':1179,1181,1210,1286,1369,1616 'scripts/create-flow.js':959 'scripts/create-template.mjs':656 'scripts/create.js':358,367 'scripts/deploy-data-endpoint.js':1024 'scripts/lib':1656 'scripts/lib/webhooks':1667 'scripts/list-platform-phone-numbers.mjs':488,507,646 'scripts/openapi-explore.mjs':1378,1384,1390,1396,1404,1410 'scripts/publish-flow.js':979 'scripts/register-data-endpoint.js':1031 'scripts/send-interactive.mjs':716 'scripts/send-template.mjs':675 'scripts/send-test-flow.js':986 'scripts/set-data-endpoint.js':1014 'scripts/setup-encryption.js':1006 'scripts/template-status.mjs':666 'scripts/test.js':440 'scripts/update-flow-json.js':969 'sdk':596,627,750,1553 'search':1381,1413 'search/op/schema/where':1374 'second':422,425 'secret':820 'secur':1177 'see':447,1054,1077 'send':23,201,450,492,534,622,638,673,681,714,903,1203,1261,1268,1279,1346,1429,1539,1556 'send-interactive-buttons.json':1455,1593 'send-interactive-catalog-message.json':1472,1594 'send-interactive-cta-url.json':1463,1595 'send-interactive-list.json':1459,1596 'send-interactive-location-request.json':1468,1597 'send-interactive.mjs':1267,1642 'send-template-order-status-update.json':1427,1598 'send-template.mjs':1260,1643 'send-test-flow.js':1345,1644 'send-tim':902,1278,1428,1538 'sendmessag':1388 'session':692 'set':1002,1163,1341 'set-data-endpoint.js':1321,1645 'setup':14,42,101,111,114,137,185,224,228,245,597,1158,1414,1504 'setup-encryption.js':1340,1646 'setup-link':223 'setup-links.md':1608 'setupwhatsappflowencrypt':1408 'sheet':1537 'show':1141,1439 'signatur':446,1083,1516 'signup':194 'singl':1240 'size':429 'skill':1566 'skill-integrate-whatsapp' 'skill.md':1589 'source-gokapso' 'spec':1379,1385,1391,1397,1405,1411,1564 'start':108 'static':1038,1476 'status':54,313,664,1242,1339,1434 'store':815,1357 'sub':921 'submit-template.mjs':1647 'success':212,1124 'support':826 'system':840 'tag':1400 'templat':282,475,578,588,640,649,701,736,854,907,1209,1232,1241,1249,1256,1262,1382,1421,1438,1445,1452,1532 'template-authentication-otp.json':1449,1599 'template-marketing-media-header.json':1443,1600 'template-status.mjs':1238,1648 'template-utility-named.json':1436,1601 'template-utility-order-status-update.json':1419,1602 'templatemessag':1394 'templates-reference.md':1609 'test':436,984,1205,1348 'test.js':1202,1649 'text':540,624,1581 'time':904,1280,1430,1540 'token':810,1143 'topic-agent-skills' 'topic-kapso' 'topic-skills' 'topic-whatsapp' 'transit':1076 'troubleshoot':1139 'true':237,413,433 'ts':605,628 'two':457 'type':232,387,829,922,1515 'updat':966,1195,1254,1306,1435 'update-flow-json.js':1305,1650 'update-function.js':1651 'update-template.mjs':1253,1652 'update.js':1194,1653 'upload':495,1275 'upload-media.mjs':1274,1654 'upload-template-header-handle.mjs':1655 'uri':1131,1135 'url':70,144,214,269,361,372,378,813,817,887,897,914,923,1425,1466 'url/phone_number':885 'us':242 'usag':1554 'use':33,52,125,196,217,251,284,296,466,700,759,857,870,874,899,928,937,1043,1061,1117,1122 'user':766,1104 'util':1420,1437 'uuid':797 'ux':220 'v1':404 'v2':405,408 'v24.0':83 'valid':1074 'var':66 'variabl':871,889 'verif':1517 'verifi':445,1174 'version':80,403,1044,1051,1062,1067,1108,1311 'via':20,626 'vs':397 'waba':474,1171,1224 'want':161,767 'webhook':21,205,209,295,297,317,330,353,379,389,442,1180,1185,1188,1193,1197,1201,1488,1514,1525 'webhook-id':441 'webhook.js':1670 'webhooks-event-types.md':1610 'webhooks-example.json':1487,1603 'webhooks-overview.md':1611 'webhooks-reference.md':1612 'whatsapp':3,5,27,36,41,100,150,165,248,291,332,341,478,497,517,523,532,545,557,567,577,587,729,732,735,801,935,942,1380,1386,1392,1401,1569,1576,1584 'whatsapp-api-reference.md':1613 'whatsapp-cloud-api-js.md':1614 'whatsapp-flow.js':1666 'whatsapp-flows-spec.md':1615 'whatsapp.conversation':345 'whatsapp.message':344 'whatsapp.message.received':418 'whatsapp.phone_number.created':210 'whatsappcli':607,613 'window':421,693,699 'without':1149 'workflow':304,325,1570 'x':90 'x-api-key':89","prices":[{"id":"10fcc78d-f7b3-443c-8bb9-053fc222588d","listingId":"806035d3-3948-4a48-ad7f-40ee15d8ee93","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"gokapso","category":"agent-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T20:32:17.190Z"}],"sources":[{"listingId":"806035d3-3948-4a48-ad7f-40ee15d8ee93","source":"github","sourceId":"gokapso/agent-skills/integrate-whatsapp","sourceUrl":"https://github.com/gokapso/agent-skills/tree/master/skills/integrate-whatsapp","isPrimary":false,"firstSeenAt":"2026-04-18T22:11:59.295Z","lastSeenAt":"2026-05-18T18:56:18.331Z"},{"listingId":"806035d3-3948-4a48-ad7f-40ee15d8ee93","source":"skills_sh","sourceId":"gokapso/agent-skills/integrate-whatsapp","sourceUrl":"https://skills.sh/gokapso/agent-skills/integrate-whatsapp","isPrimary":true,"firstSeenAt":"2026-04-18T20:32:17.190Z","lastSeenAt":"2026-05-07T22:40:30.961Z"}],"details":{"listingId":"806035d3-3948-4a48-ad7f-40ee15d8ee93","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"gokapso","slug":"integrate-whatsapp","github":{"repo":"gokapso/agent-skills","stars":114,"topics":["agent-skills","kapso","skills","whatsapp"],"license":null,"html_url":"https://github.com/gokapso/agent-skills","pushed_at":"2026-05-15T20:01:20Z","description":"Kapso agent skills for WhatsApp.","skill_md_sha":"d38dd09e6bf65df0e918cef7bd5eb8a2b8611b3d","skill_md_path":"skills/integrate-whatsapp/SKILL.md","default_branch":"master","skill_tree_url":"https://github.com/gokapso/agent-skills/tree/master/skills/integrate-whatsapp"},"layout":"multi","source":"github","category":"agent-skills","frontmatter":{"name":"integrate-whatsapp","description":"Connect WhatsApp to your product with Kapso: onboard customers with setup links, detect connections, receive events via webhooks, and send messages/templates/media. Also manage WhatsApp Flows (create/update/publish, data endpoints, encryption). Use when integrating WhatsApp end-to-end."},"skills_sh_url":"https://skills.sh/gokapso/agent-skills/integrate-whatsapp"},"updatedAt":"2026-05-18T18:56:18.331Z"}}