> For the complete documentation index, see [llms.txt](https://api.direct.revicom.ltd/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://api.direct.revicom.ltd/messages/whatsapp-sending.md).

# Sending WHATSAPP

{% hint style="warning" %}
To have an opportunity to send WHATSAPP messages, please contact your manager.
{% endhint %}

{% hint style="info" %}
Messages are sent in chat mode:

* if the chat is initiated by a client, the first message must match the registered template. Each time the subscriber replies, a 24-hour window will open to send messages with arbitrary content. If the subscriber does not reply, the client can send messages to the user outside the 24-hour window using pre-registered message templates;
* if the chat is initiated by the subscriber, during the 24-hour window the client can send messages with arbitrary content.
  {% endhint %}

## Sending WHATSAPP

<mark style="color:green;">`POST`</mark> `https://direct.revicom.ltd/api/v1/message`

The method allows for sending an array of single messages **(1 to 1,000)**

#### Headers

| Name                                            | Type   | Description        |
| ----------------------------------------------- | ------ | ------------------ |
| Authorization<mark style="color:red;">\*</mark> | string | `Basic {TOKEN_1}`  |
| Content-Type<mark style="color:red;">\*</mark>  | string | `application/json` |

#### Request Body

| Name                                          | Type    | Description                                                                                                                                                                                                                                                                                        |
| --------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| channelType<mark style="color:red;">\*</mark> | string  | Sending channel (`SMS`)                                                                                                                                                                                                                                                                            |
| senderName<mark style="color:red;">\*</mark>  | string  | Sender name. WHATSAPP-names with the status “Approved” are allowed, with the start date not later than the request time                                                                                                                                                                            |
| destination<mark style="color:red;">\*</mark> | string  | Subscriber number                                                                                                                                                                                                                                                                                  |
| content<mark style="color:red;">\*</mark>     | object  | Message content. Below are the possible contents                                                                                                                                                                                                                                                   |
| tags                                          | array   | Message tags (array of strings). Each tag must match the expression `^\w+$` (any case letters, numbers and underscore "\_" are allowed)                                                                                                                                                            |
| useLocalTime                                  | boolean | <p>Flag responsible for the time zone in which the message will be sent:<br><strong><code>true</code></strong> – sending in the subscriber time zone<br><strong><code>false</code></strong> – sending by Moscow time<br><em>By default, true</em></p>                                              |
| localSendTime                                 | string  | <p>Low bound for the allowed time to send a message (subject to <code>useLocalTime</code>)<br>Date in the format '<code>YYYY-MM-DD hh:mm:ss</code>' in the range from (current UTC time – 12 hours) to (current UTC time + 7 days)<br><em>By default the message will be sent immediately</em></p> |
| localCompletionTime                           | string  | Upper bound for the allowed time to send a message (subject to `useLocalTime`) in the range from `localSendTime` to (current UTC time + 70 days)                                                                                                                                                   |
| ttl                                           | integer | <p>Message lifetime in seconds. After the ttl expires, the final status is set to the message<br><code>60 ≤ ttl ≤ 86400</code></p>                                                                                                                                                                 |
| hours                                         | array   | Valid sending hours (array of numbers). Integers from 0 to 23 can be transmitted in the array, each corresponding to the hour interval allowed for sending, subject to `useLocalTime;` the values must be unique.                                                                                  |
| days                                          | array   | Valid sending days (array of numbers). Integers from 1 (Mon) to 7 (Sun) can be transmitted in the array, each corresponding to the week day allowed for sending; the values must be unique.                                                                                                        |
| shortUrl                                      | boolean | <p>Flag responsible for shortening links in the message:<br><code>true</code>- links in the text of the message will be shortened<br>By default, <code>false</code></p>                                                                                                                            |
| callbackUrl                                   | string  | Address to send callback                                                                                                                                                                                                                                                                           |
| callbackEvents                                | array   | Events to send callback (an array of strings). If there is `callbackUrl` and no `callbackEvents` in the request, a callback will be sent on the event `delivered`                                                                                                                                  |

{% tabs %}
{% tab title="200" %}
If the request is successful, a response is returned that lists the message IDs and result codes. With errors = false, all submitted messages are guaranteed to have been successfully generated.

```
{
  "errors": false,
  "items": [
    {
      "messageUuid": "063474ec-a34f-4558-90c5-984395000004",
      "code": 201
    },
    {
      "messageUuid": "063564ec-a34f-4558-90c5-984395000005",
      "code": 201
    }
  ]
}
```

{% endtab %}

{% tab title="401" %}
Invalid token used/authorization header missing.

{% tabs %}
{% tab title="4012" %}

```
{
    "error": {
        "code": 4012,
        "msg": "Bad credentials"
    }
}
```

{% endtab %}

{% tab title="4010" %}

```
{
    "error": {
        "code": 4010,
        "msg": "Not Authenticated"
    }
}
```

{% endtab %}
{% endtabs %}
{% endtab %}

{% tab title="403" %}
Token of wrong type used.

```
{
    "error": {
        "code": 4030,
        "msg": "Access Denied"
    }
}
```

{% endtab %}

{% tab title="422" %}
The request body contains invalid parameters or the maximum number of objects is exceeded.

```
{
    "error": {
        "code": 4220,
        "msg": "Max count of messages is 1000"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Local send time is less than minimal {minLocalSendTime}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Local send time is greater than minimal {maxLocalSendTime}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Local completion time is less than minimal {minLocalCompletionTime}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Local completion time is greater than maximal {maxLocalCompletionTime}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "No active sender name: ({channelType}, {senderName})"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Invalid msisdn"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Blank content"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Invalid tags: {tags}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4220,
        "msg": "Invalid TTL {ttl}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4222,
        "msg": "Invalid hours: {hours}"
    }
}
-----------------------------------------------------------------------------
{
    "error": {
        "code": 4223,
        "msg": "Invalid days: {days}"
    }
}
```

{% endtab %}

{% tab title="503 " %}

```
{
    "error": {
        "code": 5030,
        "msg": "Url shortener is unavailable"
    }
}
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
Recommended minimum timeout: 70 seconds
{% endhint %}

{% hint style="warning" %}
To set up custom domain for the link shortening functionality, please contact customer support
{% endhint %}

Enumerations:

| Parameter      | Allowed values                                          |
| -------------- | ------------------------------------------------------- |
| callbackEvents | [Callback Events](/extra/references.md#callback-events) |

## Text message

In addition to text, a WHATSAPP text message may contain a header, footer, and buttons. To send a text WHATSAPP message, use the following object `content`:

```
{
  "contentType": "text",
  "text": "whatsapp message text",
  "header": {
    "text": "message header"
  },
  "footer": {
    "text": "message footer"
  },
  "buttons": [
    {
      "text": "button text 1",
      "url": "https://revicom.ltd"
    },
    {
      "text": "button text 2",
      "phone": "14085553911"
    }
  ]
}
```

| Parameter           | Type                                        | Description                                                                                                                            |
| ------------------- | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| contentType         | <p>string</p><p><em>required</em></p>       | Content type (`text`)                                                                                                                  |
| text                | <p>string</p><p><em>required</em></p>       | <p>Message text; UTF-8 encoded string without Byte Order Mark</p><p>1 to 1,000 characters</p>                                          |
| header              | <p>object<br><em>optional</em></p>          | Message header                                                                                                                         |
| header.text         | <p>string<br><em>optonal</em></p>           | <p>Header text<br>Any string 1 to 60 characters</p>                                                                                    |
| header.documentUrl  | <p>string<br><em>optional</em></p>          | Link to the document for the header                                                                                                    |
| header.documentName | <p>string<br><em>optio</em>n<em>al</em></p> | Title of the document for the header; may only be present if documentUrl                                                               |
| header.imageUrl     | <p>string<br><em>optional</em></p>          | Link to the image for the header                                                                                                       |
| footer              | <p>object<br><em>optional</em></p>          | Message footer                                                                                                                         |
| footer.text         | <p>string<br><em>optional</em></p>          | <p>Footer text<br>Any string 1 to 60 characters</p>                                                                                    |
| buttons             | <p>array (objects)<br><em>optional</em></p> | Array with button objects                                                                                                              |
| buttons.text        | <p>string<br><em>optonal</em></p>           | <p>Button text<br>Any string 1 to 20 characters</p>                                                                                    |
| buttons.url         | <p>string<br><em>optional</em></p>          | <p>The link to which the button is clicked</p><p>Any string 1 to 1,000 characters  </p><p>Must begin with <code>http</code></p>        |
| buttons.phone       | <p>string<br><em>optional</em></p>          | <p>Phone number to which you are prompted to make a call when you press the button         </p><p>Any string 1 to 1,000 characters</p> |
| buttons.payload     | <p>string<br><em>optional</em></p>          | <p>Hidden text that will be sent in the incoming message if the user clicks on the button</p><p>Any string 1 to 1,000 mcharacters</p>  |

### Message header

• in the `header` object, only one of the following can be used:

* `text`
* `documentUrl` и `documentName`
* `imageUrl`

### Message buttons

* in the buttons array, 1 to 3 objects are allowed
* any object must have text
* there are two types of the buttons:
  * link button: contains text and url or text and phone
  * text button: contains text and payloa
  * :exclamation: Transmission of payload alongside with url or phone is not allowed
* one message may transmit one-type buttons only
* one message may have only one button with parameter `url`
* one message may have only one button with parameter `phone`
* when transmitting buttons with text, no more than three objects in the array are allowed
* when passing buttons with a link, no more than two objects in the array are allowed
* buttons in the message do not affect a header or footer

### Objects examples <a href="#object_examples" id="object_examples"></a>

{% tabs %}
{% tab title="Text" %}

```
{
  "contentType": "text",
  "text": "message text"
}
```

{% endtab %}

{% tab title="With header" %}

```
{
  "contentType": "text",
  "text": "message text",
  "header": {
    "documentUrl": "https://example.com/document.pdf",
    "documentName": "document.pdf"
  }
}
```

{% endtab %}

{% tab title="With header and footer" %}

```
{
  "contentType": "text",
  "text": "message text",
  "header": {
    "imageUrl": "https://example.com/image.png"
  },
  "footer": {
  "text": "message footer"
  }
}
```

{% endtab %}

{% tab title="With text buttons" %}

```
{
  "contentType": "text",
  "text": "message text",
  "buttons": [
    {
      "text": "button text 1",
      "payload": "id=1"
    },
    {
      "text": "button text 2",
      "payload": "id=2"
    }
  ]
}
```

{% endtab %}

{% tab title="With link buttons" %}

```
{
  "contentType": "text",
  "text": "message text",
  "buttons": [
    {
      "text": "button text 1",
      "url": "https://i-dgtl.ru/"
    },
    {
      "text": "button text 2",
      "phone": "78124269988"
    }
  ]
}
```

{% endtab %}
{% endtabs %}

## Message with image

To send WHATSAPP message with an image attached, use the following object `content`:

```
{
  "contentType": "image",
  "imageUrl": "https://image.png",
  "imageName": "Image",
  "header": {
    "text": "message header"
  },
  "footer": {
    "text": "message footer"
  },
  "buttons": [
    {
      "text": "button text 1",
      "url": "https://i-dgtl.ru/"
    },
    {
      "text": "button text 2",
      "phone": "14085553911"
    }
  ]
}
```

| Parameter   | Type                               | Description            |
| ----------- | ---------------------------------- | ---------------------- |
| contentType | <p>string<br><em>required</em></p> | Content Type (`image`) |
| imageUrl    | <p>string<br><em>required</em></p> | Link to the image      |
| imageName   | <p>string<br><em>required</em></p> | Image name             |

{% hint style="info" %}
Header, footer and buttons are validated according to the same rules as for a text message
{% endhint %}

## Message with document

To send WHATSAPP message with an image attached, use the following object `content`:

```
{
  "contentType": "document",
  "documentUrl": "https://document.pdf",
  "documentName": "Document",
  "header": {
    "text": "header text"
  },
  "footer": {
    "text": "footer text"
  },
  "buttons": [
    {
      "text": "button text 1",
      "url": "https://revicom.ltd"
    },
    {
      "text": "button text 2",
      "phone": "78124269988"
    }
  ]
}
```

| Parameter    | Type                               | Description               |
| ------------ | ---------------------------------- | ------------------------- |
| contentType  | <p>string<br><em>required</em></p> | Content Type (`document`) |
| documentUrl  | <p>string<br><em>required</em></p> | Link to the document      |
| documentName | <p>string<br><em>required</em></p> | Name of the document      |

{% hint style="info" %}
Header, footer and buttons are validated according to the same rules as for a text message
{% endhint %}

## **Request example** <a href="#example" id="example"></a>

{% tabs %}
{% tab title="JSON" %}

```
POST https://direct.revicom.ltd/api/v1/message
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Content-Type: application/json
[
  {
    "senderName": "SENDER",
    "channelType": "WHATSAPP",
    "content": {
      "contentType": "text",
      "text": "Message text",
      "header": {
        "imageUrl": "https://example.com/image.png"
      },
      "footer": {
        "text": "Message footer"
      },
      "buttons": [
        {
          "text": "button text 1",
          "url": "https://revicom.ltd"
        },
        {
          "text": "button text 2",
          "phone": "14085553912"
        }
      ]
    },
    "destination": "14085553911",
    "localSendTime": "2022-06-15 18:00:00",
    "localCompletionTime": "2022-06-16 21:00:00",
    "shortUrl": true,
    "callbackUrl": "https://company.com/callback",
    "callbackEvents": [
      "delivered",
      "read",
      "click"
    ],
    "useLocalTime": true,
    "ttl": 43200,
    "hours": [
      12,
      13,
      14,
      15,
      16,
      17,
      18,
      19
    ],
    "days": [
      1,
      2,
      3,
      4,
      5,
      6,
      7
    ],
    "tags": [
      "tag1",
      "tag2"
    ]
  }
]
```

{% endtab %}

{% tab title="cURL" %}

```
curl -X POST 'https://direct.revicom.ltd/api/v1/message' \
-H 'Content-Type: application/json' \
-H 'Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' \
-d '[{"senderName":"SENDER","channelType":"VIBER","content":{"contentType":"text","text":"message text https://domain.com"},"destination":"7818242882","localSendTime":"2022-06-15 18:00:00","localCompletionTime":"2022-06-16 21:00:00","shortUrl":true,"callbackUrl":"https://company.com/callback","callbackEvents":["delivered","read","click"],"useLocalTime":true,"ttl":43200,"hours":[12,13,14,15,16,17,18,19],"days":[1,2,3,4,5,6,7],"tags":["tag1","tag2"]},{"senderName":"SENDER","channelType":"VIBER","destination":"7818242882","callbackUrl":"https://company.com/callback","callbackEvents":["delivered","read"],"content":{"contentType":"button","text":"message text","caption":"button text","action":"<button link>","imageUrl":"<image link>"},"localSendTime":"2022-06-15 18:00:00","localCompletionTime":"2022-06-16 21:00:00","useLocalTime":true,"ttl":43200,"hours":[12,13,14,15,16,17,18,19],"days":[1,2,3,4,5,6,7],"tags":["tag1","tag2"]},{"senderName":"SENDER","channelType":"VIBER","callbackUrl":"https://company.com/callback","callbackEvents":["delivered","read"],"destination":"7818242882","content":{"contentType":"image","imageUrl":"<image link>"},"localSendTime":"2022-06-15 18:00:00","localCompletionTime":"2022-06-16 21:00:00","useLocalTime":true,"ttl":43200,"hours":[12,13,14,15,16,17,18,19],"days":[1,2,3,4,5,6,7],"tags":["tag1","tag2"]}]'
```

{% endtab %}
{% endtabs %}
