Вау! Создайте интеграцию с WhatsApp. Начните бесплатно. Регистрация
WhatsApp API

Номера, которых нет в WhatsApp, не используются

Лид, которого нет в WhatsApp, не попадает в рассылку и в импорт CRM. Когда список телефонов вот-вот используют, Make или n8n могут проверить номер и остановить следующий шаг через Whapi.Cloud. Этот сценарий показывает интеграторам, как собрать такой поток через WhatsApp API.

Ветка рассылки может отправить текст Ветка импорта ничего не отправляет
Стол со списком телефонов на ноутбуке, чат WhatsApp, который не открылся для номера вне списка, и пустая строка CRM для этого номера.
Декоративный пузырь
Сценарий

Когда использовать этот поток

Список сейчас уйдёт в рассылку или в импорт

Используйте этот поток, когда список из CRM, ERP или другого сервиса сейчас уйдёт в рассылку или в импорт.

Следующий модуль — Make или n8n

Используйте этот поток, когда Make или n8n иначе отправили бы или импортировали номер, которого нет в WhatsApp.

Списку сначала нужна проверка номера

Используйте этот поток, когда номер нужно проверить до использования списка, чтобы номер вне WhatsApp не ушёл в рассылку и не попал в импорт.

Телефон со списком чатов WhatsApp без новой переписки для номера вне рассылки, рядом со списком контактов CRM, где этого номера нет.
Опыт клиента

Лиду не пишут зря

До автоматизации рассылка всё ещё уходит на номера вне WhatsApp, а импорт CRM эти номера сохраняет: лид так и не получает сообщение, и импортированный список оказывается грязным.

После потока человек, которого нет в WhatsApp, не получает рассылку, и этот номер не попадает в импорт CRM. Интеграторы собирают этот результат через WhatsApp API.

Сценарий

Проверьте список, затем отправьте или остановите

1

Список сейчас будут использовать

Список телефонов из CRM, ERP или другого сервиса сейчас уйдёт в рассылку или в импорт в Make или n8n.

2

Проверьте, какие номера есть в WhatsApp

POST /contacts

checkPhones checkPhones проверяет телефоны списка. Передайте эти телефоны в contacts. HTTP 200 возвращает contacts. У каждого элемента есть input и status. У valid также есть wa_id. invalid значит, что номера нет в WhatsApp. Не отправляйте этот номер, не импортируйте его и не вызывайте для него sendMessageText.
{"contacts":[{"input":"15052462002","status":"valid","wa_id":"[email protected]"},{"input":"15058662314","status":"invalid"}]}

3

Отправьте текст в ветке рассылки

POST /messages/text

sendMessageText выполняется только если список — это рассылка и checkPhones вернул для номера status valid. Положите номер в to. Контакт со status invalid до этого шага не доходит. Импорт в CRM останавливается после проверки и не должен вызывать эту отправку.

Нужно отслеживать доставку? Ответ отправки не значит, что человек уже получил текст. Смены статуса приходят после этой отправки. У импорта в CRM нет отправки, которую нужно отслеживать. Про статус доставки →

Перед стартом

Перед запуском потока

Подключите номер WhatsApp, который проверяет список и отправляет текст. Каждый запрос использует API-токен этого номера. Make или n8n остаются в вашем сценарии. Whapi.Cloud делает проверку и, в ветке рассылки, отправку текста.

Необязательно — подробнее об этом потоке

Реализация API

Два вызова для этой проверки

Сначала проверьте телефоны списка. Отправляйте текст только если список — это рассылка и номер есть в WhatsApp. Импорт в CRM останавливается после проверки.

Получите API-токен бесплатно после регистрации на whapi.cloud и подставьте его в код вместо Your_Token из примеров.

Проверьте, какие номера есть в WhatsApp

Прочитайте status каждого номера. Дальше пропускайте только valid. invalid значит, что номера нет в WhatsApp: не отправляйте его и не импортируйте.

curl --request POST \
     --url https://gate.whapi.cloud/contacts \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "contacts": ["15052462002", "15058662314"]
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/contacts",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{  \"contacts\": [\"15052462002\", \"15058662314\"]}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/contacts"
payload = {"contacts": ["15052462002", "15058662314"]}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)
const response = await fetch("https://gate.whapi.cloud/contacts", {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer Your_Token",
    "content-type": "application/json"
  },
  body: JSON.stringify({ contacts: ["15052462002", "15058662314"] })
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{  \"contacts\": [\"15052462002\", \"15058662314\"]}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/contacts")
  .method("POST", body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/contacts");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { contacts = new[] { "15052462002", "15058662314" } });
var response = await client.ExecuteAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{
  "contacts": ["15052462002", "15058662314"]
}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/contacts", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}

Отправьте текст в ветке рассылки

Отправьте текст только номеру, который проверка оставила, и не вызывайте этот метод при импорте в CRM.

curl --request POST \
     --url https://gate.whapi.cloud/messages/text \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "to": "15052462002",
  "body": "Hello"
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/messages/text",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token",
    "content-type: application/json"
  ],
]);

$response = curl_exec($curl);
curl_close($curl);
echo $response;
import requests

url = "https://gate.whapi.cloud/messages/text"
payload = {"to": "15052462002", "body": "Hello"}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json"
}

response = requests.request("POST", url, json=payload, headers=headers)
print(response.text)
const response = await fetch("https://gate.whapi.cloud/messages/text", {
  method: "POST",
  headers: {
    accept: "application/json",
    authorization: "Bearer Your_Token",
    "content-type": "application/json"
  },
  body: JSON.stringify({ to: "15052462002", body: "Hello" })
});

console.log(await response.text());
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{  \"to\": \"15052462002\",  \"body\": \"Hello\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/messages/text")
  .method("POST", body)
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .addHeader("content-type", "application/json")
  .build();

Response response = client.newCall(request).execute();
using RestSharp;

var options = new RestClientOptions("https://gate.whapi.cloud/messages/text");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("authorization", "Bearer Your_Token");
request.AddHeader("content-type", "application/json");
request.AddJsonBody(new { to = "15052462002", body = "Hello" });
var response = await client.ExecuteAsync(request);

Console.WriteLine("{0}", response.Content);
package main

import (
	"bytes"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body := []byte(`{
  "to": "15052462002",
  "body": "Hello"
}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/messages/text", bytes.NewReader(body))
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	req.Header.Set("content-type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}
Доставка

Статус после отправки

Это отслеживание только для текста рассылки. Импорт в CRM ничего не отправляет. Успешный ответ отправки не значит, что получатель уже видит текст. Первый статус до webhook — pending. Дальнейшие смены приходят только в statuses.post и statuses.put. Если статус остаётся pending и не переходит в sent, delivered или более поздний ack, сообщение не доставлено. Проверьте payload и право аккаунта отправлять этот тип.

  • Успешный ответ sendMessageText содержит sent. Это не значит, что человек уже получил текст.

  • Дальнейшие смены ack приходят в statuses.post и statuses.put.

Что читать про доставку и webhooks

Напишите в поддержку, если что-то пошло не так
Когда что-то ломается

Разберите сбои на каждом шаге

Проверка может показать, что номера нет в WhatsApp, а следующий шаг Make или n8n всё равно отправляет сообщение или импортирует номер. Остановите это использование на этом шаге.

Проверка сказала нет, а следующий шаг всё равно выполнился?

Остановите этот шаг Make или n8n. Не отправляйте сообщение и не импортируйте номер. Клиенты часто отмечают, что поддержка отвечает быстро. Не стесняйтесь попросить помощь.

Напишите в поддержку, если что-то пошло не так

Разбор по шагу API

Статус Что это значит Что сделать
200 OK HTTP 200 returns contacts. valid includes wa_id. invalid means the number does not have WhatsApp, so do not mail it, do not import it, and do not call sendMessageText for it. Example: {"contacts":[{"input":"15052462002","status":"valid","wa_id":"[email protected]"},{"input":"15058662314","status":"invalid"}]}.
400 Wrong request parameters
401 Need channel authorization for check phones Authorize the channel before this check.
402 Trial version limit exceeded
429 Too many requests
500 Internal Error
Статус Что это значит Что сделать
200 Created
400 Wrong request parameters
401 Need channel authorization for send message Authorize the channel before this send.
402 Trial version limit exceeded
403 It is forbidden to send to this group/recipient
413 Request body too large
429 Too many requests
500 Internal Error
Вопросы

Вопросы операторов

Нет. Импорт в CRM останавливается после checkPhones и не должен вызывать sendMessageText. Текст уходит только если список — это рассылка и проверка говорит, что номер есть в WhatsApp.
Остановите этот шаг Make или n8n. Не отправляйте сообщение и не импортируйте номер.
Нет. Проверка только говорит, есть ли номер в WhatsApp. Она не фиксирует согласие на рассылку.
Из CRM, ERP или другого сервиса, в Make или n8n. Whapi.Cloud эту систему не читает. Он проверяет переданные телефоны и отправляет текст только в ветке рассылки.
Чтобы номер вне WhatsApp не ушёл в рассылку и не попал в импорт. Проверка — это ворота списка, а не отдельный шаг согласия.
Поддерживаемые функции WhatsApp

Всё, что нужно для создания автоматизации WhatsApp

Whapi.Cloud предоставляет доступ к полному набору функций WhatsApp — сообщениям, медиа, группам, каналам, вебхукам и не только. Создавайте ботов, автоматизации и интеграции без функциональных ограничений.

Выбор разработчиков

Нам доверяют 3 300+ разработчиков и SaaS-команд

Разработчики по всему миру используют Whapi.Cloud для создания автоматизаций, ботов, CRM-интеграций, массовых рассылок и продвинутых WhatsApp-воркфлоу. Наша инфраструктура обрабатывает миллионы API-запросов с высокой стабильностью — и этот показатель растёт каждый месяц.

Иконка функции

5,5K+

активных API-каналов

Иконка функции

21M+

API-запросов в месяц

«Всё просто, интуитивно и легко. Документация понятная, и вся нужная информация всегда под рукой. Отличная работа.»

Roberto K. / Web-разработчик

«Мы подключили WhatsApp к нашим процессам через n8n всего за несколько минут. Без кода, без сложностей — всё заработало с первого раза.»

Martin P. / Разработчик

«Whapi.Cloud стал важной частью нашей коммуникации с клиентами. Мы автоматизировали обновления по продуктам, уведомления о заказах и поддержку — без шаблонов и модерации.»

Oscar T. / CTO

Декоративный пузырь