← Помощь продавцам

Seller API v1

Это HTTP API для бота продавца. Все запросы идут на https://sellpay.fun/api/v1 с ключом sp_live_… в заголовке. Логин и cookie с сайта сюда не подходят — только API-ключ.

Старт

За 4 шага можно проверить, что ключ работает:

  1. Открой Профиль → Настройки → Безопасность → Seller API
  2. Создай ключ. Он начинается с sp_live_ и показывается один раз — сразу сохрани его
  3. (По желанию) укажи HTTPS-адрес webhook и включи доставку событий
  4. Проверь ключ командой ниже — в ответе должен быть твой профиль
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"
ПараметрПримерЗачем
statusactiveТолько заказы с этим статусом (см. таблицу статусов)
buyerIdu_2Заказы конкретного покупателя
lotIdlot_1Заказы по одному лоту
chatIdchat_1Заказы, привязанные к чату
since2026-08-01T00:00:00.000ZТолько заказы новее этой даты (ISO-8601)
afterNumber920100Пагинация: заказы с номером меньше этого (список идёт от новых к старым)
hasRating1Только заказы, где уже есть оценка
needsReply1Есть отзыв, но ты ещё не ответил
limit50Сколько вернуть (по умолчанию 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)

ПараметрПримерЗачем
afterIdmsg_10Только сообщения новее этого id (удобно для «подгрузки»)
sinceISO-датаТолько после указанного времени
frombuyerТолько сообщения от покупателя
containsключТекст содержит подстроку
system00 — без системных сообщений
limit100Сколько сообщений вернуть
Новое сообщение приходит webhook’ом 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

Пока нет изменений.