MagStore
MagStore API
HTTP · JSON · email + token

MagStore API

REST-подобный интерфейс поверх одного эндпойнта /resale/api. Работает через GET (query-строка) и POST (JSON) — как в стандарте API.md. Все ответы — JSON с единой оболочкой { success, message, data, timestamp, datetime }, либо text/plain для скачивания карточек товара.

Base URL
https://shooac.top/resale/api
Content-Type (POST)
application/json

Авторизация

Все запросы к API требуют пары email + token. Токен выдаётся администратором вручную и уникален для каждого клиента. Компрометацию токена сообщите администратору — он выпустит новый и мгновенно отзовёт старый.

Способы передачи:

  • GET-параметры: ?email=...&token=...
  • JSON-поля тела POST-запроса: {"email":"...","token":"..."}
  • Заголовок: Authorization: Bearer <token>
Не публикуйте токен в исходном коде фронтенда. Запросы к MagStore API должны идти с вашего backend-а.

Формат ответа

Любой JSON-ответ обёрнут одинаково — можно распарсить одним типом:

// success
{
  "success": true,
  "message": "ok",
  "data": { /* payload */ },
  "timestamp": 1753900000,
  "datetime": "2026-07-30T18:26:40.000Z"
}

// error (HTTP 4xx/5xx)
{
  "success": false,
  "message": "insufficient_funds",
  "data": null,
  "timestamp": 1753900000,
  "datetime": "2026-07-30T18:26:40.000Z"
}

Все суммы — целое число «центов»: 1 USD = 10 000 единиц (total_cents / 10000 === USD).

GET

Баланс

Возвращает текущий баланс и персональную скидку.

GET /resale/api?action=balance&email={email}&token={token}
Пример ответа
{
  "success": true,
  "data": {
    "user_id": 42,
    "login": "acme",
    "balance_cents": 12500000,   // $1250.00
    "discount_percent": 10
  }
}
GET

Список товаров

Только товары, включённые администратором в канал MagStore. Цены уже уменьшены на вашу персональную скидку.

GET /resale/api?action=list&email={email}&token={token}
Пример ответа
{
  "success": true,
  "data": [
    {
      "id": 1,
      "code": "INST_2FA",
      "name": "Long-Live Instagram Gmail",
      "description": "...",
      "discount_percent": 0,
      "price_cents": 7000,        // cheapest enabled tier (with discount)
      "list_price_cents": 7000,   // cheapest tier, undiscounted
      "available": 16903,      // total across enabled tiers
      "tiers": [
        {
          "key": "t0_3",           // pass this as tier_key on purchase
          "label": "0–3 дня",
          "price_cents": 7000,      // $0.70 per unit (with discount)
          "list_price_cents": 7000,
          "available": 9021
        },
        {
          "key": "t21",
          "label": "21 день+",
          "price_cents": 14500,
          "list_price_cents": 14500,
          "available": 7882
        }
      ]
    }
  ]
}

Каждый товар делится на возрастные интервалы (tiers) со своей ценой: t0_3 (0–3 дня), t4_14 (4–14 дней), t15_20 (15–20 дней), t21 (21 день+). В ответе только включённые интервалы; поле key нужно передавать как tier_key при покупке.

GET

Один товар

Возвращает объект того же формата, что и элемент list.

# канонический вид
GET /resale/api?action=product&goods_id={id}&email=…&token=…

# API.md-совместимый вид
GET /resale/api?action={id}&email=…&token=…
POST

Покупка (V2)

Двухшаговый flow: шаг 1 — размещение заказа (списывает баланс атомарно), возвращает invoice_id. Шаг 2 — забор содержимого по этому invoice_id (см. следующий раздел).

Обязательное поле tier_key — возрастной интервал из списка товара (t0_3, t4_14, t15_20, t21). Цена и склад берутся именно из этого интервала.
Пример запроса
POST /resale/api
Content-Type: application/json

{
  "email": "you@example.com",
  "token": "…",
  "action": "purchase_v2",
  "goods_id": 1,
  "tier_key": "t0_3",
  "quantity": 10
}
Пример ответа
{
  "success": true,
  "data": {
    "invoice_id": "29BF50fC037d14d",
    "goods_id": 1,
    "tier_key": "t0_3",
    "quantity": 10,
    "unit_price_cents": 7000,
    "total_cents": 70000,
    "list_price_cents": 7000,
    "discount_percent": 0
  }
}
curl
curl -s https://shooac.top/resale/api \
  -H "Content-Type: application/json" \
  -d '{"email":"you@example.com","token":"…","action":"purchase_v2","goods_id":1,"tier_key":"t0_3","quantity":10}'
GET

Содержимое заказа

Забирает карточки по invoice_id. Можно вызвать несколько раз — контент неизменен. Через 24 часа после доставки контент удаляется — придёт 410 Gone / content_expired.

JSON
GET /resale/api?action=query_card&invoice_id={id}&email=…&token=…
{
  "success": true,
  "data": {
    "invoice_id": "29BF50fC037d14d",
    "goods_id": 1,
    "quantity": 10,
    "status": "delivered",
    "card_content": "login:pass:cookie\nlogin:pass:cookie\n…",
    "expired": false
  }
}
Сырой TXT (для скачивания файлом)
GET /resale/api?action=query_card&invoice_id={id}&format=txt&email=…&token=…

Ошибки

HTTP message Значение
401unauthorizedНеверный email/token или пользователь выключен.
400unknown_actionЗначение action не поддерживается.
400missing_fieldsНе указан goods_id, tier_key или quantity.
400bad_tierНеизвестный tier_key.
400bad_quantityКоличество вне диапазона (1…5000).
404product_not_foundТовар не существует / не в канале.
409product_unavailableТовар выключен администратором.
409tier_unavailableИнтервал выключен / не задан для товара.
409out_of_stockНедостаточно единиц на складе.
402insufficient_fundsНе хватает средств на балансе.
410content_expiredКонтент карточек уже удалён (>24 ч).
429rate_limitedПревышен лимит запросов.
500server_errorВнутренняя ошибка — повторите позже.

Лимиты

  • Rate-limit API: до 120 запросов в минуту с одного IP.
  • Максимальное количество в одной покупке: 5000 единиц.
  • Тело POST-запроса: не более 64 КБ.
  • Токен — один активный на пользователя; ротация мгновенная.

Вопросы, ошибки, ротация токена — пишите администратору.