> ## Documentation Index
> Fetch the complete documentation index at: https://reach-owl.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Create WhatsApp Outreach Campaigns

> Step-by-step guide to messaging WhatsApp group members or a CSV contact list with ReachOwl.

> Step-by-step guide to messaging WhatsApp group members or a CSV contact list with ReachOwl.

Use ReachOwl WhatsApp campaigns to send messages to members of a synced WhatsApp group, or to numbers you upload as a CSV / contact list. WhatsApp campaigns always use `action_type: "messages"`.

## Prerequisites

* A ReachOwl account with a connected WhatsApp browser/session (`GET /api/v1/app-states`, `platform: "whatsapp"`)
* Either a synced WhatsApp group id, or a CSV/list of phone numbers
* A Bearer token from `POST /api/v1/authenticate`

## Option A â WhatsApp group

### 1. Get a WhatsApp executor

```bash theme={null}
curl -X GET "https://reachowl.com/api/v1/app-states" \
  -H "Authorization: Bearer {token}"
```

Pick an `id` where `platform` is `whatsapp`.

### 2. Create the campaign

Set `platform` to `whatsapp`, `audience_type` to `group`, and `post_url` to the synced group id (for example `1203630...@g.us`).

```bash theme={null}
curl -X POST "https://reachowl.com/api/v1/campaigns" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "WA Group Welcome",
    "team_id": 10,
    "platform": "whatsapp",
    "audience_type": "group",
    "action_type": "messages",
    "post_url": "120363012345678901@g.us",
    "executor_ids": [55],
    "limit": 30,
    "status": 1,
    "messages": [
      {
        "text": ["Hi {{first_name}}, welcome to the community!"],
        "delay": 0
      }
    ],
    "schedule": [
      {
        "day": "Monday",
        "start_time": "09:00:00",
        "end_time": "17:00:00"
      }
    ]
  }'
```

## Option B â CSV / contact list upload

### 1. Create a file\_upload campaign

```bash theme={null}
curl -X POST "https://reachowl.com/api/v1/campaigns" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "WA CSV Outreach",
    "team_id": 10,
    "platform": "whatsapp",
    "audience_type": "file_upload",
    "action_type": "messages",
    "executor_ids": [55],
    "variables": ["area"],
    "limit": 30,
    "status": 0,
    "messages": [
      {
        "text": ["Hi {{first_name}}, checking in about {{area}}."],
        "delay": 0
      }
    ]
  }'
```

### 2. Upload contacts

Add rows with `POST /api/v1/campaigns/{id}/contacts`. Each WhatsApp row should include a phone-style `member_id` and/or `profile_url`:

```bash theme={null}
curl -X POST "https://reachowl.com/api/v1/campaigns/102/contacts" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "audience": [
      {
        "name": "Ali Khan",
        "member_id": "923001234567@c.us",
        "profile_url": "https://wa.me/923001234567",
        "variables": { "area": "DHA Lahore" }
      },
      {
        "name": "Sara Ahmed",
        "member_id": "923009876543@c.us",
        "profile_url": "https://wa.me/923009876543",
        "variables": { "area": "Gulberg" }
      }
    ]
  }'
```

CSV uploads from the dashboard use a multipart `urls_file` after create (columns such as `phone` / `profile_url` / `name`). Via API, JSON `audience` rows are the equivalent.

### 3. Start the campaign

```bash theme={null}
curl -X PATCH "https://reachowl.com/api/v1/campaigns/102" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"status": 1}'
```

## Pause or resume

```bash theme={null}
curl -X PATCH "https://reachowl.com/api/v1/campaigns/102" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{"status": 0}'
```

Use `status: 1` to resume.

## Notes

* WhatsApp campaigns only support `action_type: "messages"`.
* Use a WhatsApp executor from `GET /api/v1/app-states`.
* List WhatsApp campaigns with `GET /api/v1/campaigns?platform=whatsapp`.
* If `{{first_name}}` is missing on a contact, the placeholder may be empty.

## Related pages

* [Campaigns concept](/concepts/campaigns)
* [Create campaign API](/api-reference/campaigns/create)
* [Update campaign](/api-reference/campaigns/update)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.