Программная активация Claude Pro и ChatGPT Plus на аккаунт покупателя — обычно 1–3 секунды. Ниже всё, что нужно для интеграции: контракт, порядок работы, защита от двойного списания и справочник методов.
1. Базовый URL и авторизация
https://activate.pay2win.store
Все запросы — POST, тело JSON. Заголовки: Content-Type: application/json и X-API-Key: ВАШ_КЛЮЧ. Ключ выдаётся персонально: по нему видно, чьи активации в журнале, поэтому под каждого исполнителя — свой.
curl -X POST https://activate.pay2win.store/pub/v1/stock \
-H "Content-Type: application/json" \
-H "X-API-Key: ВАШ_КЛЮЧ" \
-d '{"vendor":"claude"}'
2. Контракт ответов и коды ошибок
// успех
{"ok": true, ...данные...}
// отказ
{"ok": false, "error": "текст для человека", "code": "машинный_код"}
Проверяйте ok, а не только HTTP-код. Бизнес-отказ (например «код уже использован») приходит с HTTP 200 и ok:false. HTTP важен только для транспорта: 401 — ключ, 429 — частота, 502 — временная недоступность.
| code | Значение | Что делать |
not_found | Кода нет или недействителен | Окончательно |
already_claimed | Код уже использован | Окончательно; придут used_at, used_by, product |
in_progress | По коду уже идёт активация | Вторую не создавать — см. п. 5 |
queued_exists | По коду уже стоит очередь | Дождаться или снять очередь |
wrong_channel | Код другого канала | Убрать channel или указать верный |
out_of_stock | Нет в наличии | Повторить позже |
transient | Временная ошибка сервиса | Повторить через 30–60 с |
captcha | Проверка не пройдена | Повторить через 30–60 с |
not_queued | Кода нет в очереди | Окончательно |
cancel_failed | Не удалось снять с очереди | Повторить через минуту |
bad_request | Некорректное тело запроса | Исправить запрос |
unauthorized | Неверный ключ (401) | Проверить X-API-Key |
rate_limited | Слишком часто (429) | Снизить частоту |
error | Прочая ошибка | Повторить позже |
3. Каналы и форматы кодов
| Канал | Формат кода | Товары | Очередь |
| App Store | 36 символов, UUID
79A6A94D-5E72-46E0-B978-EE3573CD0B93 | Claude Pro, ChatGPT Plus | нет |
| Play Market | компактный, 16 символов или PLUS-… | ChatGPT Plus | да |
Канал определяется по формату кода автоматически — channel передавать не обязательно. Если передали и он противоречит формату, придёт wrong_channel: это защита от активации кода не в том канале.
account — аккаунт покупателя, всегда UUID 36 символов в нижнем регистре: у Claude это Organization ID (claude.ai → настройки аккаунта), у ChatGPT — Account ID (поле id из блока account).
vendor — claude или chatgpt, по умолчанию claude.
4. Порядок работы
1. (необязательно) /pub/v1/health — если нужный канал down, активацию лучше отложить.
2. /pub/v1/activate — код + аккаунт. В ответе task_id и status.
3. Сразу сохраните task_id рядом с заказом.
4. Если status:"done" — подписка уже выдана, опрашивать не нужно.
5. Иначе опрашивайте /pub/v1/task раз в 3–10 с до done или failed.
6. queued (только Play Market) — ждёт поступления и выполнится сама; если ждать не нужно, снимите очередь, иначе код спишется позже.
7. При failed по Claude, когда подписка так и не появилась, доступно дожатие через /pub/v1/refresh по Session Key покупателя.
Статусы задачи: queued — ждёт в очереди · running — выполняется либо результат пока неизвестен · done — выдано · failed — не выдано.
Конечные только done и failed. running — это не отказ, продолжайте опрос.
5. Повторы и обрывы связи
Не повторяйте activate вслепую. Если ответ не дошёл (таймаут, обрыв), активация могла уже создаться — повтор рискует списать второй код на тот же заказ.
Что делать при обрыве на activate:
1. Вызовите /pub/v1/card с этим кодом.
2. Пришло activating:true и task_id → активация уже создана: опрашивайте этот task_id, новую не создавайте.
3. Пришло activating:false и status:"valid" → код цел, активации не было, можно повторить.
Ответ in_progress означает, что по коду уже идёт активация. Если это ваш же повтор на тот же аккаунт — вернётся та же задача как успех. Если задача создана на другой аккаунт, придёт именно отказ: чужую активацию сервис не отдаст.
| Метод | Безопасно повторять? |
stock, health, task, check, card, account, account-query | да, всегда |
activate | только после проверки через card |
cancel-queue, refresh | да, но сперва проверьте состояние |
Про failed. На Play Market код при провале возвращается в пул и остаётся рабочим — можно активировать заново. На App Store код при провале, как правило, уже израсходован: проверьте /pub/v1/card, и если код числится использованным, а подписка не пришла — используйте /pub/v1/refresh.
6. Справочник методов
POST/pub/v1/activateАктивация кода на аккаунт покупателя.
// запрос ("vendor" и "channel" необязательны — определяются автоматически)
{"card_key":"79A6A94D-…","account":"a63cfbd2-…","vendor":"claude"}
// ответ
{"ok":true,"task_id":"0f8a6d64-…","status":"queued","product":"Pro"}
Отказы:
not_found,
already_claimed,
in_progress,
wrong_channel,
transient. При
already_claimed дополнительно приходят
used_at,
used_by (маскированный) и
product.
POST/pub/v1/taskСтатус активации, опрашивать раз в 3–10 с.
{"task_id":"0f8a6d64-…"}
→ {"ok":true,"status":"queued","product":"Plus","queue_position":3}
queue_position приходит, только пока задача в очереди. Пустой
task_id — это
bad_request, а не «провал задачи».
POST/pub/v1/cardОдин код подробно: статус
и идёт ли уже по нему активация. Основной инструмент восстановления после обрыва связи.
{"card_key":"79A6A94D-…"}
→ {"ok":true,"card_key":"79A6A94D-…","status":"used","product":"Pro",
"used_at":"2026-08-02T07:46:48","used_by":"abe6…",
"activating":true,"task_id":"924b7e5f-…"}
POST/pub/v1/checkСтатусы кодов пакетом (до 100 за запрос), без активации.
{"card_keys":["79A6A94D-…","3F2A91C4-…"]}
→ {"ok":true,"items":[{"card_key":"…","status":"valid","product":"Pro",
"used_at":null,"used_by":null}]}
| status | Значение |
valid | Код цел и не использован |
used | Израсходован (есть used_at, used_by) |
queued | Стоит в очереди, ещё не израсходован |
invalid | Такого кода нет либо он отключён |
unknown | Ответа по коду не было — кода это не порочит, перепроверьте позже |
⚠️ Различайте
invalid и
unknown: первое — приговор коду, второе — лишь отсутствие ответа. Ориентируйтесь на статус
каждого элемента, а не на общий
ok. Дубликаты и коды неверного формата отбрасываются, поэтому сверяйте элементы по полю
card_key, а не по порядку.
POST/pub/v1/cancel-queueСнять активацию с очереди и освободить код.
Только Play Market.
{"card_key":"PLUS-T7G2KNTRYCDDWX4L"} → {"ok":true}
Очередь выполнится
сама при поступлении товара и спишет код. Если заказ отменён или покупатель ждать не готов — очередь обязательно снимать, иначе код сгорит впустую. Отказы:
not_queued,
cancel_failed,
already_claimed,
not_found.
POST/pub/v1/refreshДожать подписку
Claude по Session Key покупателя, если активация прошла, а подписка не появилась.
{"card_key":"79A6A94D-…","session_key":"sk-ant-…"} → {"ok":true}
task_id передавать не нужно — активация находится по коду автоматически (в том числе созданная через API или из другого браузера). Если активации по коду не было →
not_found.
POST/pub/v1/stockНаличие.
// App Store
{"vendor":"claude"} → {"ok":true,"products":[{"name":"Pro","level":"high","count":1169}]}
// Play Market
{"vendor":"chatgpt","channel":"play"} → {"ok":true,"availability":"plenty","queued":0}
availability:
plenty /
normal /
low /
none.
queued — длина очереди канала.
POST/pub/v1/healthПроходят ли активации прямо сейчас — по каждому продукту и каналу отдельно.
{} → {"ok":true,"health":{
"claude": {"status":"ok", "rate":1.0, "samples":12},
"chatgpt_appstore": {"status":"down", "rate":0.0, "samples":3},
"chatgpt_play": {"status":"unknown", "rate":null, "samples":0}}}
ok — активации проходят ·
degraded — часть не проходит ·
down — не проходят, активацию лучше отложить ·
unknown — мало данных.
Это статистика недавних
реальных активаций, а не самопроверка: волну сбоев нельзя предсказать заранее, но видно в первые минуты.
POST/pub/v1/accountПроверка подписки ChatGPT по Account ID, без активации.
{"account_id":"29608ba8-…"}
→ {"ok":true,"info":{"account_id":"…","entitlements":[…],"subscriptions":[…]}}
У записей есть
is_active и
expires_date — по ним видно, есть ли подписка сейчас.
POST/pub/v1/account-queryКакие коды активировались на аккаунт.
{"account":"a63cfbd2-…"} // UUID, email или телефон
→ {"ok":true,"items":[{"card_key":"…","status":"used","product":"Pro","used_at":"…"}]}
Пустой
items означает именно отсутствие активаций: при недоступности сервиса придёт ошибка, а не пустой список.
7. Ограничения
| Одновременные активации | 2 в работе; остальные встают в очередь и выполняются по мере освобождения — ничего не теряется |
| Частота опроса | /pub/v1/task — раз в 3–10 с; чаще не нужно и не ускорит |
| Пакет проверки | до 100 кодов за один /pub/v1/check |
| Превышение частоты | HTTP 429 и code:"rate_limited" — пауза и повтор |
8. Пример интеграции
Полный цикл одного заказа с защитой от повторного списания:
BASE = "https://activate.pay2win.store"
H = {"Content-Type": "application/json", "X-API-Key": КЛЮЧ}
# 1. активация; при обрыве связи НЕ повторяем вслепую
try:
r = post(BASE + "/pub/v1/activate",
{"card_key": code, "account": buyer_account}, headers=H).json()
except Timeout:
c = post(BASE + "/pub/v1/card", {"card_key": code}, headers=H).json()
if c.get("activating"):
r = {"ok": True, "task_id": c["task_id"], "status": "queued"} # продолжаем ту же
else:
return retry_later() # код цел
if not r["ok"]:
if r["code"] in ("not_found", "already_claimed"):
return fail_order(r["error"]) # окончательно
return retry_later() # transient / captcha / out_of_stock
save_task_id(order, r["task_id"]) # сохранить СРАЗУ
# 2. опрос до конечного статуса
while True:
sleep(5)
t = post(BASE + "/pub/v1/task", {"task_id": r["task_id"]}, headers=H).json()
if t["status"] == "done":
return deliver(order)
if t["status"] == "failed":
return handle_failure(order) # см. п.5
# queued / running — продолжаем; при queued можно показать t.get("queue_position")