Ключи активации

Ключ — это одна оплаченная подписка, которую клиент включает сам: вводит ключ, присылает данные аккаунта, и мы включаем тариф. Вы покупаете ключи с баланса и раздаёте как товар.

Обновлено 28 октября 2026 г. · 8 мин чтения
Markdown

Как выглядит ключ

Ключ — 16 знаков группами по 4, буквы и цифры: 7K2M-9QXH-4RWD-P8NY. Похожих букв нет — O и 0, I и 1 ввод считает одним знаком, а последний знак контрольный: опечатку страница видит сразу и попытку на неё не тратит. Перебором ключ не подобрать: страница даёт 5 попыток за 10 мин.

К ключу идёт ссылка https://activate.astrum.shop/#k=7K2M-9QXH-4RWD-P8NY — по ней ключ подставится сам. Ключ — во фрагменте адреса после #: на сервер его браузер не отправляет.

Ключ — это товар

Кто знает ключ, тот и включит по нему подписку. Храните ключи зашифрованными, не пишите их в логи и отдавайте только покупателю — своим каналом.

Статусы

status Что с ключом
available свободен: клиент ещё не прислал данные — ключ можно отдать кому угодно
activating клиент прислал данные — включаем подписку
activated подписка включена; с этого момента — 7 дней гарантии
expired не активирован за 45 дней — сгорел, деньги не возвращаются
refunded цену вернули на баланс — ключ погашен
availableactivatingactivated

Активация не прошла — ключ снова available, когда попытку закрыли

Поставщик отказал или клиент прислал данные не того аккаунта — ключ остаётся activating: клиент может прислать другие данные, а попытку разбираем мы. Ключ снова свободен со старым сроком (available, событие key.attempt_failed), когда попытку закрыли: клиент отказался от проверки личности или её закрыли мы. Тогда отдайте ключ этому же клиенту с другим аккаунтом или другому клиенту.

Просто ввести ключ на странице — ничего не занимает: ключ занят, только когда клиент прислал данные. Клиент вернулся по тому же ключу — видит ход или итог своей активации, а не ошибку. Двое ввели один ключ одновременно — данные примем у того, кто прислал их первым.

Срок ключа

Ключ живёт 45 дней с покупки — до expires_at. Не активирован за это время — сгорает, деньги за него не возвращаются. За 7 дней до срока присылаем событие key.expiring и сообщение в Telegram. Ключ, по которому клиент уже прислал данные, пока идёт активация, не сгорает. Клиент пришёл со сгоревшим ключом — напишите нам: можем продлить его, и он снова available на полный срок.

Каталог

GET /v1/catalog — у тарифа один product_id, а как он доходит до клиента — delivery_methods: у каждого способа своя цена price_usdt и срок subscription_days. Каталог обновляется раз в 1 мин.

В каталоге — только то, что покупается ключами: способы activation и card_payment, подписку по ним клиент включает сам, на странице активации. Ключ или готовый аккаунт (key, account) и «новый аккаунт от нас» (new_account) ключами не продаются: в каталоге их нет, а покупка с таким delivery_method ответит 40006 delivery_method_unavailable.

У способа бывает несколько сроков — например, подписка на 30 и на 90 дней. Все они — в terms способа, самый короткий первым: его цена и срок стоят и в самой строке способа.

У подписки бывает несколько видов — тогда у способа несколько строк, у каждой своя цена и поле kind:

kind Вид подписки
app_store App Store активация — ключом поставщика; тариф потом повышается только через App Store
web Web-активация — подписку оплачивают картой на сайте сервиса, тариф клиент повышает и продлевает сам
web_payment Web-активация нашей картой — подписку на аккаунте клиента оплачиваем мы своей картой (способ card_payment)
null у способа вида нет

Купить ключи

POST /v1/keys — тариф, количество и номер заказа у вас: цена списывается с баланса, ключи и ссылки для клиента — в ответе. За раз — до 100 ключей одного тарифа.

  • ref — номер заказа у вас. Повтор с тем же ref и тем же телом вернёт те же ключи (200) и второй раз не спишет — так безопасно повторять после обрыва связи. Тот же ref с другим телом — 51002 ref_conflict.
  • delivery_method — только если способов у тарифа несколько. Без него — 40005 delivery_method_required со списком способов в details: молча выбирать нельзя, у способов разная цена.
  • subscription_days — только если сроков несколько. Без него — самый короткий срок; срока, которого у способа нет, — 40007 subscription_days_unavailable.
  • kind — только если видов несколько. Без него — 40008 kind_required со списком видов в details; вида, которого у способа нет, — 40009 kind_unavailable.

Пример: Покупка ключа с баланса

{
  "product_id": "3f6c0e7e-2b1d-4c1a-9a57-4d0f1b8e2c11",
  "quantity": 1,
  "ref": "order-58213"
}
{
  "ref": "order-58213",
  "keys": [
    {
      "key_id": "9b2f6c1e-4d7a-4b0e-8f3c-1a5d2e7c9b40",
      "code": "7K2M-9QXH-4RWD-P8NY",
      "link": "https://activate.astrum.shop/#k=7K2M-9QXH-4RWD-P8NY",
      "status": "available",
      "product_id": "3f6c0e7e-2b1d-4c1a-9a57-4d0f1b8e2c11",
      "title": "ChatGPT Plus",
      "delivery_method": "activation",
      "kind": "web",
      "subscription_days": 30,
      "price_usdt": "20.00",
      "ref": "order-58213",
      "created_at": "2026-10-14T10:14:03Z",
      "expires_at": "2026-11-28T10:14:03Z",
      "activated_at": null,
      "warranty_until": null,
      "last_attempt_failed_at": null,
      "last_attempt_reason": null
    }
  ],
  "price_usdt": "20.00",
  "charged_usdt": "20.00",
  "balance_usdt": "80.00"
}

Цена и опт

Цена ключа — ваша: меньшая из цены ступени опта и личной цены, если она есть. Ступень — сколько ключей вы купили за 30 дней вместе с этой покупкой: купили сразу 20 — уже эти ключи идут по цене «20+».

  • price_usdt тарифа в GET /v1/catalog — сколько спишется за следующий ключ: ступень уже посчитана вместе с ним.
  • prices того же тарифа — цены всех ступеней: min_keys — с какого числа ключей за 30 дней действует цена, price_usdt — цена ключа на ней. Покупка, после которой ключей станет не меньше min_keys, вся идёт по этой цене. Те же цены — в кабинете, вкладка «Цены».
  • В ответе покупки — price_usdt за ключ и charged_usdt за всю покупку.

Список и ключ по номеру

GET /v1/keys — ключи вашего магазина, свежие сверху; фильтры status, ref и product_id, страница — page, по 50 ключей (в ответе total и pages). Страница за последней — пустой keys: листайте, пока page меньше pages. GET /v1/keys/{key_id} — один ключ: статус, срок, когда активирован и до какого числа гарантия (warranty_until). Значение ключа (code) и ссылка (link) есть в обоих ответах.

Проверить ключи

POST /v1/keys/lookup — ключ по нему самому, когда номера под рукой нет: клиент прислал ключ в поддержку. В теле — codes, до 100 ключей за раз; регистр, пробелы и дефисы не важны. В ответе results — по строке на каждый ключ, в том же порядке:

  • found — ключ вашего магазина, в key — ключ целиком, как в GET /v1/keys/{key_id};
  • not_found — такого ключа у вашего магазина нет: чужой ключ отвечает так же, как несуществующий;
  • typo — не ключ: не та длина, чужие знаки или не сходится контрольный знак.

Ключ — в теле, а не в адресе: адреса оседают в журналах серверов.

Пример: Проверка ключей, которые прислал клиент

{
  "codes": [
    "7k2m 9qxh 4rwd p8ny",
    "7K2M-9QXH-4RWD-P8N"
  ]
}
{
  "results": [
    {
      "code": "7k2m 9qxh 4rwd p8ny",
      "result": "found",
      "key": {
        "key_id": "9b2f6c1e-4d7a-4b0e-8f3c-1a5d2e7c9b40",
        "code": "7K2M-9QXH-4RWD-P8NY",
        "link": "https://activate.astrum.shop/#k=7K2M-9QXH-4RWD-P8NY",
        "status": "activated",
        "product_id": "3f6c0e7e-2b1d-4c1a-9a57-4d0f1b8e2c11",
        "title": "ChatGPT Plus",
        "delivery_method": "activation",
        "kind": "web",
        "subscription_days": 30,
        "price_usdt": "20.00",
        "ref": "order-58213",
        "created_at": "2026-10-14T10:14:03Z",
        "expires_at": "2026-11-28T10:14:03Z",
        "activated_at": "2026-10-15T09:02:41Z",
        "warranty_until": "2026-10-22T09:02:41Z",
        "last_attempt_failed_at": null,
        "last_attempt_reason": null
      }
    },
    {
      "code": "7K2M-9QXH-4RWD-P8N",
      "result": "typo",
      "key": null
    }
  ]
}

Сколько держать про запас

Склад под ключи мы не держим: тариф берём у поставщика, когда клиент вводит ключ, — поэтому покупку ключей не ограничивает и in_stock каталога. Если тариф перестал активироваться у поставщика, свободные ключи этого тарифа гасим и возвращаем их цену на баланс — с сообщением в Telegram и событием key.refunded.

Отказы

Ветвитесь по code, а не по тексту: message написан для людей и может меняться. Отказы доступа — общие для всех методов, полная таблица — в разделе «Коды ошибок».

403
10006 terms_not_accepted
Не приняты действующие условия партнёра — примите их в кабинете «Интеграция»
Откройте кабинет «Интеграция» на astrum.shop и примите новую редакцию условий — покупка заработает сразу. Действующая редакция — в details.terms_version.
402
30001 not_enough_balance
На балансе не хватает денег на эту покупку
Пополните баланс — адреса в GET /v1/balance/top-up-addresses — и повторите.
404
40001 product_not_found
Такого товара нет в каталоге
Возьмите product_id из GET /v1/catalog.
422
40005 delivery_method_required
У товара несколько способов выдачи — укажите delivery_method
Способы товара — в details.delivery_methods и в каталоге.
422
40006 delivery_method_unavailable
У товара нет такого способа выдачи
Способы товара — в details.delivery_methods и в каталоге.
422
40007 subscription_days_unavailable
У способа выдачи нет такого срока
Сроки способа — в details.subscription_days и в каталоге (terms). Без subscription_days покупка берёт самый короткий срок.
422
40008 kind_required
У способа выдачи несколько видов подписки — укажите kind
Виды способа — в details.kinds и в каталоге (kind у строк способа).
422
40009 kind_unavailable
У способа выдачи нет такого вида подписки
Виды способа — в details.kinds и в каталоге (kind у строк способа).
422
51002 ref_conflict
Этот ref уже занят покупкой с другими параметрами
Повтор с тем же ref — только с тем же телом запроса: так он вернёт те же ключи. Новая покупка — с новым ref.
429
20002 too_many_orders
Слишком много покупок в минуту — повторите позже
Подождите Retry-After секунд. Лимит — в GET /v1/account.
429
20004 daily_order_limit_reached
Исчерпан лимит ключей на сегодня
Новые покупки — после 00:00 UTC (03:00 по Москве). Нужно больше — напишите в поддержку.
429
20005 daily_spend_limit_reached
Исчерпан суточный лимит трат
Сколько ещё можно потратить — available_today_usdt в GET /v1/balance. Лимит обнуляется в 00:00 UTC.
422
11006 validation_error
Запрос не прошёл проверку
Что не так — в details.errors: поле и причина.
Страница помогла?