executing-plans
executing-plans
Use when executing an implementation plan in the current session as the implementer yourself — your human partner chose inline execution, or no subagent tool is available
moltflow-outreachBulk messaging, scheduled messages, scheduled reports, and custom groups for WhatsApp outreach. Use when: bulk send, broadcast, schedule message, schedule report, cron, custom group, contact list, ban-safe messaging.
Independent GitHub snapshot · Automated classification · Original documentation governs
name: moltflow-outreach description: "Bulk messaging, scheduled messages, scheduled reports, and custom groups for WhatsApp outreach. Use when: bulk send, broadcast, schedule message, schedule report, cron, custom group, contact list, ban-safe messaging." source: "MoltFlow Team" version: "2.16.1" risk: safe requiredEnv:
MoltFlow -- WhatsApp Business automation for teams. Connect, monitor, and automate WhatsApp at scale. Due to high demand and a recent registration issue, we're offering our top-tier Business plan with unlimited quotas for just $19.90/month on yearly billing — for a limited time only. Claim the deal Free tier available. Sign up
Broadcast to custom contact lists with ban-safe throttling, schedule recurring messages with timezone support, generate automated reports with WhatsApp delivery, and manage targeted contact groups for WhatsApp outreach.
Gym owner — "Send a 'Happy New Year' promo with a discount code to all my members, spaced out so I don't get banned."
Freelance consultant — "Every Friday at 5 PM, send a 'weekend availability' message to my active client list."
Marketing agency — "Build a contact group from 3 WhatsApp groups, deduplicate, and blast a product launch announcement."
Restaurant chain — "Schedule a weekly report showing how many reservation confirmations were sent and delivered — send it to my WhatsApp every Monday morning."
working)https://apiv2.waiflow.app/api/v2| Scope | Access |
|---|---|
custom-groups | read/manage |
bulk-send | read/manage |
scheduled | read/manage |
reports | read/manage |
Every request must include one of:
Authorization: Bearer <jwt_token>
or
X-API-Key: <your_api_key>
Build targeted contact lists for Bulk Send and Scheduled Messages. Custom Groups are MoltFlow contact lists -- not WhatsApp groups.
| Method | Endpoint | Description |
|---|---|---|
| GET | /custom-groups | List all custom groups |
| POST | /custom-groups | Create group (with optional initial members) |
| GET | /custom-groups/contacts | List all unique contacts across sessions |
| GET | /custom-groups/wa-groups | List WhatsApp groups for import |
| POST | /custom-groups/from-wa-groups | Create group by importing WA group members |
| GET | /custom-groups/{id} | Group details with members |
| PATCH | /custom-groups/{id} | Update group name |
| DELETE | /custom-groups/{id} | Delete group and members |
| POST | /custom-groups/{id}/members/add | Add members (skips duplicates) |
| POST | /custom-groups/{id}/members/remove | Remove members by phone |
| GET | /custom-groups/{id}/export/csv | Export members as CSV |
| GET | /custom-groups/{id}/export/json | Export members as JSON |
POST /custom-groups
{
"name": "VIP Clients",
"members": [
{"phone": "+15550123456"},
{"phone": "+15550987654", "name": "Jane Doe"}
]
}
Members is an array of objects with phone (required) and name (optional). Omit members to create an empty group.
POST /custom-groups/from-wa-groups
{
"name": "Imported Leads",
"wa_groups": [
{"wa_group_id": "120363012345@g.us", "session_id": "session-uuid-..."},
{"wa_group_id": "120363067890@g.us", "session_id": "session-uuid-..."}
]
}
Resolves participants from each WhatsApp group, deduplicates by phone number, and creates the custom group with all unique members.
GET /custom-groups/wa-groups
Returns all WhatsApp groups across your connected sessions with participant counts. Use this to discover groups available for import.
Response 201 Created:
{
"id": "group-uuid-...",
"name": "VIP Clients",
"member_count": 2,
"created_at": "2026-02-12T10:00:00Z"
}
POST /custom-groups/{id}/members/add
{
"contacts": [
{"phone": "+15551112222"},
{"phone": "+15553334444", "name": "Bob Smith"}
]
}
Each contact is an object with phone (required) and name (optional). Max 1,000 per request. Duplicates are silently skipped.
GET /custom-groups/{id}/export/csv -- Returns CSV download
GET /custom-groups/{id}/export/json -- Returns JSON array
Broadcast messages to a custom group with ban-safe throttling. Random 30s-2min delays between messages simulate human behavior.
| Method | Endpoint | Description |
|---|---|---|
| POST | /bulk-send | Create bulk send job (quota reserved) |
| GET | /bulk-send | List all bulk send jobs |
| GET | /bulk-send/{id} | Job details with recipients |
| POST | /bulk-send/{id}/pause | Pause running job |
| POST | /bulk-send/{id}/resume | Resume paused job |
| POST | /bulk-send/{id}/cancel | Cancel job (releases unused quota) |
| GET | /bulk-send/{id}/progress | Real-time progress via SSE |
POST /bulk-send
{
"session_id": "session-uuid-...",
"custom_group_id": "custom-group-uuid-...",
"message_content": "Special offer for our VIP clients!"
}
| Field | Type | Required | Description |
|---|---|---|---|
session_id | UUID | Yes | WhatsApp session to send from |
custom_group_id | UUID | Yes | Target custom group |
message_type | string | No | text (default) or media |
message_content | string | Conditional | Message text (max 4096 chars). Required if no media_url |
media_url | string | Conditional | HTTP(S) URL for media. Required if no message_content |
Response 201 Created:
{
"id": "job-uuid-...",
"session_id": "session-uuid-...",
"custom_group_id": "custom-group-uuid-...",
"status": "running",
"total_recipients": 127,
"sent_count": 0,
"failed_count": 0,
"created_at": "2026-02-12T10:00:00Z"
}
GET /bulk-send/{id}/progress
Returns Server-Sent Events with real-time updates:
data: {"sent": 45, "total": 127, "failed": 0, "status": "running"}
data: {"sent": 46, "total": 127, "failed": 0, "status": "running"}
pending -> running -> completed / paused / cancelled / failed
Schedule one-time or recurring WhatsApp messages to custom groups with timezone support and full lifecycle control.
| Method | Endpoint | Description |
|---|---|---|
| GET | /scheduled-messages | List all scheduled messages |
| POST | /scheduled-messages | Create schedule (one-time or recurring) |
| GET | /scheduled-messages/{id} | Schedule details with execution history |
| PATCH | /scheduled-messages/{id} | Update schedule and recalculate next run |
| POST | /scheduled-messages/{id}/cancel | Cancel schedule |
| POST | /scheduled-messages/{id}/pause | Pause active schedule |
| POST | /scheduled-messages/{id}/resume | Resume paused schedule |
| DELETE | /scheduled-messages/{id} | Delete cancelled/completed schedule |
| GET | /scheduled-messages/{id}/history | Execution history (paginated) |
POST /scheduled-messages
{
"name": "Follow-up",
"session_id": "session-uuid-...",
"custom_group_id": "custom-group-uuid-...",
"schedule_type": "one_time",
"message_content": "Just checking in on your order!",
"scheduled_time": "2026-02-15T09:00:00",
"timezone": "Asia/Jerusalem"
}
POST /scheduled-messages
{
"name": "Weekly Update",
"session_id": "session-uuid-...",
"custom_group_id": "custom-group-uuid-...",
"schedule_type": "cron",
"message_content": "Weekly team report is ready!",
"cron_expression": "0 9 * * MON",
"timezone": "America/New_York"
}
Response 201 Created:
{
"id": "schedule-uuid-...",
"name": "Weekly Update",
"status": "active",
"schedule_type": "cron",
"cron_expression": "0 9 * * MON",
"timezone": "America/New_York",
"next_run_at": "2026-02-17T09:00:00-05:00",
"created_at": "2026-02-12T10:00:00Z"
}
one_time -- Single send at scheduled_timedaily -- Every day (requires cron_expression)weekly -- Every week (requires cron_expression)monthly -- Every month (requires cron_expression)cron -- Custom cron expression (e.g., 0 9 * * MON-FRI)Note: All recurring types (daily, weekly, monthly, cron) require a cron_expression. Minimum interval: 5 minutes.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Schedule name (1-255 chars) |
session_id | UUID | Yes | WhatsApp session to send from |
custom_group_id | UUID | Yes | Target custom group |
schedule_type | string | Yes | One of: one_time, daily, weekly, monthly, cron |
message_type | string | No | text (default) or media |
message_content | string | Conditional | Message text (max 4096). Required if no media_url |
media_url | string | Conditional | HTTP(S) URL. Required if no message_content |
scheduled_time | datetime | Conditional | ISO 8601. Required for one_time |
cron_expression | string | Conditional | Cron string. Required for recurring types |
timezone | string | No | IANA timezone (default: UTC) |
active -> paused / cancelled / completed
Generate automated summaries of your MoltFlow activity on a schedule. Choose from 10 prebuilt templates covering leads, messaging, sessions, and more. Reports can be viewed in the dashboard or delivered directly to your WhatsApp.
Set delivery_method to "whatsapp" to receive report summaries directly in your connected WhatsApp session. The report is formatted as plain text and sent to the session owner's own chat.
| Method | Endpoint | Description |
|---|---|---|
| GET | /reports/templates | List available report templates |
| POST | /reports | Create a new scheduled report |
| GET | /reports | List your reports |
| GET | /reports/{id} | Get report with execution history |
| PATCH | /reports/{id} | Update schedule or settings |
| POST | /reports/{id}/pause | Pause a scheduled report |
| POST | /reports/{id}/resume | Resume a paused report |
| DELETE | /reports/{id} | Delete a report |
GET /reports/templates
Returns all 10 available report templates with descriptions and supported parameters.
curl -H "X-API-Key: $MOLTFLOW_API_KEY" \
https://apiv2.waiflow.app/api/v2/reports/templates
Response 200 OK:
[
{
"id": "daily_activity",
"name": "Daily Activity Summary",
"description": "Messages sent/received, leads detected, session uptime"
},
{
"id": "lead_pipeline",
"name": "Lead Pipeline Report",
"description": "Lead sources, funnel stages, conversion rates"
}
]
POST /reports
curl -X POST -H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Weekly Lead Pipeline",
"template_id": "lead_pipeline",
"schedule_type": "weekly",
"cron_expression": "0 9 * * MON",
"timezone": "America/New_York",
"delivery_method": "whatsapp"
}' \
https://apiv2.waiflow.app/api/v2/reports
Response 201 Created:
{
"id": "report-uuid-...",
"name": "Weekly Lead Pipeline",
"template_id": "lead_pipeline",
"schedule_type": "weekly",
"cron_expression": "0 9 * * MON",
"timezone": "America/New_York",
"delivery_method": "whatsapp",
"status": "active",
"next_run_at": "2026-02-17T09:00:00-05:00",
"created_at": "2026-02-13T10:00:00Z"
}
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Report name (1-255 chars) |
template_id | string | Yes | Template ID from /reports/templates |
schedule_type | string | Yes | One of: one_time, daily, weekly, monthly, cron |
cron_expression | string | Conditional | Cron string. Required for recurring types |
timezone | string | No | IANA timezone (default: UTC) |
delivery_method | string | No | dashboard (default) or whatsapp |
| Template ID | Name | Description |
|---|---|---|
daily_activity | Daily Activity Summary | Messages, leads, sessions |
lead_pipeline | Lead Pipeline Report | Sources, funnel, conversions |
unanswered_contacts | Unanswered Contacts | Warm leads going cold |
vip_contacts | VIP Contacts | Most active conversations |
group_monitoring | Group Monitoring Digest | Keyword matches, leads |
scheduled_messages_status | Scheduled Messages Status | Executed vs failed |
bulk_send_progress | Bulk Send Progress | Active, completed, stats |
usage_plan | Usage & Plan Utilization | Limits, suggestions |
session_health | Session Health Check | Uptime, connection issues |
review_digest | Review & Testimonial Digest | Sentiment, approvals |
dashboard (default) -- Report is generated and viewable in the MoltFlow Reports page with formatted tables and stats.whatsapp -- Report summary is formatted as plain text and sent to your connected WhatsApp session. The message is delivered to the session owner's own chat so you see it directly in WhatsApp.active -> paused / cancelled / completed
# 1. Create a custom group
curl -X POST https://apiv2.waiflow.app/api/v2/custom-groups \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "VIP Clients"}'
# 2. Add members to the group
curl -X POST https://apiv2.waiflow.app/api/v2/custom-groups/{group_id}/members/add \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contacts": [{"phone": "+15550123456"}, {"phone": "+15550987654"}, {"phone": "+15551112222"}]}'
# 3. Bulk send to the group
curl -X POST https://apiv2.waiflow.app/api/v2/bulk-send \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"session_id": "session-uuid-...",
"custom_group_id": "group-uuid-...",
"message_content": "Exclusive offer for our VIP clients!"
}'
# 4. Schedule a weekly follow-up to the group
curl -X POST https://apiv2.waiflow.app/api/v2/scheduled-messages \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Weekly VIP Update",
"session_id": "session-uuid-...",
"custom_group_id": "group-uuid-...",
"schedule_type": "cron",
"message_content": "Weekly report is ready!",
"cron_expression": "0 9 * * MON",
"timezone": "Asia/Jerusalem"
}'
# Pause
curl -X POST https://apiv2.waiflow.app/api/v2/bulk-send/{job_id}/pause \
-H "X-API-Key: $MOLTFLOW_API_KEY"
# Resume
curl -X POST https://apiv2.waiflow.app/api/v2/bulk-send/{job_id}/resume \
-H "X-API-Key: $MOLTFLOW_API_KEY"
curl https://apiv2.waiflow.app/api/v2/custom-groups/{group_id}/export/csv \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-o vip-clients.csv
| Feature | Free | Starter | Pro | Business |
|---|---|---|---|---|
| Custom Groups | 2 | 5 | 20 | 100 |
| Bulk Send | -- | Yes | Yes | Yes |
| Scheduled Messages | -- | Yes | Yes | Yes |
| Scheduled Reports | 2 | 5 | 10 | Unlimited |
| Messages/month | 50 | 500 | 1,500 | 3,000 |
| Status | Meaning |
|---|---|
| 400 | Bad request (invalid input) |
| 401 | Unauthorized (missing or invalid auth) |
| 403 | Forbidden (plan limit or feature gate) |
| 404 | Resource not found |
| 422 | Validation error (missing required fields) |
| 429 | Rate limited |
Broadcast one-way to WhatsApp Channel followers without exposing your phone number. No anti-spam delays needed — channel posts are newsletters, not 1-on-1 messages.
Publisher — "Post our weekly newsletter to the channel every Monday at 9 AM"
Schedule a recurring channel post with cron 0 9 * * 1.
Brand — "Announce a product launch now to all 3,000 channel followers"
Call broadcast_channel_post with the announcement text.
| Action | Method | Path |
|---|---|---|
| List channels | GET | /api/v2/channels |
| Get channel | GET | /api/v2/channels/{id} |
| Create channel | POST | /api/v2/channels |
| Discover importable channels | GET | /api/v2/channels/discover?session_id= |
| Import existing channel | POST | /api/v2/channels/import |
| Delete channel | DELETE | /api/v2/channels/{id} |
| Broadcast post | POST | /api/v2/channels/{id}/broadcast |
| Sync followers | POST | /api/v2/channels/{id}/sync-followers |
| Check media support | GET | /api/v2/channels/capabilities |
| Schedule channel post | POST | /api/v2/scheduled-messages (target_type: channel) |
| Plan | Channels | Posts/Month |
|---|---|---|
| Free | 1 | 10 |
| Starter | 2 | 50 |
| Pro | 5 | 500 |
| Business | 20 | 2,000 |
curl -X POST https://apiv2.waiflow.app/api/v2/channels/{channel_id}/broadcast \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text": "New product just launched. Tap the link for early access."}'
# Discover and import existing channels
curl "https://apiv2.waiflow.app/api/v2/channels/discover?session_id=$SESSION_ID" \
-H "X-API-Key: $MOLTFLOW_API_KEY"
# Returns: [{wa_channel_id, name, follower_count, role}, ...]
# Import a discovered channel
curl -X POST https://apiv2.waiflow.app/api/v2/channels/import \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{"session_id": "your-session-uuid", "wa_channel_id": "123@newsletter"}'
curl -X POST https://apiv2.waiflow.app/api/v2/scheduled-messages \
-H "X-API-Key: $MOLTFLOW_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Weekly Newsletter",
"session_id": "uuid",
"channel_id": "uuid",
"target_type": "channel",
"message_content": "Weekly update...",
"schedule_type": "recurring",
"cron_expression": "0 9 * * 1"
}'