{"id":"a4036542-5dad-43de-886f-6f62f70dafe1","shortId":"tjNWnf","kind":"skill","title":"Automate Whatsapp","tagline":"Agent Skills skill by Gokapso","description":"# Automate WhatsApp\n\n## When to use\n\nUse this skill to build and run WhatsApp automations: workflow CRUD, graph edits, triggers, executions, function management, app integrations, and D1 database operations.\n\n## Setup\n\nPreferred path:\n- Kapso CLI installed and authenticated (`kapso login`)\n- Use the CLI for project/number discovery before wiring triggers or automations\n\nFallback path:\nEnv vars:\n- `KAPSO_API_BASE_URL` (host only, no `/platform/v1`)\n- `KAPSO_API_KEY`\n\n## How to\n\n### Discover phone numbers first\n\nPreferred path:\n1. Check project state: `kapso status`\n2. List connected numbers: `kapso whatsapp numbers list --output json`\n3. Resolve a display number when needed: `kapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json`\n\nFallback path:\n1. List number configs for triggers: `node scripts/list-whatsapp-phone-numbers.js`\n\n### Edit a workflow graph\n\n1. Fetch graph: `node scripts/get-graph.js <workflow_id>` (note the `lock_version`)\n2. Edit the JSON (see graph rules below)\n3. Validate: `node scripts/validate-graph.js --definition-file <path>`\n4. Update: `node scripts/update-graph.js <workflow_id> --expected-lock-version <n> --definition-file <path>`\n5. Re-fetch to confirm\n\nFor small edits, use `edit-graph.js` with `--old-file` and `--new-file` instead.\n\nIf you get a lock_version conflict: re-fetch, re-apply changes, retry with new lock_version.\n\n### Manage triggers\n\n1. List: `node scripts/list-triggers.js <workflow_id>`\n2. Create: `node scripts/create-trigger.js <workflow_id> --trigger-type <type> --phone-number-id <id>`\n3. Toggle: `node scripts/update-trigger.js --trigger-id <id> --active true|false`\n4. Delete: `node scripts/delete-trigger.js --trigger-id <id>`\n\nFor inbound_message triggers, prefer `kapso whatsapp numbers resolve --phone-number \"<display-number>\" --output json` to get the exact `phone_number_id`. Fall back to `node scripts/list-whatsapp-phone-numbers.js` when the CLI is unavailable.\n\n### Debug executions\n\n1. List: `node scripts/list-executions.js <workflow_id>`\n2. Inspect: `node scripts/get-execution.js <execution-id>`\n3. Get value: `node scripts/get-context-value.js <execution-id> --variable-path vars.foo`\n4. Events: `node scripts/list-execution-events.js <execution-id>`\n\n### Create and deploy a function\n\n1. Write code with handler signature (see function rules below)\n2. Create: `node scripts/create-function.js --name <name> --code-file <path> [--public-endpoint true]`\n3. Deploy: `node scripts/deploy-function.js --function-id <id>`\n4. Verify: `node scripts/get-function.js --function-id <id>`\n\nUse `--public-endpoint true` when the function should be callable without `X-API-Key` via the Kapso-hosted invoke URL. This is only supported for Cloudflare functions.\nNew functions default to `invoke_response_mode=passthrough`, which returns the function body directly on successful invoke. Legacy wrapped functions can be migrated later with `update-function.js`.\n\n### Set up agent node with app integrations\n\n1. Find model: `node scripts/list-provider-models.js`\n2. Find account: `node scripts/list-accounts.js --app-slug <slug>` (use `pipedream_account_id`)\n3. Find action: `node scripts/search-actions.js --query <word> --app-slug <slug>` (action_id = key)\n4. Create integration: `node scripts/create-integration.js --action-id <id> --app-slug <slug> --account-id <id> --configured-props <json>`\n5. Add tools to agent node via `flow_agent_app_integration_tools`\n\n### Database CRUD\n\n1. List tables: `node scripts/list-tables.js`\n2. Query: `node scripts/query-rows.js --table <name> --filters <json>`\n3. Create/update/delete with row scripts\n\n## Graph rules\n\n- Exactly one start node with `id` = `start`\n- Never change existing node IDs\n- Use `{node_type}_{timestamp_ms}` for new node IDs\n- Non-decide nodes have 0 or 1 outgoing `next` edge\n- Decide edge labels must match `conditions[].label`\n- Edge keys are `source`/`target`/`label` (not `from`/`to`)\n\nFor full schema details, see `references/graph-contract.md`.\n\n## Function rules\n\n```js\nasync function handler(request, env) {\n  // Parse input\n  const body = await request.json();\n  // Use env.KV and env.DB as needed\n  return new Response(JSON.stringify({ result: \"ok\" }));\n}\n```\n\n- Do NOT use `export`, `export default`, or arrow functions\n- Return a `Response` object\n\n## Execution context\n\nAlways use this structure:\n- `vars` - user-defined variables\n- `system` - system variables\n- `context` - channel data\n- `metadata` - request metadata\n\n## Scripts\n\n### Workflows\n\n| Script | Purpose |\n|--------|---------|\n| `list-workflows.js` | List workflows (metadata only) |\n| `get-workflow.js` | Get workflow metadata |\n| `create-workflow.js` | Create a workflow |\n| `update-workflow-settings.js` | Update workflow settings |\n\n### Graph\n\n| Script | Purpose |\n|--------|---------|\n| `get-graph.js` | Get workflow graph + lock_version |\n| `edit-graph.js` | Patch graph via string replacement |\n| `update-graph.js` | Replace entire graph |\n| `validate-graph.js` | Validate graph structure locally |\n\n### Triggers\n\n| Script | Purpose |\n|--------|---------|\n| `list-triggers.js` | List triggers for a workflow |\n| `create-trigger.js` | Create a trigger |\n| `update-trigger.js` | Enable/disable a trigger |\n| `delete-trigger.js` | Delete a trigger |\n| `list-whatsapp-phone-numbers.js` | List phone numbers for trigger setup |\n\n### Executions\n\n| Script | Purpose |\n|--------|---------|\n| `list-executions.js` | List executions |\n| `get-execution.js` | Get execution details |\n| `get-context-value.js` | Read value from execution context |\n| `update-execution-status.js` | Force execution state |\n| `resume-execution.js` | Resume waiting execution |\n| `list-execution-events.js` | List execution events |\n\n### Functions\n\n| Script | Purpose |\n|--------|---------|\n| `list-functions.js` | List project functions |\n| `get-function.js` | Get function details + code |\n| `create-function.js` | Create a function, optionally with a public invoke endpoint |\n| `update-function.js` | Update function code, public endpoint setting, or migrate a legacy wrapped function to passthrough |\n| `deploy-function.js` | Deploy function to runtime |\n| `invoke-function.js` | Invoke function with payload |\n| `list-function-invocations.js` | List function invocations |\n\n### App integrations\n\n| Script | Purpose |\n|--------|---------|\n| `list-apps.js` | Search integration apps |\n| `search-actions.js` | Search actions (action_id = key) |\n| `get-action-schema.js` | Get action JSON schema |\n| `list-accounts.js` | List connected accounts |\n| `create-connect-token.js` | Create OAuth connect link |\n| `configure-prop.js` | Resolve remote_options for a prop |\n| `reload-props.js` | Reload dynamic props |\n| `list-integrations.js` | List saved integrations |\n| `create-integration.js` | Create an integration |\n| `update-integration.js` | Update an integration |\n| `delete-integration.js` | Delete an integration |\n\n### Databases\n\n| Script | Purpose |\n|--------|---------|\n| `list-tables.js` | List D1 tables |\n| `get-table.js` | Get table schema + sample rows |\n| `query-rows.js` | Query rows with filters |\n| `create-row.js` | Create a row |\n| `update-row.js` | Update rows |\n| `upsert-row.js` | Upsert a row |\n| `delete-row.js` | Delete rows |\n\n### OpenAPI\n\n| Script | Purpose |\n|--------|---------|\n| `openapi-explore.mjs` | Explore OpenAPI (search/op/schema/where) |\n\nInstall deps (once):\n```bash\nnpm i\n```\n\nExamples:\n```bash\nnode scripts/openapi-explore.mjs --spec workflows search \"variables\"\nnode scripts/openapi-explore.mjs --spec workflows op getWorkflowVariables\nnode scripts/openapi-explore.mjs --spec platform op queryDatabaseRows\n```\n\n## Notes\n\n- Prefer file paths over inline JSON (`--definition-file`, `--code-file`)\n- `action_id` is the same as `key` from `search-actions`\n- `--account-id` uses `pipedream_account_id` from `list-accounts`\n- Variable CRUD (`variables-set.js`, `variables-delete.js`) is blocked - Platform API doesn't support it\n- Raw SQL execution is not supported via Platform API\n\n## References\n\nRead before editing:\n- [references/graph-contract.md](references/graph-contract.md) - Graph schema, computed vs editable fields, lock_version\n- [references/node-types.md](references/node-types.md) - Node types and config shapes\n- [references/workflow-overview.md](references/workflow-overview.md) - Execution flow and states\n\nOther references:\n- [references/execution-context.md](references/execution-context.md) - Context structure and variable substitution\n- [references/triggers.md](references/triggers.md) - Trigger types and setup\n- [references/app-integrations.md](references/app-integrations.md) - App integration and variable_definitions\n- [references/functions-reference.md](references/functions-reference.md) - Function management\n- [references/functions-payloads.md](references/functions-payloads.md) - Payload shapes for functions\n- [references/databases-reference.md](references/databases-reference.md) - Database operations\n\n## Assets\n\n| File | Description |\n|------|-------------|\n| `workflow-linear.json` | Minimal linear workflow |\n| `workflow-decision.json` | Minimal branching workflow |\n| `workflow-agent-simple.json` | Minimal agent workflow |\n| `workflow-customer-support-intake-agent.json` | Customer support intake |\n| `workflow-interactive-buttons-decide-function.json` | Interactive buttons + decide (function) |\n| `workflow-interactive-buttons-decide-ai.json` | Interactive buttons + decide (AI) |\n| `workflow-api-template-wait-agent.json` | API trigger + template + agent |\n| `function-decide-route-interactive-buttons.json` | Function for button routing |\n| `agent-app-integration-example.json` | Agent node with app integrations |\n\n## Related skills\n\n- `integrate-whatsapp` - Onboarding, webhooks, messaging, templates, flows\n- `observe-whatsapp` - Debugging, logs, health checks\n\n<!-- FILEMAP:BEGIN -->\n```text\n[automate-whatsapp file map]|root: .\n|.:{package.json,SKILL.md}\n|assets:{agent-app-integration-example.json,databases-example.json,function-decide-route-interactive-buttons.json,functions-example.json,workflow-agent-simple.json,workflow-api-template-wait-agent.json,workflow-customer-support-intake-agent.json,workflow-decision.json,workflow-interactive-buttons-decide-ai.json,workflow-interactive-buttons-decide-function.json,workflow-linear.json}\n|references:{app-integrations.md,databases-reference.md,execution-context.md,function-contracts.md,functions-payloads.md,functions-reference.md,graph-contract.md,node-types.md,triggers.md,workflow-overview.md,workflow-reference.md}\n|scripts:{configure-prop.js,create-connect-token.js,create-function.js,create-integration.js,create-row.js,create-trigger.js,create-workflow.js,delete-integration.js,delete-row.js,delete-trigger.js,deploy-function.js,edit-graph.js,get-action-schema.js,get-context-value.js,get-execution-event.js,get-execution.js,get-function.js,get-graph.js,get-table.js,get-workflow.js,invoke-function.js,list-accounts.js,list-apps.js,list-execution-events.js,list-executions.js,list-function-invocations.js,list-functions.js,list-integrations.js,list-provider-models.js,list-tables.js,list-triggers.js,list-whatsapp-phone-numbers.js,list-workflows.js,openapi-explore.mjs,query-rows.js,reload-props.js,resume-execution.js,search-actions.js,update-execution-status.js,update-function.js,update-graph.js,update-integration.js,update-row.js,update-trigger.js,update-workflow-settings.js,upsert-row.js,validate-graph.js,variables-delete.js,variables-list.js,variables-set.js}\n|scripts/lib/databases:{args.js,filters.js,kapso-api.js}\n|scripts/lib/functions:{args.js,kapso-api.js}\n|scripts/lib/workflows:{args.js,kapso-api.js,result.js}\n```\n<!-- FILEMAP:END -->","tags":["automate","whatsapp","agent","skills","gokapso"],"capabilities":["skill","source-gokapso","category-agent-skills"],"categories":["agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/gokapso/agent-skills/automate-whatsapp","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"install_from":"skills.sh"}},"qualityScore":"0.300","qualityRationale":"deterministic score 0.30 from registry signals: · indexed on skills.sh · published under gokapso/agent-skills","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:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T09:40:35.920Z","embedding":null,"createdAt":"2026-04-18T20:34:10.318Z","updatedAt":"2026-04-22T09:40:35.920Z","lastSeenAt":"2026-04-22T09:40:35.920Z","tsv":"'/platform/v1':68 '0':496 '1':80,114,126,202,267,293,392,452,498 '2':86,135,206,271,303,397,457 '3':96,143,217,275,315,409,463 '4':150,227,284,322,421 '5':161,438 'account':399,407,433,757,880,884,889 'account-id':432,879 'action':411,418,427,745,746,751,868,878 'action-id':426 'activ':224 'add':439 'agent':3,387,442,446,987,1007,1014 'agent-app-integration-example.json':1013,1046 'ai':1002 'alway':565 'api':62,70,343,897,910,1004 'app':30,390,403,416,430,447,735,742,955,1017 'app-integrations.md':1058 'app-slug':402,415,429 'appli':193 'args.js':1121,1125,1128 'arrow':557 'asset':974,1045 'async':527 'authent':43 'autom':1,8,21,56,1038 'automate-whatsapp':1037 'await':536 'back':256 'base':63 'bash':832,836 'block':895 'bodi':371,535 'branch':983 'build':17 'button':995,1000,1011 'callabl':339 'category-agent-skills' 'chang':194,478 'channel':578 'check':81,1035 'cli':40,48,262 'cloudflar':357 'code':295,309,695,709,866 'code-fil':308,865 'comput':919 'condit':507 'config':117,930 'configur':436 'configure-prop.js':763,1070 'configured-prop':435 'confirm':166 'conflict':187 'connect':88,756,761 'const':534 'context':564,577,671,942 'creat':207,288,304,422,597,638,697,759,779,809 'create-connect-token.js':758,1071 'create-function.js':696,1072 'create-integration.js':778,1073 'create-row.js':808,1074 'create-trigger.js':637,1075 'create-workflow.js':596,1076 'create/update/delete':464 'crud':23,451,891 'custom':990 'd1':33,795 'data':579 'databas':34,450,790,972 'databases-example.json':1047 'databases-reference.md':1059 'debug':265,1032 'decid':493,502,996,1001 'default':361,555 'defin':572 'definit':148,159,863,959 'definition-fil':147,158,862 'delet':228,646,787,820 'delete-integration.js':786,1077 'delete-row.js':819,1078 'delete-trigger.js':645,1079 'dep':830 'deploy':290,316,722 'deploy-function.js':721,1080 'descript':976 'detail':521,665,694 'direct':372 'discov':74 'discoveri':51 'display':99 'doesn':898 'dynam':772 'edg':501,503,509 'edit':25,122,136,169,914,921 'edit-graph.js':171,613,1081 'enable/disable':642 'endpoint':313,332,705,711 'entir':621 'env':59,531 'env.db':541 'env.kv':539 'event':285,683 'exact':251,470 'exampl':835 'execut':27,266,563,656,661,664,670,674,679,682,904,934 'execution-context.md':1060 'exist':479 'expect':155 'expected-lock-vers':154 'explor':826 'export':553,554 'fall':255 'fallback':57,112 'fals':226 'fetch':127,164,190 'field':922 'file':149,160,175,179,310,857,864,867,975,1040 'filter':462,807 'filters.js':1122 'find':393,398,410 'first':77 'flow':445,935,1028 'forc':673 'full':519 'function':28,292,300,320,327,336,358,360,370,378,524,528,558,684,690,693,699,708,718,723,728,733,962,969,997,1009 'function-contracts.md':1061 'function-decide-route-interactive-buttons.json':1008,1048 'function-id':319,326 'functions-example.json':1049 'functions-payloads.md':1062 'functions-reference.md':1063 'get':183,249,276,593,608,663,692,750,798 'get-action-schema.js':749,1082 'get-context-value.js':666,1083 'get-execution-event.js':1084 'get-execution.js':662,1085 'get-function.js':691,1086 'get-graph.js':607,1087 'get-table.js':797,1088 'get-workflow.js':592,1089 'getworkflowvari':848 'gokapso':7 'graph':24,125,128,140,468,604,610,615,622,625,917 'graph-contract.md':1064 'handler':297,529 'health':1034 'host':65,349 'id':216,223,233,254,321,328,408,419,428,434,475,481,490,747,869,881,885 'inbound':235 'inlin':860 'input':533 'inspect':272 'instal':41,829 'instead':180 'intak':992 'integr':31,391,423,448,736,741,777,781,785,789,956,1018,1022 'integrate-whatsapp':1021 'interact':994,999 'invoc':734 'invok':350,363,375,704,727 'invoke-function.js':726,1090 'js':526 'json':95,111,138,247,752,861 'json.stringify':547 'kapso':39,44,61,69,84,90,103,239,348 'kapso-api.js':1123,1126,1129 'kapso-host':347 'key':71,344,420,510,748,874 'label':504,508,514 'later':382 'legaci':376,716 'linear':979 'link':762 'list':87,93,115,203,268,453,588,632,650,660,681,688,732,755,775,794,888 'list-account':887 'list-accounts.js':754,1091 'list-apps.js':739,1092 'list-execution-events.js':680,1093 'list-executions.js':659,1094 'list-function-invocations.js':731,1095 'list-functions.js':687,1096 'list-integrations.js':774,1097 'list-provider-models.js':1098 'list-tables.js':793,1099 'list-triggers.js':631,1100 'list-whatsapp-phone-numbers.js':649,1101 'list-workflows.js':587,1102 'local':627 'lock':133,156,185,198,611,923 'log':1033 'login':45 'manag':29,200,963 'map':1041 'match':506 'messag':236,1026 'metadata':580,582,590,595 'migrat':381,714 'minim':978,982,986 'mode':365 'model':394 'ms':486 'must':505 'name':307 'need':102,543 'never':477 'new':178,197,359,488,545 'new-fil':177 'next':500 'node':120,129,145,152,204,208,219,229,258,269,273,278,286,305,317,324,388,395,400,412,424,443,455,459,473,480,483,489,494,837,843,849,927,1015 'node-types.md':1065 'non':492 'non-decid':491 'note':131,855 'npm':833 'number':76,89,92,100,105,109,116,215,241,245,253,652 'oauth':760 'object':562 'observ':1030 'observe-whatsapp':1029 'ok':549 'old':174 'old-fil':173 'onboard':1024 'one':471 'op':847,853 'openapi':822,827 'openapi-explore.mjs':825,1103 'oper':35,973 'option':700,766 'outgo':499 'output':94,110,246 'package.json':1043 'pars':532 'passthrough':366,720 'patch':614 'path':38,58,79,113,282,858 'payload':730,966 'phone':75,108,214,244,252,651 'phone-numb':107,243 'phone-number-id':213 'pipedream':406,883 'platform':852,896,909 'prefer':37,78,238,856 'project':82,689 'project/number':50 'prop':437,769,773 'public':312,331,703,710 'public-endpoint':311,330 'purpos':586,606,630,658,686,738,792,824 'queri':414,458,804 'query-rows.js':803,1104 'querydatabaserow':854 'raw':902 're':163,189,192 're-appli':191 're-fetch':162,188 'read':667,912 'refer':911,939,1057 'references/app-integrations.md':953,954 'references/databases-reference.md':970,971 'references/execution-context.md':940,941 'references/functions-payloads.md':964,965 'references/functions-reference.md':960,961 'references/graph-contract.md':523,915,916 'references/node-types.md':925,926 'references/triggers.md':947,948 'references/workflow-overview.md':932,933 'relat':1019 'reload':771 'reload-props.js':770,1105 'remot':765 'replac':618,620 'request':530,581 'request.json':537 'resolv':97,106,242,764 'respons':364,546,561 'result':548 'result.js':1130 'resum':677 'resume-execution.js':676,1106 'retri':195 'return':368,544,559 'root':1042 'rout':1012 'row':466,802,805,811,814,818,821 'rule':141,301,469,525 'run':19 'runtim':725 'sampl':801 'save':776 'schema':520,753,800,918 'script':467,583,585,605,629,657,685,737,791,823,1069 'scripts/create-function.js':306 'scripts/create-integration.js':425 'scripts/create-trigger.js':209 'scripts/delete-trigger.js':230 'scripts/deploy-function.js':318 'scripts/get-context-value.js':279 'scripts/get-execution.js':274 'scripts/get-function.js':325 'scripts/get-graph.js':130 'scripts/lib/databases':1120 'scripts/lib/functions':1124 'scripts/lib/workflows':1127 'scripts/list-accounts.js':401 'scripts/list-execution-events.js':287 'scripts/list-executions.js':270 'scripts/list-provider-models.js':396 'scripts/list-tables.js':456 'scripts/list-triggers.js':205 'scripts/list-whatsapp-phone-numbers.js':121,259 'scripts/openapi-explore.mjs':838,844,850 'scripts/query-rows.js':460 'scripts/search-actions.js':413 'scripts/update-graph.js':153 'scripts/update-trigger.js':220 'scripts/validate-graph.js':146 'search':740,744,841,877 'search-act':876 'search-actions.js':743,1107 'search/op/schema/where':828 'see':139,299,522 'set':385,603,712 'setup':36,655,952 'shape':931,967 'signatur':298 'skill':4,5,15,1020 'skill.md':1044 'slug':404,417,431 'small':168 'sourc':512 'source-gokapso' 'spec':839,845,851 'sql':903 'start':472,476 'state':83,675,937 'status':85 'string':617 'structur':568,626,943 'substitut':946 'success':374 'support':355,900,907,991 'system':574,575 'tabl':454,461,796,799 'target':513 'templat':1006,1027 'text':1036 'timestamp':485 'toggl':218 'tool':440,449 'trigger':26,54,119,201,211,222,232,237,628,633,640,644,648,654,949,1005 'trigger-id':221,231 'trigger-typ':210 'triggers.md':1066 'true':225,314,333 'type':212,484,928,950 'unavail':264 'updat':151,601,707,783,813 'update-execution-status.js':672,1108 'update-function.js':384,706,1109 'update-graph.js':619,1110 'update-integration.js':782,1111 'update-row.js':812,1112 'update-trigger.js':641,1113 'update-workflow-settings.js':600,1114 'upsert':816 'upsert-row.js':815,1115 'url':64,351 'use':12,13,46,170,329,405,482,538,552,566,882 'user':571 'user-defin':570 'valid':144,624 'validate-graph.js':623,1116 'valu':277,668 'var':60,569 'variabl':281,573,576,842,890,945,958 'variable-path':280 'variables-delete.js':893,1117 'variables-list.js':1118 'variables-set.js':892,1119 'vars.foo':283 'verifi':323 'version':134,157,186,199,612,924 'via':345,444,616,908 'vs':920 'wait':678 'webhook':1025 'whatsapp':2,9,20,91,104,240,1023,1031,1039 'wire':53 'without':340 'workflow':22,124,584,589,594,599,602,609,636,840,846,980,984,988 'workflow-agent-simple.json':985,1050 'workflow-api-template-wait-agent.json':1003,1051 'workflow-customer-support-intake-agent.json':989,1052 'workflow-decision.json':981,1053 'workflow-interactive-buttons-decide-ai.json':998,1054 'workflow-interactive-buttons-decide-function.json':993,1055 'workflow-linear.json':977,1056 'workflow-overview.md':1067 'workflow-reference.md':1068 'wrap':377,717 'write':294 'x':342 'x-api-key':341","prices":[{"id":"07969e79-c630-4353-b9b5-c574c4c70abc","listingId":"a4036542-5dad-43de-886f-6f62f70dafe1","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:34:10.318Z"}],"sources":[{"listingId":"a4036542-5dad-43de-886f-6f62f70dafe1","source":"github","sourceId":"gokapso/agent-skills/automate-whatsapp","sourceUrl":"https://github.com/gokapso/agent-skills/tree/master/skills/automate-whatsapp","isPrimary":false,"firstSeenAt":"2026-04-18T22:11:58.625Z","lastSeenAt":"2026-04-22T06:55:27.915Z"},{"listingId":"a4036542-5dad-43de-886f-6f62f70dafe1","source":"skills_sh","sourceId":"gokapso/agent-skills/automate-whatsapp","sourceUrl":"https://skills.sh/gokapso/agent-skills/automate-whatsapp","isPrimary":true,"firstSeenAt":"2026-04-18T20:34:10.318Z","lastSeenAt":"2026-04-22T09:40:35.920Z"}],"details":{"listingId":"a4036542-5dad-43de-886f-6f62f70dafe1","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"gokapso","slug":"automate-whatsapp","source":"skills_sh","category":"agent-skills","skills_sh_url":"https://skills.sh/gokapso/agent-skills/automate-whatsapp"},"updatedAt":"2026-04-22T09:40:35.920Z"}}