API
Все возможности панели доступны через два отдельных API. Оба работают с одним и тем же аккаунтом, одним балансом и одним каталогом; различаются они форматом и возможностями.
Все возможности панели доступны через два отдельных API. Оба работают с одним и тем же аккаунтом, одним балансом и одним каталогом; различаются они форматом и возможностями.
Почему два API?
Классический реселлерский API (v2), которым пользуется вся отрасль, принимает форму на единственном эндпоинте и всегда отвечает HTTP 200. Именно такой формат ожидает готовое панельное ПО, поэтому он сохранён без изменений. А те, кто пишет собственную систему, постоянно упирались в его ограничения: ошибки нельзя было различить, каталог приходил одним куском, а статус заказа приходилось бесконечно опрашивать. v3 написан для них.
Сравнение
| Возможность | Legacy (v2) | Новый (v3) |
|---|---|---|
| Формат | Один эндпоинт, отправка формы, параметр action | REST на уровне ресурсов, тело в JSON |
| HTTP-код | Всегда 200, даже при ошибке | Настоящие коды (400, 401, 402, 404, 409, 429, 502) |
| Ошибки | Произвольный текст | type + стабильный code + локализованное сообщение + param + doc_url |
| Статус заказа | Только локализованный текст | Стабильное машинное значение плюс отдельная подпись для показа |
| Описание услуги | Нет | Описание на 10 языках, среднее время, платформа, категория |
| Поля заказа | Угадываются по названию типа | Каждая услуга публикует собственную схему полей |
| Единица цены | Не указана (источник ошибки в 1000 раз на пакетах) | Явно указана как per_1000 или per_order |
| Каталог | Все услуги в одном ответе | Фильтры и постраничный вывод по курсору |
| Защита от дублей | Нет | Idempotency-Key |
| Уведомления о статусе | Постоянный опрос | Подписанные вебхуки или поток событий |
| Схема | Нет | OpenAPI 3.1 |
| Языки | Английский и турецкий (разные адреса) | 10 языков (заголовком или параметром) |
Какой выбрать?
Выбирайте legacy API, если используете готовое панельное ПО, бота или реселлерскую панель. Большинство из них просят изменить только адрес API и ключ, и всё начинает работать за считаные минуты.
Выбирайте v3, если пишете собственное приложение, витрину или автоматизацию. Обработка ошибок, защита от дублей и уведомления идут в комплекте, а форму заказа можно построить прямо из схемы услуги.
С чего начать
- 1Создайте ключ API на вкладке «Ключи».
- 2Получите список услуг и посмотрите id и схему полей нужной услуги.
- 3Сначала проверьте заказ через preview, затем создайте его.
- 4Подключите вебхук или читайте поток событий, чтобы отслеживать изменения статуса.
REST API, спроектированный для разработчиков, которые пишут собственную систему: пути на уровне ресурсов, настоящие HTTP-коды, машиночитаемые ошибки и подписанные уведомления.
Базовый адрес
Все пути добавляются к этому адресу. Версия находится в пути: если когда-нибудь понадобится ломающее изменение, будет опубликован новый путь (v4), а этот продолжит работать без правок. Дата публикации контракта возвращается в заголовке X-Api-Version в каждом ответе.
https://panelfollows.com/api/v3Аутентификация
Отправляйте ключ API как токен Bearer в заголовке Authorization. В качестве альтернативы принимается заголовок X-Api-Key.
GET https://panelfollows.com/api/v3/account
Authorization: Bearer pf_live_...Ваш текущий legacy-ключ работает и в v3, так что попробовать можно сразу. В продакшене используйте ключ v3: его можно пометить, отозвать по отдельности, и он не хранится в открытом виде.
Быстрый старт
curl https://panelfollows.com/api/v3/services?limit=5 \
-H "Authorization: Bearer YOUR_API_KEY"Язык
Язык ответа выбирается заголовком Accept-Language или параметром ?lang=; параметр имеет приоритет. Названия услуг, описания услуг, названия категорий, подписи статусов заказа, подписи полей заказа и сообщения об ошибках приходят на выбранном языке.
Машинные значения не меняются ни на одном языке: error.code, order.status, service.type и currency всегда одинаковы. Стройте условия на них, а пользователю показывайте текст.
Accept-Language: tr
# veya
GET https://panelfollows.com/api/v3/services?lang=trФормат запроса и ответа
Тело запроса передаётся в JSON (application/json); для быстрых проверок принимается и form-urlencoded. Ответы приходят в JSON: одиночный ресурс представлен обычным объектом, а списки приходят в конверте с полями data, has_more и next_cursor. В каждом объекте есть поле object, называющее его тип.
Суммы возвращаются десятичными СТРОКАМИ ("1.2340"), а не числами с плавающей точкой. Разбирайте их в десятичный тип на своей стороне, чтобы не терять доли. Валюта: USD.
Отметки времени даны в формате RFC 3339 (2026-08-21T00:24:45.255Z).
Ошибки
При сбое возвращается настоящий HTTP-код, а тело содержит единственный объект error. Ваш код должен ветвиться по error.code: это значение стабильно и не меняется вместе с языком.
HTTP/1.1 400 Bad Request
Content-Type: application/json
X-Request-Id: req_0c858d8af7f65eca001b2f5a
{
"object": "error",
"error": {
"type": "invalid_request_error",
"code": "quantity_out_of_range",
"message": "Miktar, bu servisin izin verdiği aralığın dışında.",
"param": "quantity",
"doc_url": "https://panelfollows.com/api-docs#error-quantity_out_of_range",
"request_id": "req_0c858d8af7f65eca001b2f5a"
}
}| type | Широкий класс: можно ли повторить запрос или это ошибка на вашей стороне. |
| code | Стабильное машинное значение. Стройте условия на нём. |
| message | Понятное человеку описание на выбранном вами языке. |
| param | Имя поля, вызвавшего ошибку, если оно есть. |
| doc_url | Ссылка на точный раздел этой документации. |
| request_id | Единственная ссылка, которую нужно указать при обращении в поддержку. |
Ограничение запросов
600 запросов в минуту на ключ и дополнительно 900 запросов в минуту на IP. В каждом ответе приходят заголовки RateLimit-Limit, RateLimit-Remaining и RateLimit-Reset, так что вы можете притормозить, не упираясь в лимит. При превышении возвращается 429 с заголовком Retry-After.
Постраничный вывод
Списки листаются курсором. Передавайте limit для размера страницы (не более 500) и starting_after с id последней записи предыдущей страницы. Продолжайте, пока has_more не станет false; next_cursor даёт готовый курсор для следующего запроса. Значение limit вне диапазона не обрезается молча, а возвращает ошибку: тихое обрезание создаёт у клиента иллюзию, что он выгрузил всё.
Защита от дублей (Idempotency-Key)
При создании заказа добавьте к запросу случайный заголовок Idempotency-Key. Если связь оборвётся и вы повторите запрос с тем же ключом, второй заказ создан не будет: вернётся тот же ответ, что и на первый запрос, с заголовком Idempotent-Replay: true. Записи хранятся 24 часа.
Если отправить тот же ключ с ДРУГИМ телом, вернётся 409 idempotency_key_reuse. Почти всегда это означает, что генерация ключей на стороне клиента сломана. Неудачный запрос не сжигает ключ: исправьте проблему и повторите с тем же ключом.
Создание заказа
curl -X POST https://panelfollows.com/api/v3/orders \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 8f14e45f-ea3a-4b1c-9c1e-2b0d5c6a7e91" \
-d '{
"service": 1234,
"link": "https://instagram.com/username",
"quantity": 1000
}'Схема полей услуги
Каждая услуга публикует нужные ей поля в массиве fields: имя, тип, обязательность, ограничения, а также подпись и описание на вашем языке. Если у поля determines_quantity равно true, количество вычисляется по числу строк в этом поле.
// Servisin kendi alan şemasından formu OTOMATİK üretmek:
// hiçbir servis tipini koda gömmeniz gerekmez.
const res = await fetch("https://panelfollows.com/api/v3/services/1234", {
headers: { Authorization: "Bearer YOUR_API_KEY", "Accept-Language": "tr" },
});
const service = await res.json();
for (const field of service.fields) {
renderInput({
name: field.name,
label: field.label, // kullanıcının dilinde
hint: field.description, // kullanıcının dilinde
required: field.required,
type: field.type, // url | integer | string | text_lines
min: field.min,
max: field.max,
// true ise miktarı bu alanın satır sayısı belirler
countsLines: field.determines_quantity === true,
});
}Объект услуги
{
"object": "service",
"id": 1234,
"name": "Instagram Takipçi | Türk | 30 gün telafi",
"description": "Gerçek hesaplardan Türk takipçi. Başlangıç 0-1 saat.",
"type": "default",
"platform": "instagram",
"category": { "slug": "instagram-takipci", "name": "Instagram Takipçi" },
"pricing": {
"rate": "1.2340",
"currency": "USD",
"unit": "per_1000",
"unit_note": "Fiyat 1000 adet içindir."
},
"limits": { "min": 100, "max": 100000 },
"features": { "refill": true, "cancel": false, "dripfeed": true },
"average_time_seconds": 4320,
"fields": [
{
"name": "link",
"type": "url",
"required": true,
"label": "Bağlantı",
"description": "Gönderimin yapılacağı profilin herkese açık adresi."
},
{
"name": "quantity",
"type": "integer",
"required": true,
"label": "Miktar",
"description": "Kaç adet gönderileceği.",
"min": 100,
"max": 100000
}
],
"is_active": true,
"updated_at": "2026-08-20T09:15:00.000Z"
}Предпросмотр заказа (сухой прогон)
POST /orders/preview проверяет заказ и рассчитывает стоимость, НЕ создавая его. Вы можете показать цену клиенту и заранее убедиться, что баланса хватает. Списания с баланса не происходит, к поставщику обращения нет.
Пакетные заказы
POST /orders/batch принимает до 50 заказов за один вызов. Элементы обрабатываются по порядку, и каждый получает собственный результат: даже если один не прошёл, остальные будут созданы, а в результате элемента видно, какой именно и почему не прошёл.
Встраивание связанных объектов
Если передать include=service на эндпоинтах заказов, объект услуги встраивается в ответ и второй запрос не понадобится.
Справочник эндпоинтов
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /api/v3 | Discovery document: version, endpoints, limits and event types. |
| GET | /api/v3/openapi.json | OpenAPI 3.1 schema for this API. |
| GET | /api/v3/account | Account balance, currency and current rate-limit window. |
| PATCH | /api/v3/account | Set the low balance alert threshold that triggers account.low_balance. |
| GET | /api/v3/services | List services with filters and cursor pagination. |
| GET | /api/v3/services/{id} | Retrieve one service, including its order field schema. |
| GET | /api/v3/categories | List categories with their active service counts. |
| GET | /api/v3/platforms | List platform keys usable as the ?platform= filter, with counts. |
| POST | /api/v3/orders | Create an order. Supports the Idempotency-Key header. |
| POST | /api/v3/orders/preview | Validate an order and compute its charge without creating it. |
| POST | /api/v3/orders/batch | Create up to 50 orders in one call; each item reports its own result. |
| GET | /api/v3/orders | List your orders, newest first. |
| GET | /api/v3/orders/{id} | Retrieve one order. |
| POST | /api/v3/orders/{id}/cancel | Request cancellation. Only for services whose features.cancel is true. |
| POST | /api/v3/orders/{id}/refill | Request a refill for a completed order. |
| GET | /api/v3/refills | List your refill requests, newest first. |
| GET | /api/v3/refills/{id} | Retrieve one refill; refreshes its status from the provider. |
| GET | /api/v3/events | Read your event stream oldest-first; the polling alternative to webhooks. |
| GET | /api/v3/webhooks | List your webhook endpoints. |
| POST | /api/v3/webhooks | Register a webhook endpoint. The signing secret is returned once. |
| GET | /api/v3/webhooks/{id} | Retrieve one webhook endpoint. |
| PATCH | /api/v3/webhooks/{id} | Update a webhook endpoint's url, events, description or active state. |
| DELETE | /api/v3/webhooks/{id} | Delete a webhook endpoint and its delivery log. |
| POST | /api/v3/webhooks/{id}/test | Send a test event to this endpoint, ignoring its event filter. |
| POST | /api/v3/webhooks/{id}/rotate_secret | Generate a new signing secret. The old one stops working immediately. |
| GET | /api/v3/webhooks/{id}/deliveries | Delivery log for one endpoint: attempts, response codes and errors. |
Схема OpenAPI
Машиночитаемое описание всех эндпоинтов. Передайте этот файл генератору клиентов (openapi-generator, Kiota) или Postman и получите готовый клиент на своём языке.
https://panelfollows.com/api/v3/openapi.jsonЧастые вопросы
Работает ли мой legacy-ключ в v3?
Да. Чтобы попробовать, новый ключ создавать не нужно. Но в продакшене всё же перейдите на ключ v3: его можно отозвать, и он не хранится в открытом виде.
Почему цены приходят строками?
Числа с плавающей точкой теряют доли на десятичных суммах. Возврат строк и разбор их в десятичный тип на вашей стороне полностью снимает этот класс расхождений при округлении.
Почему поле unit важно?
Большинство услуг тарифицируется за 1000 единиц (per_1000), но пакетные услуги продаются как одна позиция (per_order), и цена покрывает пакет целиком. Интеграции, не учитывавшие это различие, считали цену пакетов с ошибкой в 1000 раз.
Заказ создан, но остался в статусе pending. Что произошло?
Передача поставщику могла задержаться. Ваш баланс удержан, и заказ не потерян; наша команда отправляет его повторно автоматически. Это состояние отмечено полем processing_delayed.
Отмена и докрутка есть у всех услуг?
Нет. Смотрите поля features.cancel и features.refill в объекте услуги. Вызов эндпоинта для услуги без такой поддержки вернёт 400.
Можно ли пользоваться обоими API одновременно?
Да. Тот же аккаунт, тот же баланс, те же заказы. Заказ, созданный через v2, можно прочитать через v3.
Классический реселлерский API, стандартный для всей отрасли. Именно такой формат ожидает готовое панельное ПО.
Эндпоинт
POST https://panelfollows.com/api/v2
POST https://panelfollows.com/api/v2/trАутентификация
В каждом запросе передаётся параметр key. Держите ключ в секрете и сразу перевыпускайте его при утечке.
Формат запроса и ответа
Запросы отправляются методом POST в виде формы (application/x-www-form-urlencoded), ответы приходят в JSON. При ошибке тоже возвращается HTTP 200, а в теле находится { "error": "..." }.
Также поддерживается, хотя раньше не документировалось: вызывать можно и методом GET, а тело допустимо отправлять как application/json.
Ограничение запросов
240 запросов в минуту на ключ и дополнительно 300 запросов в минуту на IP. Запросы сверх лимита отклоняются с кодом 429.
Действия и параметры
| action | Параметр | Описание |
|---|---|---|
| services | key, action | Возвращает список всех активных услуг (id, название, категория, цена, мин./макс., докрутка, отмена, постепенная подача). |
| add | key, action, service, link, quantity[, runs, interval, comments, username, posts, min, max] | Создаёт заказ. service: id услуги в каталоге. Для постепенной подачи добавьте runs и interval, а для особых типов передайте соответствующие поля. |
| status | key, action, order | orders | Статус заказа. Для одного используйте order, для нескольких: список orders через запятую. |
| balance | key, action | Баланс аккаунта и валюта. |
| refill | key, action, order | orders | Создаёт заявку на докрутку, которая уходит напрямую поставщику. |
| refill_status | key, action, refill | refills | Запрашивает статус докрутки. |
| cancel | key, action, orders | Отменяет заказы. Работает только для услуг, поставщик которых поддерживает отмену. |
Пример
curl -X POST https://panelfollows.com/api/v2 \
-d "key=YOUR_API_KEY" \
-d "action=add" \
-d "service=1234" \
-d "link=https://instagram.com/username" \
-d "quantity=1000"
# Yanıt: { "order": 23501 }Ответы на турецком
Добавьте /tr в конец адреса, чтобы получать названия услуг, категории, статусы заказов и сообщения об ошибках на турецком. Параметры, действия и структура ответа полностью совпадают, а ваш ключ работает по обоим адресам. Технические поля (type, refill_status, currency) остаются на английском ради совместимости со стандартом.
Переход на v3
Переход не обязателен. Если вы всё же решите перейти, большая часть бизнес-логики сохранится, потому что имена параметров не изменились; меняются транспорт и способ чтения ошибок.
- 1Перенесите ключ из поля key в теле запроса в заголовок Authorization: Bearer.
- 2Вызывайте путь ресурса вместо action=... (POST /orders вместо add).
- 3Проверяйте сбой по HTTP-коду и error.code, а не по вопросу «есть ли поле error».
- 4Сравнивайте статус заказа с машинным значением, а не с отображаемым текстом.
- 5При создании заказа добавляйте Idempotency-Key.
- 6Замените опрос статуса вебхуками.
Ключ даёт полный доступ к вашему аккаунту. Не передавайте его другим, не встраивайте в клиентский код и никогда не выкладывайте в публичные репозитории.
Ключи v3
Вы можете создать столько ключей, сколько нужно, пометить каждый и отзывать их по отдельности. На нашей стороне хранится только криптографический отпечаток ключа.
Создать бесплатный аккаунтLegacy-ключ
Единственный ключ, который использует классический реселлерский API (v2). Он работает и в v3. После перевыпуска старое значение становится недействительным мгновенно.
Безопасность
- Храните ключ в переменной окружения, а не в исходном коде.
- Не размещайте ключ в коде, который выполняется в браузере; проводите запросы через собственный сервер.
- Заводите отдельный ключ для каждой системы, тогда отзыв одного не затронет остальные.
- При подозрении на утечку сначала введите в работу новый ключ, а затем отзовите старый.
Когда статус заказа меняется, мы отправляем на ваш сервер подписанное уведомление, поэтому постоянно опрашивать статус не нужно.
Зачем вебхуки?
Опрос и медленный, и расточительный: спрашивать про тысячи заказов каждую минуту значит выбрать весь лимит запросов и всё равно узнать об изменении спустя минуты. С вебхуком изменение доходит до вас в момент, когда оно произошло.
Настройка
- 1Подготовьте публичный адрес https (локальные адреса и адреса внутренней сети не принимаются).
- 2Добавьте адрес ниже и сохраните ключ подписи, который показывается один раз.
- 3Проверяйте подпись на своей стороне и отвечайте 2xx.
- 4Нажмите кнопку тестовой отправки, чтобы проверить весь путь от начала до конца.
Что мы отправляем
POST /hooks/pf HTTP/1.1
Content-Type: application/json
Webhook-Id: evt_7f910fba7cd042ef9d9069ba5c074fa0
Webhook-Timestamp: 1787261223
Webhook-Signature: t=1787261223,v1=9c1e2b0d5c6a7e91...
{
"object": "event",
"id": "evt_7f910fba7cd042ef9d9069ba5c074fa0",
"type": "order.completed",
"created_at": "2026-08-21T00:27:03.531Z",
"data": {
"previous_status": "in_progress",
"order": {
"object": "order",
"id": 23501,
"status": "completed",
"status_label": "Tamamlandı",
"service": 1234,
"quantity": 1000,
"start_count": 4210,
"remains": 0,
"charge": "1.2340",
"currency": "USD"
}
}
}Проверка подписи
Каждый запрос несёт заголовок Webhook-Signature: t: отметка времени, v1: подпись. Подпись представляет собой HMAC-SHA256 строки "<отметка времени>.<сырое тело>", вычисленный с вашим секретным ключом.
- 1Разберите из заголовка значения t и v1.
- 2Убедитесь, что значение t не старше 5 минут, чтобы заблокировать повторные атаки.
- 3Вычислите HMAC-SHA256 строки "<t>.<сырое тело>" со своим секретным ключом.
- 4Сравните результат с v1 за постоянное время и отклоните запрос, если они не совпадают.
Пример проверки
import crypto from "node:crypto";
import express from "express";
const app = express();
// ÖNEMLİ: imza HAM gövde üzerinden hesaplanır. JSON'a çevirip yeniden
// dizeye dönüştürürseniz boşluklar değişir ve imza tutmaz.
app.post("/hooks/pf", express.raw({ type: "application/json" }), (req, res) => {
const raw = req.body.toString("utf8");
const header = req.get("Webhook-Signature") ?? "";
const m = /t=(\d+),v1=([0-9a-f]+)/.exec(header);
if (!m) return res.sendStatus(400);
const [, timestamp, signature] = m;
// Tekrar saldırısına karşı: 5 dakikadan eski damgayı reddet.
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return res.sendStatus(400);
const expected = crypto
.createHmac("sha256", process.env.WEBHOOK_SECRET)
.update(`${timestamp}.${raw}`, "utf8")
.digest("hex");
const ok =
expected.length === signature.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
if (!ok) return res.sendStatus(401);
const event = JSON.parse(raw);
// 2xx dönmezseniz gönderim artan aralıklarla tekrar denenir.
res.sendStatus(200);
if (event.type === "order.completed") {
// ... siparişi kendi sisteminizde tamamlandı olarak işaretleyin
}
});Повторные отправки
Первая попытка выполняется в момент события. Если ответ отличается от 2xx или соединение не установилось, отправка повторяется через 1 минуту, 5 минут, 30 минут, 2 часа и 6 часов. После 6 попыток доставка помечается как неуспешная и попадает в журнал доставок.
Типы событий
Можно подписаться на интересующие типы или получать все. Одно изменение статуса порождает ровно одно событие, с типом, который лучше всего соответствует новому статусу.
| order.created | Заказ создан. |
| order.processing | Поставщик приступил к выполнению заказа. |
| order.completed | Заказ выполнен. |
| order.partial | Заказ выполнен частично, остаток возвращён на баланс. |
| order.canceled | Заказ отменён или возвращён. |
| order.updated | Статус изменился иным образом. |
| refill.created | Создана заявка на докрутку. |
| refill.updated | Статус докрутки изменился. |
| account.low_balance | Баланс опустился ниже порога, заданного через PATCH /account. Событие возникает в момент пересечения, а не при каждом заказе, и снова активируется, когда баланс превысит порог. |
Если разместить вебхук негде
Те же события можно читать по курсору через GET /api/v3/events. Пользуйтесь этим способом при локальной разработке, при отсутствии статического IP или из-за межсетевого экрана.
// Webhook kuramıyorsanız (yerelde geliştirme, sabit IP yok) aynı bilgiyi
// imleçle çekebilirsiniz. İmleci kendi tarafınızda saklayın.
let cursor = loadCursor(); // en son işlediğiniz olayın "cursor" değeri
const url = new URL("https://panelfollows.com/api/v3/events");
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("starting_after", String(cursor));
const res = await fetch(url, { headers: { Authorization: "Bearer YOUR_API_KEY" } });
const { data, has_more } = await res.json();
for (const event of data) {
handle(event); // sizin işleyiciniz
cursor = event.cursor; // imleci ilerlet
}
saveCursor(cursor);Ошибки (48)
| Код | Статус | Описание |
|---|---|---|
| missing_api_key | 401 | API-ключ не передан. Отправьте его в заголовке 'Authorization: Bearer <key>'. |
| invalid_api_key | 401 | Переданный API-ключ недействителен. |
| revoked_api_key | 401 | Этот API-ключ отозван и больше не может использоваться. |
| account_banned | 403 | Этот аккаунт заблокирован. |
| account_suspended | 403 | Действие этого аккаунта приостановлено. |
| insufficient_scope | 403 | У этого API-ключа нет прав для данного эндпоинта. |
| invalid_json | 400 | Тело запроса не является корректным JSON. |
| unsupported_content_type | 415 | Неподдерживаемый Content-Type. Используйте application/json или application/x-www-form-urlencoded. |
| method_not_allowed | 405 | Этот HTTP-метод не разрешён для данного эндпоинта. |
| payload_too_large | 413 | Тело запроса слишком большое. |
| missing_parameter | 400 | Отсутствует обязательный параметр. |
| invalid_parameter | 400 | У параметра указано недопустимое значение. |
| invalid_link | 400 | Ссылка отсутствует или не является корректным адресом http(s). |
| invalid_quantity | 400 | Количество не является корректным целым положительным числом. |
| quantity_out_of_range | 400 | Количество выходит за пределы диапазона, разрешённого этой услугой. |
| invalid_comments | 400 | Поле комментариев пустое или содержит слишком много строк. |
| invalid_username | 400 | Имя пользователя недопустимо для этой услуги. |
| invalid_subscription | 400 | Параметры подписки некорректны. |
| invalid_runs | 400 | Значение 'runs' недопустимо для постепенной подачи. |
| invalid_interval | 400 | Значение 'interval' недопустимо для постепенной подачи. |
| dripfeed_not_supported | 400 | Эта услуга не поддерживает постепенную подачу. |
| missing_required_field | 400 | Обязательное для этого типа услуги поле отсутствует или некорректно. |
| service_inactive | 400 | Эта услуга сейчас недоступна для заказа. |
| invalid_cursor | 400 | Курсор постраничной навигации некорректен. |
| invalid_limit | 400 | Параметр 'limit' выходит за пределы допустимого диапазона. |
| invalid_webhook_url | 400 | URL вебхука должен быть публичным адресом https://. |
| invalid_events | 400 | Один или несколько запрошенных типов событий неизвестны. |
| batch_too_large | 400 | Слишком много элементов в одном пакетном запросе. |
| cancel_not_supported | 400 | Эта услуга не поддерживает отмену. |
| refill_not_supported | 400 | Эта услуга не предлагает рефилл. |
| unknown_endpoint | 404 | Неизвестный эндпоинт. Доступные маршруты см. в справочнике API. |
| service_not_found | 404 | Услуга с таким id не найдена. |
| order_not_found | 404 | Заказ с таким id в вашем аккаунте не найден. |
| refill_not_found | 404 | Рефилл с таким id в вашем аккаунте не найден. |
| webhook_not_found | 404 | Эндпоинт вебхука с таким id в вашем аккаунте не найден. |
| order_not_cancelable | 409 | Этот заказ больше нельзя отменить из-за его текущего статуса. |
| cancel_rejected | 409 | Поставщик отклонил запрос на отмену. |
| order_not_completed | 409 | Рефилл можно запросить только для выполненного заказа. |
| duplicate_link | 409 | Для этой ссылки уже есть активный заказ. Дождитесь его завершения. |
| idempotency_key_reuse | 409 | Этот Idempotency-Key уже использовался с другим телом запроса. |
| idempotency_in_progress | 409 | Запрос с этим Idempotency-Key ещё обрабатывается. Повторите чуть позже. |
| webhook_limit_reached | 409 | Достигнуто максимальное число эндпоинтов вебхуков. |
| insufficient_balance | 402 | На вашем балансе недостаточно средств для этого заказа. |
| rate_limit_exceeded | 429 | Превышен лимит запросов. См. заголовок ответа Retry-After. |
| provider_error | 502 | Поставщик вернул ошибку. Повторите попытку. |
| refill_failed | 502 | Запрос на рефилл отклонён поставщиком. |
| service_temporarily_unavailable | 503 | Эта услуга временно недоступна. Повторите попытку позже. |
| internal_error | 500 | На нашей стороне произошла непредвиденная ошибка. |