Переезжай на Whapi · от 500 ₽/мес Наш WhatsApp API работает штатно Регистрация
Модерация заявок на вступление · сценарий WhatsApp API

Обрабатывайте заявки на вступление в группы WhatsApp из backend

Платные клубы и закрытые сообщества перестают терять заявителей, когда очереди живут только на телефоне. Когда кто-то запрашивает доступ в группу с одобрением, ваш backend может отреагировать на webhook groups.put, получить список ожидающих заявок и принять или отклонить каждую через Whapi.Cloud. Этот сценарий показывает интеграторам, как реализовать поток через WhatsApp API.

Webhook groups.put с action request GET ожидающих заявок, затем POST или DELETE по id
Ноутбук со схемой интеграции рядом с телефоном: экран администратора группы WhatsApp и короткая очередь ожидающих заявок на вступление.
Сценарий

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

Группа требует одобрения перед входом

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

Правила модерации в вашем backend

Используйте поток, когда own_backend решает, кого пускать (список оплативших, реферальный код, ручной allowlist), и нужен стабильный HTTP-путь вместо копирования действий с телефона.

Вы ведёте несколько групп только по одобрению

Используйте поток, когда заявки копятся в нескольких группах или вне рабочего времени и нужен один шаблон интеграции: список, одобрение, отклонение.

Экран информации о группе WhatsApp на телефоне: заявка обработана — участник в списке или ожидающая заявка исчезла после отклонения.
Опыт клиента

Заявители быстро узнают, приняты они или нет

Без автоматизации заявка может висеть в ожидании, пока кто-то не откроет WhatsApp на телефоне и не нажмёт одобрить или отклонить.

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

Рабочий процесс

От ожидающей заявки к одобрению или отклонению

1

Кто-то запрашивает вступление в группу

Человек переходит по ссылке-приглашению, пока группа в режиме только с одобрением. При включённом webhook канала groups.put Whapi отправляет payload, где groups_participants[].action — request, event.type — groups, event.event — put: сигнал для own_backend получить список заявок и решить, одобрить или отклонить.

2

Список ожидающих заявок на вступление

GET /groups/{GroupID}/applications

GET /groups/{GroupID}/applications для настроенного GroupID. Прочитайте id каждой заявки (и связанные поля) из ответа для следующего шага.

3

Одобрить одну заявку

POST /groups/{GroupID}/applications

Если правила own_backend выполнены, POST /groups/{GroupID}/applications с id заявки в теле запроса. В OpenAPI — один id на вызов: повторяйте, когда заявок несколько.

4

Отклонить одну заявку

DELETE /groups/{GroupID}/applications

Если правила не прошли, DELETE /groups/{GroupID}/applications с тем же форматом id. Один вызов на каждую отклоняемую заявку, отдельно от одобрения.

Нужна полная форма webhook? Callback заявки на вступление описан в разделе доставки ниже — это не ack доставки сообщений. Смотреть payload groups.put →

Предварительные требования

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

Подключите аккаунт WhatsApp, который администрирует группу, к Whapi.Cloud, включите webhook канала groups.put и используйте API-токен этого канала на endpoints заявок группы. Сохраните целевой GroupID и правила модерации в own_backend до обработки заявок.

Опционально — подробнее о потоке

Реализация API

Вызовы заявок группы по порядку

Три HTTP-шага повторяют цепочку каталога: получить очередь, принять разрешённых заявителей, отклонить остальных. Whapi даёт list, approve и reject на одном path заявок группы — модерация без ручных действий админа.

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

Список ожидающих заявок на вступление

Возвращает ожидающие заявки на вступление в группе, чтобы own_backend сопоставил каждую с allowlist или статусом оплаты.

curl --request GET \
     --url https://gate.whapi.cloud/groups/[email protected]/applications \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups/[email protected]/applications",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => [
    "accept: application/json",
    "authorization: Bearer Your_Token"
  ],
]);

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

url = "https://gate.whapi.cloud/groups/[email protected]/applications"
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
}
response = requests.get(url, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/groups/[email protected]/applications', {
  method: 'GET',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
  },
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups/[email protected]/applications")
  .get()
  .addHeader("accept", "application/json")
  .addHeader("authorization", "Bearer Your_Token")
  .build();
Response response = client.newCall(request).execute();
using RestSharp;
var options = new RestClientOptions("https://gate.whapi.cloud/groups/[email protected]/applications");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer Your_Token");
var response = await client.GetAsync(request);
Console.WriteLine("{0}", response.Content);
package main

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

func main() {
	req, _ := http.NewRequest("GET", "https://gate.whapi.cloud/groups/[email protected]/applications", nil)
	req.Header.Set("accept", "application/json")
	req.Header.Set("authorization", "Bearer Your_Token")
	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	out, _ := io.ReadAll(res.Body)
	fmt.Println(string(out))
}

Одобрить одну заявку

Принимает одну ожидающую заявку, чтобы человек мог войти в группу по обычному пути приглашения после успешного одобрения.

curl --request POST \
     --url https://gate.whapi.cloud/groups/[email protected]/applications \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "application": "61371989850@..."
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups/[email protected]/applications",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "{\"application\": \"61371989850@...\"}",
  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/groups/[email protected]/applications"
payload = {
    "application": "61371989850@..."
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json",
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/groups/[email protected]/applications', {
  method: 'POST',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
  "application": "61371989850@..."
}),
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"application\": \"61371989850@...\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups/[email protected]/applications")
  .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/groups/[email protected]/applications");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer Your_Token");
request.AddJsonBody(new { application = "61371989850@..." });
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
package main

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

func main() {
	body := []byte(`{"application": "61371989850@..."}`)
	req, _ := http.NewRequest("POST", "https://gate.whapi.cloud/groups/[email protected]/applications", 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))
}

Отклонить одну заявку

Отклоняет одну ожидающую заявку, чтобы она вышла из очереди без допуска человека.

curl --request DELETE \
     --url https://gate.whapi.cloud/groups/[email protected]/applications \
     --header 'accept: application/json' \
     --header 'authorization: Bearer Your_Token' \
     --header 'content-type: application/json' \
     --data '
{
  "application": "61371989850@..."
}
'
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://gate.whapi.cloud/groups/[email protected]/applications",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "DELETE",
  CURLOPT_POSTFIELDS => "{\"application\": \"61371989850@...\"}",
  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/groups/[email protected]/applications"
payload = {
    "application": "61371989850@..."
}
headers = {
    "accept": "application/json",
    "authorization": "Bearer Your_Token",
    "content-type": "application/json",
}
response = requests.delete(url, json=payload, headers=headers)
print(response.text)
const response = await fetch('https://gate.whapi.cloud/groups/[email protected]/applications', {
  method: 'DELETE',
  headers: {
    accept: 'application/json',
    authorization: 'Bearer Your_Token',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
  "application": "61371989850@..."
}),
});
console.log(await response.text());
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\"application\": \"61371989850@...\"}");
Request request = new Request.Builder()
  .url("https://gate.whapi.cloud/groups/[email protected]/applications")
  .delete(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/groups/[email protected]/applications");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("accept", "application/json");
request.AddHeader("Authorization", "Bearer Your_Token");
request.AddJsonBody(new { application = "61371989850@..." });
var response = await client.DeleteAsync(request);
Console.WriteLine("{0}", response.Content);
package main

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

func main() {
	body := []byte(`{"application": "61371989850@..."}`)
	req, _ := http.NewRequest("DELETE", "https://gate.whapi.cloud/groups/[email protected]/applications", 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))
}
Входящее событие

Заявки на вступление в groups.put

Включите webhook канала для groups.put, чтобы получать события заявок на вступление. Whapi отправляет JSON с groups_participants (у каждого элемента group_id, participants и action), плюс event.type groups, event.event put и channel_id. Когда action — request, кто-то запросил вступление: вызовите getGroupApplicationsList для соответствующего group_id, затем одобрите или отклоните. Это отдельно от отслеживания доставки сообщений statuses.post.

  • Пример формы, подтверждённый оператором: groups_participants с action request, event groups/put и channel_id в том же payload, который Whapi шлёт на ваш URL.

  • Сопоставьте groups_participants[].group_id с GroupID в GET /groups/{GroupID}/applications перед одобрением или отклонением.

  • Id участников в webhook показывают, кто запросил доступ; объединяйте их с ответом списка при заполнении ApplicationRequest.

  • Периодический опрос getGroupApplicationsList по расписанию работает и без webhook — меняется только триггер.

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

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

Ошибки на каждом шаге

Если список заявок или вызовы одобрения и отклонения падают, заявки остаются в ожидании — повторите, пропустите устаревшие id или оповестите ops, а не предполагайте, что человека уже приняли.

Когда заявки не исчезают

Неверный GroupID, отсутствующая группа или повторяющиеся ответы 400 оставляют заявителей в pending. Исправьте path-параметр, убедитесь, что канал всё ещё администрирует группу, и повторите одобрение или отклонение только для актуального id заявки — не считайте, что старый id ещё действителен. Если после повтора ошибки остаются, напишите в поддержку Whapi с GroupID и телом неудачного запроса.

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

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

Статус Что значит Что делать
400 Wrong request parameters Исправьте query-параметры вроде count или offset по OpenAPI перед повтором списка.
404 Specified group not found Убедитесь, что GroupID — группа, которой управляет этот канал; обновите конфигурацию own_backend.
Статус Что значит Что делать
400 Wrong request parameters Передайте корректный id заявки в теле; одобряйте один id на вызов, как в OpenAPI.
404 Specified group not found Получите список снова — id мог быть уже одобрен, отклонён или отозван.
Статус Что значит Что делать
400 Wrong request parameters Приведите тело DELETE к форме OpenAPI и передайте id заявки, которую отклоняете.
404 Specified group not found Запросите очередь снова; заявки может уже не быть на сервере.
Частые вопросы

Заявки на вступление и id заявок

Включите groups.put в webhook канала. Whapi шлёт event.type groups и event.event put с groups_participants, где action — request, group_id — JID группы, participants — id заявителя; затем worker вызывает getGroupApplicationsList и approveGroupApplicationsList или rejectGroupApplicationsList.
В OpenAPI один id заявки на вызов approveGroupApplicationsList и один на rejectGroupApplicationsList. Итерируйте в own_backend, когда ждут несколько человек.
Используйте идентификатор заявки из ответа getGroupApplicationsList (поле application для ApplicationRequest). Если вернулся 404, снова получите список перед повтором — очередь могла измениться.
Действуйте как в failure_mode каталога: группа всё ещё только с одобрением, ссылка-приглашение действительна, вы не отклонили тот же id в другом месте. Оповестите ops, а не оставляйте бесконечные повторы одобрения.
Поддерживаемые функции 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

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