VK API API

Отрасль: Связь и уведомления. Актуально на 2026-10-24.

API социальной сети ВКонтакте: пользователи, сообщества, стена, сообщения, фотографии, Long Poll для ботов сообществ и ещё несколько сотен методов (в JSON-схеме VK — 569). Методы вызываются по имени вида раздел.операция (например, users.get); ответ — JSON с полем response или error. Здесь собраны основные методы для работы с профилями, сообществами, постами и сообщениями.

Сценарии

Бот сообщества: принимать сообщения через Long Poll

Чат-бот в сообщениях сообщества ВКонтакте без публичного сервера: бот сам забирает новые события.

  1. В настройках сообщества включи сообщения и Bots Long Poll API (Управление → Работа с API), отметь тип события «Входящее сообщение» и создай ключ доступа сообщества с правом на сообщения.
  2. Получи параметры сервера: POST /method/groups.getLongPollServer с group_id и v. В ответе server, key и ts.
  3. В цикле делай запрос к адресу server с act=a_check, key, ts и wait=25. В ответе — новый ts и updates; события входящих сообщений имеют type = message_new.
  4. Ответь пользователю: POST /method/messages.send с peer_id из события, message и random_id — уникальным числом, иначе VK может посчитать сообщение повтором.
  5. Тело запросов — form-urlencoded или multipart, JSON не поддерживается. Параметр v (версия API) обязателен в каждом запросе.
import random, requests

TOKEN, GROUP_ID, V = "<ключ сообщества>", 123456, "5.199"
H = {"Authorization": f"Bearer {TOKEN}"}

def api(method, **params):
    r = requests.post(f"https://api.vk.ru/method/{method}", headers=H, data={**params, "v": V}).json()
    if "error" in r:
        raise RuntimeError(r["error"])
    return r["response"]

lp = api("groups.getLongPollServer", group_id=GROUP_ID)
ts = lp["ts"]
while True:
    resp = requests.get(lp["server"], params={"act": "a_check", "key": lp["key"], "ts": ts, "wait": 25}, timeout=35).json()
    if "failed" in resp:  # ключ устарел — получить новый
        lp = api("groups.getLongPollServer", group_id=GROUP_ID); ts = lp["ts"]; continue
    ts = resp["ts"]
    for u in resp["updates"]:
        if u["type"] == "message_new":
            msg = u["object"]["message"]
            api("messages.send", peer_id=msg["peer_id"], message=f"Вы написали: {msg['text']}", random_id=random.getrandbits(31))

Кнопки в боте сообщества

Клавиатура под полем ввода или под сообщением: «Каталог», «Мой заказ», «Связаться с оператором».

  1. Опиши клавиатуру JSON-объектом: buttons — строки кнопок, у каждой action с type = text, label и payload (по нему бот поймёт, что нажали). inline = true показывает кнопки под сообщением.
  2. Отправь сообщение с клавиатурой: POST /method/messages.send с peer_id, message, random_id и keyboard — JSON-строкой.
  3. Нажатие текстовой кнопки приходит как обычное входящее сообщение message_new — в нём есть payload кнопки.
curl https://api.vk.ru/method/messages.send \
  -H "Authorization: Bearer $VK_GROUP_TOKEN" \
  --data-urlencode 'peer_id=<peer_id>' \
  --data-urlencode "random_id=$RANDOM$RANDOM" \
  --data-urlencode 'message=Чем помочь?' \
  --data-urlencode 'keyboard={"one_time": false, "buttons": [[
      {"action": {"type": "text", "label": "Каталог", "payload": "{\"cmd\": \"catalog\"}"}, "color": "primary"},
      {"action": {"type": "text", "label": "Мой заказ", "payload": "{\"cmd\": \"order\"}"}, "color": "secondary"}
    ]]}' \
  --data-urlencode 'v=5.199'

Опубликовать пост с картинкой в сообществе

Автопостинг: новости, акции, новые товары — на стену сообщества от его имени.

  1. Нужен ключ пользователя — администратора сообщества (wall.post и загрузка фото на стену не работают с ключом сообщества).
  2. Получи адрес загрузки: POST /method/photos.getWallUploadServer с group_id. Загрузи файл на upload_url полем photo в multipart-форме.
  3. Сохрани фото: POST /method/photos.saveWallPhoto с group_id и значениями photo, server и hash из ответа сервера загрузки. В ответе — owner_id и id фото.
  4. Опубликуй пост: POST /method/wall.post с owner_id = -ID сообщества (со знаком минус), from_group = 1, message и attachments = photo_. Для отложенной публикации добавь publish_date в Unix-времени.
UPLOAD=$(curl -s https://api.vk.ru/method/photos.getWallUploadServer -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d group_id=123456 -d v=5.199 | jq -r .response.upload_url)
R=$(curl -s -F "photo=@promo.jpg" "$UPLOAD")

SAVED=$(curl -s https://api.vk.ru/method/photos.saveWallPhoto -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d group_id=123456 -d v=5.199 \
  --data-urlencode "photo=$(echo "$R" | jq -r .photo)" -d "server=$(echo "$R" | jq -r .server)" -d "hash=$(echo "$R" | jq -r .hash)")

curl https://api.vk.ru/method/wall.post -H "Authorization: Bearer $VK_USER_TOKEN" \
  -d owner_id=-123456 -d from_group=1 -d v=5.199 \
  --data-urlencode 'message=Скидка 20% на всё до воскресенья!' \
  -d "attachments=photo$(echo "$SAVED" | jq -r '.response[0].owner_id')_$(echo "$SAVED" | jq -r '.response[0].id')"

Узнать данные пользователя или сообщества по ссылке

По ссылке vk.com/durov или vk.com/club1 получить ID и профиль — для привязки аккаунта, CRM или проверки.

  1. Получи тип и ID объекта по короткому имени: POST /method/utils.resolveScreenName с screen_name (часть ссылки после vk.com/). В ответе type (user, group, application) и object_id.
  2. Для пользователя запроси профиль: POST /method/users.get с user_ids и fields — нужными полями (screen_name, city, photo_100, last_seen и др.).
  3. Для сообщества — POST /method/groups.getById с group_id.
  4. Для таких запросов подходит сервисный ключ приложения — не нужно просить пользователя об авторизации. Профиль может быть приватным — ошибка 30.
curl https://api.vk.ru/method/utils.resolveScreenName -H "Authorization: Bearer $VK_SERVICE_TOKEN" \
  -d screen_name=durov -d v=5.199

curl https://api.vk.ru/method/users.get -H "Authorization: Bearer $VK_SERVICE_TOKEN" \
  -d user_ids=1 -d fields=screen_name,city,photo_100 -d v=5.199

Выгрузить участников сообщества

Список подписчиков для аналитики или сегментации.

  1. Запроси первую тысячу: POST /method/groups.getMembers с group_id, count = 1000 и offset = 0. В ответе count — общее число участников.
  2. Листай с шагом offset += 1000, пока не наберёшь всех.
  3. Для больших сообществ упакуй до 25 вызовов в один запрос: POST /method/execute с кодом на VKScript — так быстрее и не упрёшься в ограничение частоты (ошибка 6).
  4. Если нужны поля участников (город, пол), передай fields — но ответ станет тяжелее.
curl https://api.vk.ru/method/execute -H "Authorization: Bearer $VK_SERVICE_TOKEN" \
  -d v=5.199 \
  --data-urlencode 'code=var i = 0; var res = []; while (i < 25) { res.push(API.groups.getMembers({"group_id": 123456, "count": 1000, "offset": i * 1000}).items); i = i + 1; } return res;'

Базовые URL

Авторизация

Тип: Bearer-токен

Ключ доступа передаётся в каждом запросе в заголовке Authorization: Bearer <КЛЮЧ_ДОСТУПА>. Тип ключа указан у каждого метода: ключ пользователя, ключ сообщества или сервисный ключ приложения.

Ответ:

curl 'https://api.vk.ru/method/users.get' \
  -H 'Authorization: Bearer <КЛЮЧ_ДОСТУПА>' \
  -F 'user_ids=743784474' \
  -F 'fields=bdate' \
  -F 'v=5.131'

Методы

POST /method/users.get — Информация о пользователях

Ключи: пользователя, сообщества, сервисный.

Параметр Где Тип Обяз. Описание
v body string да Версия API
user_ids body array нет ID или короткие имена пользователей, до 1000; по умолчанию — текущий
fields body array нет Доп. поля: screen_name, sex, bdate, city, photo_100, online, last_seen и др.
name_case body string нет Падеж имени: nom (по умолчанию), gen, dat, acc, ins, abl

POST /method/utils.resolveScreenName — Тип и ID объекта по короткому имени

Ключи: пользователя, сообщества, сервисный.

Параметр Где Тип Обяз. Описание
v body string да Версия API
screen_name body string да Короткое имя пользователя, сообщества или приложения

POST /method/groups.getById — Информация о сообществах

Ключи: пользователя, сообщества, сервисный.

Параметр Где Тип Обяз. Описание
v body string да Версия API
group_ids body array нет ID или короткие имена сообществ
group_id body string нет ID или короткое имя одного сообщества
fields body array нет Доп. поля сообщества

POST /method/groups.getMembers — Участники сообщества

Ключи: пользователя, сообщества, сервисный.

Параметр Где Тип Обяз. Описание
v body string да Версия API
group_id body string нет ID или короткое имя сообщества
sort body string нет id_asc (по умолчанию), id_desc, time_asc, time_desc
offset body integer нет Смещение
count body integer нет Количество, по умолчанию и максимум 1000
fields body array нет Доп. поля участников
filter body string нет friends, unsure и др.

POST /method/wall.get — Записи со стены

Ключи: пользователя, сервисный.

Параметр Где Тип Обяз. Описание
v body string да Версия API
owner_id body integer нет ID владельца стены; у сообщества — со знаком минус
domain body string нет Короткий адрес пользователя или сообщества
offset body integer нет Смещение
count body integer нет Число записей, максимум 100
filter body string нет Фильтр записей
extended body boolean нет 1 — вернуть также profiles и groups

POST /method/wall.post — Публикация записи на стене

Ключ: пользователя. Также публикует предложенные и отложенные записи.

Параметр Где Тип Обяз. Описание
v body string да Версия API
owner_id body integer нет ID пользователя или сообщества (со знаком минус)
message body string нет Текст записи; обязателен, если нет attachments
attachments body array нет Вложения _ через запятую; обязательны, если нет message
from_group body boolean нет 1 — публикация от имени сообщества
signed body boolean нет Подписать запись именем автора (для from_group=1)
publish_date body integer нет Дата отложенной публикации, Unix time
friends_only body boolean нет Только для друзей
post_id body integer нет ID отложенной или предложенной записи для публикации
mark_as_ads body boolean нет Пометить как рекламу
close_comments body boolean нет Закрыть комментарии

POST /method/messages.send — Отправка сообщения

Ключи: пользователя, сообщества.

Параметр Где Тип Обяз. Описание
v body string да Версия API
peer_id body integer нет Получатель: ID пользователя; 2000000000 + chat_id для беседы; -ID сообщества
peer_ids body array нет Несколько получателей, до 100
user_id body integer нет ID пользователя
domain body string нет Короткий адрес пользователя
random_id body integer нет Уникальный ID для защиты от повторной отправки
message body string нет Текст; обязателен, если нет attachment
attachment body string нет Вложения _ через запятую; обязательны, если нет message
reply_to body integer нет ID сообщения, на которое отвечаем
forward_messages body array нет ID пересылаемых сообщений через запятую
keyboard body string нет Клавиатура бота (JSON)
payload body string нет Полезная нагрузка
group_id body integer нет ID сообщества (с ключом сообщества)
dont_parse_links body boolean нет Не создавать сниппеты ссылок
disable_mentions body boolean нет Отключить уведомления об упоминаниях

POST /method/groups.getLongPollServer — Данные для подключения к Bots Long Poll

Ключи: пользователя, сообщества. Возвращает данные для запросов к Long Poll серверу событий сообщества.

Параметр Где Тип Обяз. Описание
v body string да Версия API
group_id body integer да ID сообщества

POST /method/photos.getWallUploadServer — Адрес для загрузки фото на стену

Ключ: пользователя. Дальше файл загружается на полученный адрес, затем сохраняется методом photos.saveWallPhoto.

Параметр Где Тип Обяз. Описание
v body string да Версия API
group_id body integer нет ID сообщества, на стену которого загружается фото

POST /method/photos.saveWallPhoto — Сохранение загруженного фото

Ключ: пользователя.

Параметр Где Тип Обяз. Описание
v body string да Версия API
photo body string да Значение photo из ответа сервера загрузки
server body integer нет Значение server из ответа сервера загрузки
hash body string нет Значение hash из ответа сервера загрузки
user_id body integer нет ID пользователя-владельца стены
group_id body integer нет ID сообщества-владельца стены
caption body string нет Описание фото, до 2048 символов

POST /method/execute — Пакетное выполнение кода

Ключи: пользователя, сообщества. Выполняет код, вызывающий несколько методов API за один запрос; ошибка компиляции — код 12.

Нюансы

Ошибки

Код Описание
1 Неизвестная ошибка
3 Неизвестный метод
5 Ошибка авторизации пользователя
6 Слишком много запросов в секунду
7 Нет прав на действие
8 Неверный запрос
9 Flood control
10 Внутренняя ошибка сервера
12 Ошибка компиляции кода (execute)
14 Требуется ввод капчи
15 Доступ запрещён
17 Требуется валидация
18 Пользователь удалён или заблокирован
27 Ошибка авторизации сообщества
28 Ошибка авторизации приложения
29 Достигнут лимит запросов
30 Профиль приватный
36 Выполнение метода прервано по таймауту
42 IP не разрешён

Ограничения

Методы секции secure: до 100 000 пользователей — 8, до 1 000 000 — 20, больше — 35 запросов в секунду. При превышении — ошибка 6.

Источники


Если этого недостаточно — официальная документация: https://dev.vk.com/ru/api/api-requests JSON: https://mcp-everything.ru/api/integrations/vk-api. MCP: https://mcp-everything.ru/mcp