Ключи активации
Ключ — это одна оплаченная подписка, которую клиент включает сам: вводит ключ, присылает данные аккаунта, и мы включаем тариф. Вы покупаете ключи с баланса и раздаёте как товар.
Как выглядит ключ
Ключ — 16 знаков группами по 4, буквы и цифры: 7K2M-9QXH-4RWD-P8NY. Похожих букв нет — O и 0, I и 1 ввод считает одним знаком, а последний знак контрольный: опечатку страница видит сразу и попытку на неё не тратит. Перебором ключ не подобрать: страница даёт 5 попыток за 10 мин.
К ключу идёт ссылка https://activate.astrum.shop/ — по ней ключ подставится сам. Ключ — во фрагменте адреса после #: на сервер его браузер не отправляет.
Ключ — это товар
Кто знает ключ, тот и включит по нему подписку. Храните ключи зашифрованными, не пишите их в логи и отдавайте только покупателю — своим каналом.
Статусы
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/ — один ключ: статус, срок, когда активирован и до какого числа гарантия (warranty_until). Значение ключа (code) и ссылка (link) есть в обоих ответах.
Проверить ключи
POST /v1/keys/ — ключ по нему самому, когда номера под рукой нет: клиент прислал ключ в поддержку. В теле — 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 написан для людей и может меняться. Отказы доступа — общие для всех методов, полная таблица — в разделе «Коды ошибок».
10006 terms_not_accepteddetails.terms_version.30001 not_enough_balanceGET /v1/balance/top-up-addresses — и повторите.40001 product_not_foundproduct_id из GET /v1/catalog.40005 delivery_method_requireddetails.delivery_methods и в каталоге.40006 delivery_method_unavailabledetails.delivery_methods и в каталоге.40007 subscription_days_unavailabledetails.subscription_days и в каталоге (terms). Без subscription_days покупка берёт самый короткий срок.40008 kind_requireddetails.kinds и в каталоге (kind у строк способа).40009 kind_unavailabledetails.kinds и в каталоге (kind у строк способа).51002 ref_conflictref — только с тем же телом запроса: так он вернёт те же ключи. Новая покупка — с новым ref.20002 too_many_ordersRetry-After секунд. Лимит — в GET /v1/account.20004 daily_order_limit_reached20005 daily_spend_limit_reachedavailable_today_usdt в GET /v1/balance. Лимит обнуляется в 00:00 UTC.11006 validation_errordetails.errors: поле и причина.