Документация · версия 2.0.0
BUZZ Pay API
Через API ваш сайт или программа сами создают ссылки на оплату, следят за статусом платежа и получают уведомления. Клиент из России платит рублями из приложения своего банка, деньги приходят на баланс кабинета в USDT.
https://buzz-pay.com/api/sub/v1Authorization: Bearer <ключ>multipart/form-data2026-09-19T10:00:00+00:00Как проходит платёж
- КассаПлатёж всегда создаётся на кассе. Список касс и их ID:
GET /points. - Ссылка
POST /ordersс суммой в рублях возвращаетpayment_url. - ОплатаКлиент открывает ссылку, при необходимости проходит проверку и платит из приложения банка.
- СтатусПлатёж переходит в
paid, на ваш сервер приходит вебхукorder.paid. - БалансСумма в USDT видна в
GET /balance. До одобрения проверки клиента она на удержании.
Значения в примерах условные: курсы, суммы, ID и ссылки показывают формат ответа.
Быстрый старт
Первый платёж в песочнице за пять шагов. Нужен только тестовый ключ.
-
Выпустите ключи
В кабинете откройте раздел «API» и нажмите «Выпустить тестовый ключ». Боевой ключ выпускается там же кнопкой «Выпустить ключ». Ключ показывается один раз: сразу сохраните его в переменные окружения сервера.
Если раздела «API» в кабинете нет, напишите в поддержку: доступ к API включает BUZZ Pay.
-
Узнайте ID кассы
curl "https://buzz-pay.com/api/sub/v1/points" \ -H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/points", { headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` }, }); const points = await res.json(); console.log(points[0].id);$ch = curl_init("https://buzz-pay.com/api/sub/v1/points"); curl_setopt_array($ch, [ CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("BUZZPAY_KEY")], CURLOPT_RETURNTRANSFER => true, ]); $points = json_decode(curl_exec($ch), true); echo $points[0]["id"];import os import requests resp = requests.get( "https://buzz-pay.com/api/sub/v1/points", headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"}, ) print(resp.json()[0]["id"]) -
Создайте платёж
Передайте ID кассы и сумму в рублях. В ответе придёт
payment_url: отдайте его клиенту ссылкой, кнопкой или QR-кодом.curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \ -H "Authorization: Bearer $BUZZPAY_KEY" \ -H "Content-Type: application/json" \ -d '{"point_id": 12, "amount_rub": 5000, "description": "Заказ #123"}'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", { method: "POST", headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ point_id: 12, amount_rub: 5000, description: "Заказ #123" }), }); const { order, payment_url } = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => [ "Authorization: Bearer " . getenv("BUZZPAY_KEY"), "Content-Type: application/json", ], CURLOPT_POSTFIELDS => json_encode([ "point_id" => 12, "amount_rub" => 5000, "description" => "Заказ #123", ], JSON_UNESCAPED_UNICODE), CURLOPT_RETURNTRANSFER => true, ]); $data = json_decode(curl_exec($ch), true); $paymentUrl = $data["payment_url"];resp = requests.post( "https://buzz-pay.com/api/sub/v1/orders", headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"}, json={"point_id": 12, "amount_rub": 5000, "description": "Заказ #123"}, ) payment_url = resp.json()["payment_url"]{ "order": { "id": 90000001, "order_number": "BP-TEST-90000001", "status": "pending", "is_test": true, "amount_rub": 5000, "payment_reference": "A1B2C3D4E5F6G7H8" }, "payment_url": "https://buzz-pay.com/pay/A1B2C3D4E5F6G7H8" } -
Оплатите тестовый платёж
В песочнице оплату имитирует отдельный запрос или кнопка «Оплатить» на странице
payment_url. Платёж переходит вpaid, на ваш сервер уходит вебхукorder.paidсis_test: true.curl -X POST "https://buzz-pay.com/api/sub/v1/orders/90000001/simulate-payment" \ -H "Authorization: Bearer $BUZZPAY_KEY" -
Переключитесь на боевой ключ
Код остаётся тем же, меняется только ключ. Перед запуском настройте вебхуки и проверьте, как сайт обрабатывает ошибки.
Ключи и доступ
Каждый запрос передаёт ключ в заголовке Authorization: Bearer <ключ>. Ключей два:
| Ключ | Что делает |
|---|---|
| Боевой | Настоящие платежи и деньги. |
| Тестовый | Песочница: платежи создаются для проверки, деньги не двигаются. В начале ключа стоит пометка test. |
Оба ключа выпускаются в разделе «API» кабинета и показываются один раз.
Если доступа нет
| Ответ | Что значит |
|---|---|
401 unauthorized | Ключа нет в запросе, он неверен или отозван. |
403 api_disabled | API для кабинета выключен. |
403 scope_disabled | Нужный раздел API не включён. |
Доступ к API и его разделам включает BUZZ Pay. Напишите в поддержку, какие разделы нужны.
curl "https://buzz-pay.com/api/sub/v1/balance" \
-H "Authorization: Bearer $BUZZPAY_KEY"Песочница
С тестовым ключом можно пройти весь путь платежа, не трогая деньги. Тестовые платежи получают is_test: true, ID от 90 000 000 и номер с пометкой TEST. В кабинете их не видно, через 48 часов они удаляются.
| Действие | С тестовым ключом |
|---|---|
Создать платёж POST /orders | Создаётся в песочнице. |
Найти платёж GET /orders, /orders/{id}, /by-reference, /by-external-id | Видны только тестовые платежи. В списке работает только фильтр status. |
| Оплатить | POST /orders/{id}/simulate-payment или кнопка «Оплатить» на странице payment_url. |
| Курсы, баланс, кассы, клиенты | Читаются настоящие данные кабинета. |
| Создать или изменить кассу | Нельзя: 403 test_mode_readonly. |
| Загрузить документы | Файлы не сохраняются, kyc_status сразу approved. |
Привязать клиента attach-client | Недоступно: 404. |
Статус проверки GET /orders/{id}/kyc | Для тестовых платежей всегда 404. |
Симуляция оплаты с боевым ключом вернёт 403 test_key_required.
Проверка клиента
У каждого платежа есть тип проверки kyc_type и её статус kyc_status. Пока проверка не одобрена, деньги по платежу на удержании: это штатно.
pendingждёт клиента или документы
submittedна проверке
approvedодобрено
rejectedотклонено
Три сценария
| Сценарий | Как проходит |
|---|---|
kyc_type=unverifiedпо умолчанию | Вы ничего не загружаете. Клиент открывает payment_url и проходит проверку по документу прямо на странице оплаты. После одобрения появляется QR для оплаты. |
kyc_type=verified | Документы загружаете вы: сразу в POST /orders как multipart/form-data или позже через /documents. |
| Повторный клиент | Передайте client_external_id или client_phone клиента, у которого документы уже одобрены. Платёж привяжется к нему, файлы не нужны. Проверить заранее: GET /clients/{key} со статусом verified. |
Если касса настроена без обязательной проверки, платёж создаётся сразу с kyc_status=approved.
Документы при создании платежа
| Поле | Что передать |
|---|---|
passport_type | ru для паспорта РФ, other для иностранного |
file_document | разворот паспорта, до 10 МБ |
file_selfie | селфи с паспортом |
file_address | страница с пропиской, для passport_type=ru |
client_address | адрес регистрации текстом, для passport_type=other |
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-F "point_id=12" \
-F "amount_rub=5000" \
-F "kyc_type=verified" \
-F "client_external_id=user-777" \
-F "passport_type=ru" \
-F "file_document=@passport.jpg" \
-F "file_selfie=@selfie.jpg" \
-F "file_address=@registration.jpg"resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
data={
"point_id": "12",
"amount_rub": "5000",
"kyc_type": "verified",
"client_external_id": "user-777",
"passport_type": "ru",
},
files={
"file_document": open("passport.jpg", "rb"),
"file_selfie": open("selfie.jpg", "rb"),
"file_address": open("registration.jpg", "rb"),
},
)Следующие платежи этого клиента создаются по client_external_id без файлов. Уже созданный платёж можно привязать к проверенному клиенту: attach-client.
Узнать статус: GET /orders/{id}/kyc или вебхук order.kyc_status_changed.
Вебхуки
Когда с платежом что-то происходит, BUZZ Pay отправляет POST на ваш HTTPS-адрес.
Настройка
- В разделе «API» кабинета укажите «URL для уведомлений» (только HTTPS).
- Нажмите «Выпустить секрет»: им подписываются уведомления. Сохраните его на сервере рядом с ключом.
- Включите «Отправлять» и нажмите «Сохранить».
- «Отправить тест» пришлёт событие
order.test: так проверяется приём.
События
| Событие | Когда |
|---|---|
order.created | платёж создан |
order.processing | оплата в обработке |
order.paid | платёж оплачен |
order.cancelled | платёж отменён |
order.expired | срок платежа истёк |
order.kyc_status_changed | изменился статус проверки клиента |
order.test | тест из кабинета |
Что приходит
POST /ваш/адрес
Content-Type: application/json
X-Webhook-Event: order.paid
X-Webhook-Id: …
X-Webhook-Timestamp: …
X-Webhook-Signature: sha256=…
{"event": "order.paid", "timestamp": …, "is_test": false, "order": {…}}В order лежит тот же объект платежа, что отдаёт GET /orders/{id}. У событий песочницы is_test: true.
Проверка подписи
Подпись в X-Webhook-Signature: sha256= и HMAC-SHA256 с вашим секретом от строки X-Webhook-Timestamp + "." + тело. Тело берите сырым, до разбора JSON: после повторной сериализации подпись не сойдётся.
import crypto from "node:crypto";
import express from "express";
const app = express();
const SECRET = process.env.BUZZPAY_WEBHOOK_SECRET;
// express.raw оставляет тело сырым: подпись считается от него
app.post("/buzzpay/webhook", express.raw({ type: "application/json" }), (req, res) => {
const timestamp = req.get("X-Webhook-Timestamp") ?? "";
const body = req.body.toString("utf8");
const expected = "sha256=" + crypto
.createHmac("sha256", SECRET)
.update(timestamp + "." + body)
.digest("hex");
const got = req.get("X-Webhook-Signature") ?? "";
const ok = got.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(got), Buffer.from(expected));
if (!ok) return res.sendStatus(401);
const event = JSON.parse(body);
// event.event, event.order.id, event.order.status
res.sendStatus(200);
});<?php
$secret = getenv("BUZZPAY_WEBHOOK_SECRET");
$body = file_get_contents("php://input");
$timestamp = $_SERVER["HTTP_X_WEBHOOK_TIMESTAMP"] ?? "";
$expected = "sha256=" . hash_hmac("sha256", $timestamp . "." . $body, $secret);
$got = $_SERVER["HTTP_X_WEBHOOK_SIGNATURE"] ?? "";
if (!hash_equals($expected, $got)) {
http_response_code(401);
exit;
}
$event = json_decode($body, true);
// $event["event"], $event["order"]["id"], $event["order"]["status"]
http_response_code(200);import hashlib
import hmac
import os
from flask import Flask, request
app = Flask(__name__)
SECRET = os.environ["BUZZPAY_WEBHOOK_SECRET"].encode()
@app.post("/buzzpay/webhook")
def buzzpay_webhook():
body = request.get_data() # сырое тело
timestamp = request.headers.get("X-Webhook-Timestamp", "")
digest = hmac.new(SECRET, timestamp.encode() + b"." + body, hashlib.sha256).hexdigest()
expected = "sha256=" + digest
got = request.headers.get("X-Webhook-Signature", "")
if not hmac.compare_digest(expected, got):
return "", 401
event = request.get_json()
# event["event"], event["order"]["id"], event["order"]["status"]
return "", 200Ответ и повторы
- Ответьте любым кодом 2xx за 8 секунд. Долгую обработку делайте после ответа, в фоне.
- Без ответа 2xx уведомление повторится через 1, 5 и 30 минут, через 2 и 12 часов.
- Одно событие может прийти дважды: отсеивайте повторы по
X-Webhook-Id. - Сверяйте
X-Webhook-Timestampсо своим временем и отбрасывайте слишком старые запросы. - Перед выдачей товара можно перепроверить статус запросом
GET /orders/{id}.
Ошибки и лимиты
При ошибке API отвечает кодом HTTP и JSON с машинным кодом в error. Текст в message бывает на английском: решения в коде принимайте по error.
{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": ["The amount rub field is required."]
}
}| HTTP | error | Что делать |
|---|---|---|
| 401 | unauthorized | Проверьте ключ: его нет в запросе, он неверен или отозван. |
| 403 | api_disabled, scope_disabled | API или раздел не включён. Напишите в поддержку. |
| 403 | test_key_required | Запрос только для песочницы, нужен тестовый ключ. |
| 403 | test_mode_readonly | С тестовым ключом это действие недоступно, нужен боевой. |
| 404 | not_found | Объекта нет или он из другого кабинета. |
| 422 | validation_failed | Ошибка в полях, подробности по каждому полю в errors. |
| 429 | too_many_requests | Больше 120 запросов в минуту. Сделайте паузу и повторите. |
| 502 | upstream_error | Временный сбой. Повторите позже, увеличивая паузу. |
Если ошибка повторяется, проверьте страницу статуса и напишите в поддержку: приложите время запроса и ответ.
Справочник API · версия 2.0.0
Методы
Базовый адрес https://buzz-pay.com/api/sub/v1. У каждого метода примеры на cURL, Node.js, PHP и Python, язык переключается сразу во всех блоках.
Объект «Платёж»
Платёж в ответах методов раздела «Платежи»: какие поля приходят и что значит статус.
| Поле | Описание |
|---|---|
idinteger | ID платежа |
order_numberstring | Номер платежа, как в кабинете |
statusstring | Статус платежа, см. ниже |
is_testboolean | Только у заказов песочницы |
amount_rubnumber | Сумма в ₽ |
amount_usdtnumber · null | Сумма в USDT |
rate_usdtnumber · null | Курс ₽ за USDT по платежу |
payment_referencestring | Код из ссылки на оплату |
client_namestring · null | Комментарий (PATCH /orders/{id}) |
client_external_idstring · null | Ваш ID клиента |
kyc_typestring · null | Тип проверки клиента |
kyc_statusstring · null | Статус проверки клиента |
pointobject | Касса |
created_atstring · date-time | Когда создан |
custom_fieldsarray of object | Ответы на дополнительные поля кассы |
Статусы
| Статус | Что значит |
|---|---|
pending | Создан, ждёт оплаты |
processing | Оплата в обработке |
paid | Оплачен |
cancelled | Отменён |
expired | Срок оплаты истёк |
{
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
}Курсы и справочники
Текущий курс
/ratesКурс с учётом вашей наценки — тот же, что в кабинете. Обновляется примерно раз в 30 секунд.
Если для кабинета включены тарифы по типам трафика, в ответе появляются traffic_tariffs_enabled: true и rates_by_traffic_type — курс для каждого типа (default — для касс без отдельного тарифа). Курс конкретной кассы: GET /rates?point_id=<id> — rub_per_usdt вернётся уже по тарифу этой кассы. Без point_id rub_per_usdt — базовый тариф.
Параметры
| Параметр | Где | Описание |
|---|---|---|
point_idinteger | в запросе | ID кассы — курс по её тарифу (при мультитарифе). |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/rates" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/rates", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/rates");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/rates",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"rub_per_usdt": 88.4136,
"updated_at": "2026-09-19T10:00:00+00:00",
"local_rates": {
"THB": {
"symbol": "฿",
"per_usdt": 32.4041,
"rub_per_unit": 2.724653,
"units_per_rub": 0.367
}
},
"traffic_tariffs_enabled": true,
"rates_by_traffic_type": {
"default": {
"rub_per_usdt": 88.4136
},
"exchange": {
"rub_per_usdt": 90.46
}
}
}Локальные валюты
/currenciesСписок валют, доступных для касс.
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/currencies" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/currencies", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/currencies");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/currencies",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json()[
{
"code": "USDT",
"name": "Tether USD",
"symbol": "$",
"decimals": 2
},
{
"code": "THB",
"name": "Thai Baht",
"symbol": "฿",
"decimals": 2
}
]Типы трафика
/traffic-typesСправочник типов трафика для создания касс.
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/traffic-types" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/traffic-types", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/traffic-types");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/traffic-types",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json()[
{
"key": "exchange",
"label": "Обмен валюты"
}
]Возможности кабинета
/capabilitiesКакие функции включены для кабинета.
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/capabilities" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/capabilities", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/capabilities");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/capabilities",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"allow_permanent_link": true,
"allow_offline_points": true
}Баланс и история
Баланс
/balanceБаланс кабинета в USDT: available — доступно к выводу, hold — на удержании (hold_kyc, hold_release, hold_payouts).
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/balance" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/balance", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/balance");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/balance",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"balances": {
"usdt": {
"available": 1250.5,
"hold": 120,
"hold_payouts": 0,
"hold_refunds": 0,
"hold_kyc": 20,
"hold_release": 100
}
}
}История баланса
/balance-historyДвижения баланса: зачисления, холды, выплаты.
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/balance-history" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/balance-history", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/balance-history");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/balance-history",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"data": [
{
"id": 1,
"date": "2026-09-19T10:05:00+00:00",
"type": "credit_order",
"amount": 56.55,
"currency": "USDT",
"balance_after": 1307.05,
"note": "BP-004210"
}
],
"source": "ledger"
}Кассы
Список касс
/pointsВсе кассы вашего кабинета с настройками.
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/points" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/points", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/points",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json()[
{
"id": 12,
"name": "Основная",
"account": "USDT",
"comission": 0,
"is_active": true,
"permanent_link": true,
"payment_reference": "Z9X8C7V6B5N4M3L2",
"custom_fields": [
{
"key": "purpose",
"label": "Назначение",
"type": "select",
"options": [
"Аренда",
"Депозит"
],
"required": true,
"to_comment": true
}
]
}
]Создать кассу
/pointsНовая касса сразу привязывается к вашему кабинету. Тестовым ключом недоступно (403 test_mode_readonly).
Тело запроса application/json
| Поле | Описание |
|---|---|
name обязательноеstring | Название кассы |
accountstring | По умолчанию "USDT" |
comissionnumber | — |
permanent_linkboolean | Касса с постоянной ссылкой (POST /points/{id}/order) |
require_nameboolean | Спрашивать имя плательщика |
require_emailboolean | Спрашивать email плательщика |
fixed_amount_rubnumber | Фиксированная сумма в ₽ |
kyc_modestring | Проверка клиента на кассе Значения: verified, unverified |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/points" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "name": "Касса сайта", "account": "USDT", "permanent_link": true }'const res = await fetch("https://buzz-pay.com/api/sub/v1/points", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ name: "Касса сайта", account: "USDT", permanent_link: true }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"name" => "Касса сайта",
"account" => "USDT",
"permanent_link" => true,
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/points",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"name": "Касса сайта",
"account": "USDT",
"permanent_link": True,
},
)
data = resp.json(){
"id": 13,
"name": "Касса сайта",
"account": "USDT",
"is_active": true,
"permanent_link": true,
"payment_reference": "Q1W2E3R4T5Y6U7I8"
}Касса по ID
/points/{id}Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID кассы |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/points/12" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/points/12", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points/12");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/points/12",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"id": 12,
"name": "Основная",
"account": "USDT",
"comission": 0,
"is_active": true
}Обновить кассу
/points/{id}Передайте только поля, которые нужно изменить. PATCH работает так же. Тестовым ключом недоступно.
Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID кассы |
Тело запроса application/json
| Поле | Описание |
|---|---|
namestring | Название кассы |
is_activeboolean | Касса включена |
comissionnumber | — |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X PUT "https://buzz-pay.com/api/sub/v1/points/12" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "is_active": false }'const res = await fetch("https://buzz-pay.com/api/sub/v1/points/12", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ is_active: false }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points/12");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["is_active" => false], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.put(
"https://buzz-pay.com/api/sub/v1/points/12",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={"is_active": False},
)
data = resp.json(){
"id": 13,
"name": "Касса сайта",
"is_active": false
}Платежи
Создать платёж
/ordersСоздаёт платёж на кассе и возвращает payment_url — ссылку на страницу оплаты для клиента.
KYC. kyc_type=unverified (по умолчанию) — клиент проходит проверку сам на странице оплаты. kyc_type=verified — документы загружаете вы: multipart/form-data с file_document, file_selfie, file_address (см. примеры с файлами), либо позже через /orders/by-reference/{reference}/documents. Передайте client_external_id (или client_phone) — и для следующих платежей этого клиента файлы не нужны. Подробнее — руководство «Проверка клиента».
Тестовым ключом заказ создаётся в песочнице (is_test: true) и оплачивается через simulate-payment.
Тело запроса application/json
| Поле | Описание |
|---|---|
point_id обязательноеinteger | ID кассы (GET /points) |
amount_rub обязательноеnumber | Сумма в ₽ |
descriptionstring | Назначение платежа |
client_namestring | Имя клиента для отчётности |
client_external_idstring | Ваш ID клиента — ключ клиента базы; документы нужны только при первом платеже |
client_phonestring | Телефон клиента — альтернативный ключ клиента базы |
kyc_typestring | unverified — клиент проходит проверку сам на странице оплаты (по умолчанию); verified — документы загружаете вы Значения: unverified, verified |
passport_typestring | Для verified: ru — паспорт РФ (нужна страница с пропиской), other — иностранный (адрес текстом) Значения: ru, other |
client_addressstring | Адрес регистрации для passport_type=other |
customobject | Ответы на дополнительные поля кассы {ключ: значение}; конфиг полей — в GET /points (custom_fields). Обязательные поля проверяются, значения попадают в заказ как custom_fields |
С файлами multipart/form-data
Те же поля, что в JSON, и файлы документов:
| Поле | Описание |
|---|---|
file_documentфайл | Разворот паспорта (до 10 МБ) |
file_selfieфайл | Селфи с паспортом |
file_addressфайл | Страница с пропиской |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "point_id": 12, "amount_rub": 5000 }'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ point_id: 12, amount_rub: 5000 }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["point_id" => 12, "amount_rub" => 5000], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={"point_id": 12, "amount_rub": 5000},
)
data = resp.json()unverified: клиент проходит KYC на странице оплаты
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"point_id": 12,
"amount_rub": 5000,
"kyc_type": "unverified",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"description": "Заказ #123"
}'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
point_id: 12,
amount_rub: 5000,
kyc_type: "unverified",
client_name: "Иван Петров",
client_external_id: "user-777",
description: "Заказ #123",
}),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"point_id" => 12,
"amount_rub" => 5000,
"kyc_type" => "unverified",
"client_name" => "Иван Петров",
"client_external_id" => "user-777",
"description" => "Заказ #123",
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"point_id": 12,
"amount_rub": 5000,
"kyc_type": "unverified",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"description": "Заказ #123",
},
)
data = resp.json()verified: повторный клиент (документы уже одобрены, файлы не нужны)
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"point_id": 12,
"amount_rub": 3000,
"kyc_type": "verified",
"client_external_id": "user-777"
}'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
point_id: 12,
amount_rub: 3000,
kyc_type: "verified",
client_external_id: "user-777",
}),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"point_id" => 12,
"amount_rub" => 3000,
"kyc_type" => "verified",
"client_external_id" => "user-777",
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"point_id": 12,
"amount_rub": 3000,
"kyc_type": "verified",
"client_external_id": "user-777",
},
)
data = resp.json()verified: клиент по телефону
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"point_id": 12,
"amount_rub": 3000,
"kyc_type": "verified",
"client_phone": "+79001234567",
"client_name": "Иван Петров"
}'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
point_id: 12,
amount_rub: 3000,
kyc_type: "verified",
client_phone: "+79001234567",
client_name: "Иван Петров",
}),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"point_id" => 12,
"amount_rub" => 3000,
"kyc_type" => "verified",
"client_phone" => "+79001234567",
"client_name" => "Иван Петров",
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"point_id": 12,
"amount_rub": 3000,
"kyc_type": "verified",
"client_phone": "+79001234567",
"client_name": "Иван Петров",
},
)
data = resp.json()verified: паспорт РФ + документы (первый платёж клиента)
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-F "point_id=12" \
-F "amount_rub=5000" \
-F "kyc_type=verified" \
-F "client_external_id=user-777" \
-F "client_name=Иван Петров" \
-F "passport_type=ru" \
-F "file_document=@passport.jpg" \
-F "file_selfie=@selfie.jpg" \
-F "file_address=@registration.jpg"import { openAsBlob } from "node:fs"; // Node.js 20+
const form = new FormData();
form.append("point_id", "12");
form.append("amount_rub", "5000");
form.append("kyc_type", "verified");
form.append("client_external_id", "user-777");
form.append("client_name", "Иван Петров");
form.append("passport_type", "ru");
form.append("file_document", await openAsBlob("passport.jpg"), "passport.jpg");
form.append("file_selfie", await openAsBlob("selfie.jpg"), "selfie.jpg");
form.append("file_address", await openAsBlob("registration.jpg"), "registration.jpg");
const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
body: form,
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_POSTFIELDS => [
"point_id" => 12,
"amount_rub" => 5000,
"kyc_type" => "verified",
"client_external_id" => "user-777",
"client_name" => "Иван Петров",
"passport_type" => "ru",
"file_document" => new CURLFile("passport.jpg"),
"file_selfie" => new CURLFile("selfie.jpg"),
"file_address" => new CURLFile("registration.jpg"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
data={
"point_id": 12,
"amount_rub": 5000,
"kyc_type": "verified",
"client_external_id": "user-777",
"client_name": "Иван Петров",
"passport_type": "ru",
},
files={
"file_document": open("passport.jpg", "rb"),
"file_selfie": open("selfie.jpg", "rb"),
"file_address": open("registration.jpg", "rb"),
},
)
data = resp.json()verified: иностранный паспорт + адрес текстом
curl -X POST "https://buzz-pay.com/api/sub/v1/orders" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-F "point_id=12" \
-F "amount_rub=5000" \
-F "kyc_type=verified" \
-F "client_external_id=user-778" \
-F "client_name=John Smith" \
-F "passport_type=other" \
-F "client_address=Bangkok, Sukhumvit 21, 5/12" \
-F "file_document=@passport.jpg" \
-F "file_selfie=@selfie.jpg"import { openAsBlob } from "node:fs"; // Node.js 20+
const form = new FormData();
form.append("point_id", "12");
form.append("amount_rub", "5000");
form.append("kyc_type", "verified");
form.append("client_external_id", "user-778");
form.append("client_name", "John Smith");
form.append("passport_type", "other");
form.append("client_address", "Bangkok, Sukhumvit 21, 5/12");
form.append("file_document", await openAsBlob("passport.jpg"), "passport.jpg");
form.append("file_selfie", await openAsBlob("selfie.jpg"), "selfie.jpg");
const res = await fetch("https://buzz-pay.com/api/sub/v1/orders", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
body: form,
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_POSTFIELDS => [
"point_id" => 12,
"amount_rub" => 5000,
"kyc_type" => "verified",
"client_external_id" => "user-778",
"client_name" => "John Smith",
"passport_type" => "other",
"client_address" => "Bangkok, Sukhumvit 21, 5/12",
"file_document" => new CURLFile("passport.jpg"),
"file_selfie" => new CURLFile("selfie.jpg"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
data={
"point_id": 12,
"amount_rub": 5000,
"kyc_type": "verified",
"client_external_id": "user-778",
"client_name": "John Smith",
"passport_type": "other",
"client_address": "Bangkok, Sukhumvit 21, 5/12",
},
files={
"file_document": open("passport.jpg", "rb"),
"file_selfie": open("selfie.jpg", "rb"),
},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
},
"payment_url": "https://buzz-pay.com/pay/A1B2C3D4E5F6G7H8"
}Список платежей
/ordersПлатежи ваших касс, новые первыми. pagination.total считается до фильтрации по кассам и может быть больше фактического — листайте, пока data не станет пустым. Тестовым ключом — заказы песочницы (фильтр только status).
Параметры
| Параметр | Где | Описание |
|---|---|---|
pageinteger | в запросе | Страница (по умолчанию 1) |
per_pageinteger | в запросе | Записей на странице (по умолчанию 20, макс. 100) |
statusstring | в запросе | pending | processing | paid | cancelled | expired Значения: pending, processing, paid, cancelled, expired |
fromstring | в запросе | Начало периода YYYY-MM-DD |
tostring | в запросе | Конец периода YYYY-MM-DD |
point_idinteger | в запросе | Фильтр по кассе |
searchstring | в запросе | Поиск по номеру / клиенту |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/orders?status=paid&per_page=50" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders?status=paid&per_page=50", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders?status=paid&per_page=50");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/orders?status=paid&per_page=50",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"data": [
{
"id": 4210,
"order_number": "BP-004210",
"status": "paid",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
],
"pagination": {
"current_page": 1,
"last_page": 1,
"total": 1
}
}Платёж по ID
/orders/{id}Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID платежа |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/orders/4210" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/4210", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/4210");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/orders/4210",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
}Комментарий к платежу
/orders/{id}Задаёт client_name — комментарий, видимый в кабинете в колонке «Комментарий». Пустая строка очищает.
Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID платежа |
Тело запроса application/json
| Поле | Описание |
|---|---|
client_name обязательноеstring · null | Комментарий; пустая строка очищает |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X PATCH "https://buzz-pay.com/api/sub/v1/orders/4210" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "client_name": "Заказ #123, Иван Петров" }'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/4210", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ client_name: "Заказ #123, Иван Петров" }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/4210");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["client_name" => "Заказ #123, Иван Петров"], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.patch(
"https://buzz-pay.com/api/sub/v1/orders/4210",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={"client_name": "Заказ #123, Иван Петров"},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Заказ #123, Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
}Платёж по reference
/orders/by-reference/{reference}Поиск по payment_reference из ссылки на оплату.
Параметры
| Параметр | Где | Описание |
|---|---|---|
reference обязательныйstring | в пути | payment_reference |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
}Платёж по вашему ID
/orders/by-external-id/{externalId}Поиск по client_external_id, переданному при создании.
Параметры
| Параметр | Где | Описание |
|---|---|---|
externalId обязательныйstring | в пути | Ваш идентификатор клиента |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/orders/by-external-id/user-777" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/by-external-id/user-777", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/by-external-id/user-777");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/orders/by-external-id/user-777",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
}
}Платёж по постоянной ссылке
/points/{id}/orderДля касс с permanent_link: создаёт платёж с заранее заданной суммой и данными плательщика, отдаёт payment_url.
Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID кассы с постоянной ссылкой |
Тело запроса application/json
| Поле | Описание |
|---|---|
amount_rubnumber | Сумма в ₽ |
first_namestring | Имя плательщика |
last_namestring | Фамилия плательщика |
emailstring | Email плательщика |
client_external_idstring | Ваш ID клиента |
customobject | Ответы на дополнительные поля кассы {ключ: значение} |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/points/12/order" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "amount_rub": 1500 }'const res = await fetch("https://buzz-pay.com/api/sub/v1/points/12/order", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ amount_rub: 1500 }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points/12/order");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["amount_rub" => 1500], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/points/12/order",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={"amount_rub": 1500},
)
data = resp.json()Сумма + данные плательщика
curl -X POST "https://buzz-pay.com/api/sub/v1/points/12/order" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount_rub": 1500,
"first_name": "Иван",
"last_name": "Петров",
"email": "ivan@example.com"
}'const res = await fetch("https://buzz-pay.com/api/sub/v1/points/12/order", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
amount_rub: 1500,
first_name: "Иван",
last_name: "Петров",
email: "ivan@example.com",
}),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points/12/order");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"amount_rub" => 1500,
"first_name" => "Иван",
"last_name" => "Петров",
"email" => "ivan@example.com",
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/points/12/order",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"amount_rub": 1500,
"first_name": "Иван",
"last_name": "Петров",
"email": "ivan@example.com",
},
)
data = resp.json()curl -X POST "https://buzz-pay.com/api/sub/v1/points/12/order" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{
"amount_rub": 1500,
"first_name": "Иван",
"last_name": "Петров",
"client_external_id": "user-777"
}'const res = await fetch("https://buzz-pay.com/api/sub/v1/points/12/order", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
amount_rub: 1500,
first_name: "Иван",
last_name: "Петров",
client_external_id: "user-777",
}),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/points/12/order");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"amount_rub" => 1500,
"first_name" => "Иван",
"last_name" => "Петров",
"client_external_id" => "user-777",
], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/points/12/order",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={
"amount_rub": 1500,
"first_name": "Иван",
"last_name": "Петров",
"client_external_id": "user-777",
},
)
data = resp.json(){
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 1500,
"amount_usdt": 16.97,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "unverified",
"kyc_status": "pending",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00"
},
"payment_url": "https://buzz-pay.com/pay/A1B2C3D4E5F6G7H8"
}Проверка клиента (KYC)
Статус KYC платежа
/orders/{id}/kyckyc_status: pending (ждёт клиента или документы), submitted (на проверке), approved, rejected. Для тестовых заказов всегда 404.
Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID платежа |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/orders/4210/kyc" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/4210/kyc", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/4210/kyc");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/orders/4210/kyc",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"kyc_type": "verified",
"kyc_status": "approved",
"client": {
"first_name": "Иван",
"last_name": "Петров",
"status": "verified"
}
}Дозагрузить документы к платежу
/orders/by-reference/{reference}/documentsmultipart/form-data, хотя бы один файл обязателен. В ответе verified_kyc_status — фактический статус после загрузки. Передайте client_phone/client_name, чтобы документы привязались к клиенту базы. В песочнице файлы не сохраняются, kyc_status сразу approved.
Параметры
| Параметр | Где | Описание |
|---|---|---|
reference обязательныйstring | в пути | payment_reference платежа |
Тело запроса multipart/form-data
| Поле | Описание |
|---|---|
file_documentфайл | Разворот паспорта (до 10 МБ) |
file_selfieфайл | Селфи с паспортом |
file_addressфайл | Страница с пропиской |
client_namestring | Имя клиента |
client_phonestring | Телефон клиента: привязывает документы к клиенту базы |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-F "client_name=Иван Петров" \
-F "file_document=@passport.jpg" \
-F "file_selfie=@selfie.jpg" \
-F "file_address=@registration.jpg"import { openAsBlob } from "node:fs"; // Node.js 20+
const form = new FormData();
form.append("client_name", "Иван Петров");
form.append("file_document", await openAsBlob("passport.jpg"), "passport.jpg");
form.append("file_selfie", await openAsBlob("selfie.jpg"), "selfie.jpg");
form.append("file_address", await openAsBlob("registration.jpg"), "registration.jpg");
const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
body: form,
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_POSTFIELDS => [
"client_name" => "Иван Петров",
"file_document" => new CURLFile("passport.jpg"),
"file_selfie" => new CURLFile("selfie.jpg"),
"file_address" => new CURLFile("registration.jpg"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
data={"client_name": "Иван Петров"},
files={
"file_document": open("passport.jpg", "rb"),
"file_selfie": open("selfie.jpg", "rb"),
"file_address": open("registration.jpg", "rb"),
},
)
data = resp.json()Документы + привязка к клиенту базы по телефону
curl -X POST "https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-F "client_name=Иван Петров" \
-F "client_phone=+79001234567" \
-F "file_document=@passport.jpg" \
-F "file_selfie=@selfie.jpg" \
-F "file_address=@registration.jpg"import { openAsBlob } from "node:fs"; // Node.js 20+
const form = new FormData();
form.append("client_name", "Иван Петров");
form.append("client_phone", "+79001234567");
form.append("file_document", await openAsBlob("passport.jpg"), "passport.jpg");
form.append("file_selfie", await openAsBlob("selfie.jpg"), "selfie.jpg");
form.append("file_address", await openAsBlob("registration.jpg"), "registration.jpg");
const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
body: form,
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_POSTFIELDS => [
"client_name" => "Иван Петров",
"client_phone" => "+79001234567",
"file_document" => new CURLFile("passport.jpg"),
"file_selfie" => new CURLFile("selfie.jpg"),
"file_address" => new CURLFile("registration.jpg"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/documents",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
data={"client_name": "Иван Петров", "client_phone": "+79001234567"},
files={
"file_document": open("passport.jpg", "rb"),
"file_selfie": open("selfie.jpg", "rb"),
"file_address": open("registration.jpg", "rb"),
},
)
data = resp.json(){
"message": "Документы загружены",
"verified_kyc_status": "submitted",
"verified_client_id": 91
}Привязать клиента базы к платежу
/orders/by-reference/{reference}/attach-clientПривязывает уже проверенного клиента (id из GET /clients) без повторной загрузки документов. В песочнице недоступно (404).
Параметры
| Параметр | Где | Описание |
|---|---|---|
reference обязательныйstring | в пути | payment_reference платежа |
Тело запроса application/json
| Поле | Описание |
|---|---|
client_id обязательноеinteger | ID клиента из GET /clients |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
422validation_failed | Ошибка валидации |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "validation_failed",
"message": "The amount rub field is required.",
"errors": {
"amount_rub": [
"The amount rub field is required."
]
}
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/attach-client" \
-H "Authorization: Bearer $BUZZPAY_KEY" \
-H "Content-Type: application/json" \
-d '{ "client_id": 91 }'const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/attach-client", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.BUZZPAY_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ client_id: 91 }),
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/attach-client");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode(["client_id" => 91], JSON_UNESCAPED_UNICODE),
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders/by-reference/A1B2C3D4E5F6G7H8/attach-client",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
json={"client_id": 91},
)
data = resp.json(){
"message": "Клиент привязан",
"order": {
"id": 4210,
"order_number": "BP-004210",
"status": "pending",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": "verified",
"kyc_status": "approved",
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00",
"client_id": 91
}
}Песочница
Симуляция оплаты (только тестовый ключ)
/orders/{id}/simulate-paymentПереводит тестовый заказ в paid без реальной оплаты и отправляет вебхук order.paid с is_test: true. С боевым ключом — 403.
Параметры
| Параметр | Где | Описание |
|---|---|---|
id обязательныйinteger | в пути | ID тестового заказа (90 000 000+) |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403test_key_required | Боевой ключ |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "test_key_required",
"message": "Симуляция оплаты доступна только с тестовым ключом (тестовый ключ)."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl -X POST "https://buzz-pay.com/api/sub/v1/orders/90000001/simulate-payment" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/orders/90000001/simulate-payment", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/orders/90000001/simulate-payment");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.post(
"https://buzz-pay.com/api/sub/v1/orders/90000001/simulate-payment",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"message": "Тестовый платёж успешно симулирован.",
"order": {
"id": 90000001,
"order_number": "BP-TEST-90000001",
"status": "paid",
"amount_rub": 5000,
"amount_usdt": 56.55,
"rate_usdt": 88.41,
"payment_reference": "A1B2C3D4E5F6G7H8",
"client_name": "Иван Петров",
"client_external_id": "user-777",
"kyc_type": null,
"kyc_status": null,
"point": {
"id": 12,
"name": "Основная",
"account": "USDT"
},
"created_at": "2026-09-19T10:00:00+00:00",
"global_id": "BP-TEST-90000001",
"is_test": true
},
"webhook_queued": true,
"_sandbox": "Тестовый режим — база не затронута."
}База клиентов
Список клиентов
/clientsПроверенные клиенты вашего кабинета: документы загружаются один раз, повторные платежи создаются по client_external_id или client_phone.
Параметры
| Параметр | Где | Описание |
|---|---|---|
searchstring | в запросе | Поиск по имени / телефону / ID |
statusstring | в запросе | Фильтр по статусу верификации |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/clients" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/clients", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/clients");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/clients",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"data": [
{
"id": 91,
"external_id": "user-777",
"phone": "+79001234567",
"first_name": "Иван",
"last_name": "Петров",
"status": "verified"
}
]
}Клиент по ID или телефону
/clients/{key}Параметры
| Параметр | Где | Описание |
|---|---|---|
key обязательныйstring | в пути | client_external_id или телефон |
Ошибки
| Код | Когда |
|---|---|
401unauthorized | Ключ отсутствует, отозван или неверен |
403scope_disabled | API выключен владельцем кабинета или раздел не включён |
404not_found | Не найдено или не принадлежит вашему кабинету |
429too_many_requests | Превышен лимит 120 запросов в минуту |
Примеры ответов с ошибкой
{
"error": "unauthorized",
"message": "API-ключ недействителен или отозван."
}{
"error": "scope_disabled",
"message": "Раздел «orders» не включён для вашего кабинета."
}{
"error": "not_found",
"message": "Не найдено."
}{
"error": "too_many_requests",
"message": "Too Many Attempts."
}curl "https://buzz-pay.com/api/sub/v1/clients/user-777" \
-H "Authorization: Bearer $BUZZPAY_KEY"const res = await fetch("https://buzz-pay.com/api/sub/v1/clients/user-777", {
headers: { Authorization: `Bearer ${process.env.BUZZPAY_KEY}` },
});
const data = await res.json();$ch = curl_init("https://buzz-pay.com/api/sub/v1/clients/user-777");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("BUZZPAY_KEY"),
],
CURLOPT_RETURNTRANSFER => true,
]);
$data = json_decode(curl_exec($ch), true);import os
import requests
resp = requests.get(
"https://buzz-pay.com/api/sub/v1/clients/user-777",
headers={"Authorization": f"Bearer {os.environ['BUZZPAY_KEY']}"},
)
data = resp.json(){
"client": {
"id": 91,
"external_id": "user-777",
"phone": "+79001234567",
"first_name": "Иван",
"last_name": "Петров",
"status": "verified"
}
}