Seller API v1
Это HTTP API для бота продавца. Все запросы идут на https://sellpay.fun/api/v1 с ключом sp_live_… в заголовке. Логин и cookie с сайта сюда не подходят — только API-ключ.
Старт
За 4 шага можно проверить, что ключ работает:
- Открой Профиль → Настройки → Безопасность → Seller API
- Создай ключ. Он начинается с
sp_live_и показывается один раз — сразу сохрани его - (По желанию) укажи HTTPS-адрес webhook и включи доставку событий
- Проверь ключ командой ниже — в ответе должен быть твой профиль
curl -s https://sellpay.fun/api/v1/me \
-H "Authorization: Bearer sp_live_YOUR_KEY"
401. Через API лоты можно только читать и править; создать или удалить лот — только на сайте.Авторизация
Базовый адрес: https://sellpay.fun/api/v1
В каждый запрос добавь заголовок:
Authorization: Bearer sp_live_твой_ключ
Лимит: 60 запросов в минуту на один ключ. Если превысил — ответ 429 и заголовок Retry-After (сколько секунд подождать).
Ошибки
Ответ обычно JSON с полями success: false и error (текст причины).
| Код | Что значит | Что делать |
|---|---|---|
401 | Нет ключа или ключ неверный | Проверь заголовок Bearer или создай новый ключ |
403 | Доступ запрещён (нет прав, бан и т.п.) | Проверь, что ключ активен и аккаунт не заблокирован |
404 | Объект не найден | Проверь id заказа, лота или чата |
400 | Неверный запрос (тело или параметры) | Читай текст в поле error |
429 | Слишком много запросов | Подожди Retry-After; события лучше брать из webhook |
500 | Ошибка на стороне сервера | Повтори позже |
Чего не делать
- Не вызывай обычные URL сайта вроде
/api/ordersс cookie браузера — для бота нужен только/api/v1и ключ. - Не опрашивай API каждую секунду («поллинг»). Новые заказы и сообщения приходят на webhook.
PATCH /me/onlineдостаточно раз в несколько минут, не чаще.- Не клади ключ в публичный GitHub / Discord / скриншоты.
- На webhook отвечай быстро (таймаут ≈ 2.5 с), тяжёлую логику делай после ответа
200. - Один и тот же
eventIdобрабатывай один раз (идемпотентность).
Аккаунт
| Метод | Что делает |
|---|---|
GET /me | Твой профиль, баланс, рейтинг, онлайн-статус |
PATCH /me/online | Вкл/выкл онлайн: {"isOnline": true} или false |
PATCH /me/profile | Ник и описание: profileNickname, profileDescription |
GET /games | Список игр и категорий каталога |
curl -X PATCH https://sellpay.fun/api/v1/me/online \
-H "Authorization: Bearer sp_live_…" \
-H "Content-Type: application/json" \
-d '{"isOnline":true}'
Лоты
Создать и удалить лот можно только на сайте. Через API — список, правка цены/статуса, поднятие и массовые правки.
| Метод | Что делает |
|---|---|
GET /lots | Список лотов. Фильтры: ?status=active, ?game=Steam |
GET /lots/:id | Один лот по id |
PATCH /lots/:id | Правка: price, quantity, status, title, description, autoDeliveryContent, instantDelivery |
POST /lots/:id/bump | Поднять всю игру этого лота (слоты + кулдаун) |
POST /lots/bump-game | Тело: {"game":"Steam"} — поднять всю игру |
POST /lots/bump | Несколько игр: {"games":["Steam","Roblox"]} (в пределах слотов) |
GET /lots/bump-status | Слоты, кулдаун, доступные игры, autoBump |
GET /lots/auto-bump | Настройки автоподнятия |
PUT /lots/auto-bump | Включить автоподнятие и выбрать игры |
POST /lots/bulk | Массово: ids[] + status / price / pricePercent |
Поднятие действует на всю игру сразу. Один слот = одна игра (не больше gameSlots). Когда снова можно поднять — смотри canBump и cooldownUntil в bump-status.
Пример тела PUT /lots/auto-bump
{
"enabled": true,
"selections": [
{ "game": "Steam" },
{ "game": "Roblox" }
]
}
Пример PATCH /lots/:id
{
"price": 499,
"status": "active",
"autoDeliveryContent": "KEY1\nKEY2"
}
{
"success": true,
"lot": {
"id": "lot_1",
"price": 499,
"status": "active",
"autoDeliveryLines": 2
}
}
Заказы
| Метод | Что делает |
|---|---|
GET /orders | Список твоих продаж. Параметры — в таблице ниже |
GET /orders/summary | Сколько заказов в каждом статусе |
GET /orders/:idOrNumber | Один заказ (по id или номеру) + chatId + рейтинг |
GET /orders/:id/messages | Сообщения по заказу (фильтры — ниже в разделе Чаты/сообщения) |
POST /orders/:id/messages | Написать покупателю: {"text":"Привет!"} |
POST /orders/:id/refund | Вернуть деньги покупателю |
POST /orders/:id/rating-reply | Ответ на отзыв: {"reply":"…"} (до 150 символов) |
Параметры GET /orders
Все параметры необязательные. Можно комбинировать. Пример:
curl -s "https://sellpay.fun/api/v1/orders?status=active&limit=20" \
-H "Authorization: Bearer sp_live_YOUR_KEY"
| Параметр | Пример | Зачем |
|---|---|---|
status | active | Только заказы с этим статусом (см. таблицу статусов) |
buyerId | u_2 | Заказы конкретного покупателя |
lotId | lot_1 | Заказы по одному лоту |
chatId | chat_1 | Заказы, привязанные к чату |
since | 2026-08-01T00:00:00.000Z | Только заказы новее этой даты (ISO-8601) |
afterNumber | 920100 | Пагинация: заказы с номером меньше этого (список идёт от новых к старым) |
hasRating | 1 | Только заказы, где уже есть оценка |
needsReply | 1 | Есть отзыв, но ты ещё не ответил |
limit | 50 | Сколько вернуть (по умолчанию 50, максимум 100) |
Статусы заказа
| status | Что это значит для бота |
|---|---|
paid / active | Оплачен — можно выдавать товар |
confirmed | Покупатель подтвердил получение (или сработало авто) |
refunded | Уже сделан возврат |
canceled / expired | Отменён или истёк |
complaint_* / claim | Спор — не автовыдавай, разбирай вручную |
Текст в чат пишешь сам через POST …/messages (поле text). Готовых шаблонов в API нет.
Отзывы
| Метод | Что делает |
|---|---|
GET /reviews | Список отзывов на тебя. Опционально: ?limit=50 |
Ответить на отзыв: POST /orders/:id/rating-reply с телом {"reply":"Спасибо!"}.
Чаты
| Метод | Что делает |
|---|---|
GET /chats | Список диалогов. ?unread=1 — только непрочитанные, ?limit=50 |
GET /chats/:id | Один диалог + связанные заказы |
GET /chats/:id/orders | Заказы этого чата |
POST /chats/:id/read | Пометить диалог прочитанным |
GET /chats/:id/messages | История сообщений (параметры ниже) |
POST /chats/:id/messages | Написать: {"text":"…"} |
Параметры сообщений (orders и chats)
| Параметр | Пример | Зачем |
|---|---|---|
afterId | msg_10 | Только сообщения новее этого id (удобно для «подгрузки») |
since | ISO-дата | Только после указанного времени |
from | buyer | Только сообщения от покупателя |
contains | ключ | Текст содержит подстроку |
system | 0 | 0 — без системных сообщений |
limit | 100 | Сколько сообщений вернуть |
chat.message. Если диалог по сделке — в теле будет объект order. После ответа бота вызови POST /chats/:id/read.Баланс
| Метод | Что делает |
|---|---|
GET /balance/transactions | История движений по балансу |
GET /withdrawals | Заявки на вывод (только чтение) |
Webhooks
Webhook — это когда SellPay сам стучится на твой сервер при событии (новый заказ, сообщение и т.д.). В настройках укажи URL на https:// и включи доставку.
События: order.paid, order.status, chat.message, webhook.test. Что ответить покупателю — решаешь ты в своём боте.
Заголовки запроса к тебе:
X-SellPay-Event— тип событияX-SellPay-Event-Id— уникальный id (не обрабатывай дважды)X-SellPay-Delivery-Id— id конкретной доставкиX-SellPay-Signature— HMAC-SHA256 от сырого body, секретwhsec_…
Ответь 200 за ≈ 2.5 с. Проверка с нашей стороны: POST /api/v1/webhooks/test.
Пример тела order.paid
{
"event": "order.paid",
"eventId": "evt_abc123",
"createdAt": "2026-08-08T12:00:00.000Z",
"data": {
"order": {
"id": "ord_1",
"orderNumber": 920100,
"status": "active",
"chatId": "chat_1",
"amount": 499,
"buyerId": "u_2",
"lot": { "titleRu": "Ключ Steam", "game": "Steam" }
}
}
}
Пример тела chat.message
{
"event": "chat.message",
"eventId": "evt_…",
"data": {
"chatId": "chat_1",
"fromBuyer": true,
"peerId": "u_2",
"openOrderCount": 1,
"order": {
"id": "ord_1",
"orderNumber": 920100,
"status": "active"
},
"message": {
"id": "msg_1",
"fromId": "u_2",
"text": "…",
"fromBuyer": true
}
}
}
Проверка подписи (Node.js)
const sig = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
if (sig !== req.get("x-sellpay-signature")) throw new Error("bad sig");
Проверка подписи (Python)
import hmac, hashlib
sig = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
assert sig == request.headers["X-SellPay-Signature"]
Объекты
Кратко, какие поля чаще всего встречаются в ответах:
order
id, orderNumber, status, lotId, chatId, amount, quantity, buyerId, sellerId, createdAt, paidAt, confirmedAt, lot, buyer
lot
id, game, category, titleRu, price, quantity, status, instantDelivery, autoDeliveryLines, lastBump, images
message
id, chatId, fromId, toId, text, fileUrl, isSystem, isAutoDelivery, fromBuyer, createdAt
Curl builder
Сборка команды curl прямо в браузере. Ключ никуда не отправляется — только подставляется в текст команды у тебя на экране.
curl -s https://sellpay.fun/api/v1/me \
-H "Authorization: Bearer sp_live_YOUR_KEY"
Changelog
Пока нет изменений.