Выпуск подарочных карт/API выпуска и токены
API выпуска подарочных карт
Токен выпуска позволяет вашему магазину или скриптам автоматически создавать подарочные карты, выполнять прямые пополнения и аннулировать карты — без ручной работы на сайте.
Токен выпуска может только создавать, запрашивать и аннулировать подарочные карты, а также выполнять прямые пополнения. Он не может вызывать модели и не взаимозаменяем с API-ключами на странице API. Чтобы создавать подарочные карты вручную на сайте, токен не нужен. К подарочным картам →
На этой страницеexpand_more
Создание токена выпускаlink
- 1
Откройте вкладку «Токены выпуска»
Войдите в аккаунт, откройте страницу «Подарочные карты и прямое пополнение», перейдите на вкладку «Токены выпуска» и нажмите «Новый токен выпуска».
- 2
Укажите название и необязательные ограничения
Название — до 60 символов, например «Магазин цифровых товаров». Белый список IP и дневной лимит необязательны; если оставить их пустыми, ограничений нет. Платформа не задаёт значений по умолчанию.
- 3
Сразу сохраните токен
Токен начинается с wkt_ и показывается только один раз. Если потеряете его — отзовите и создайте новый. При создании токена приходят уведомление на сайте и письмо.
- Base URL
- https://wokey.ai/api/issuer/v1
- Авторизация
- Передавайте Authorization: Bearer wkt_… в каждом запросе. Сессия входа на сайте не может вызывать эти эндпоинты, а токен выпуска не может вызывать никакие другие.
- Запросы и ответы
- Тела запросов и ответов — JSON. Суммы в ответах — строки с двумя знаками после точки (например, "10.00"), время — ISO 8601 в UTC.
Быстрый стартlink
Каждый раз, когда ваш магазин завершает заказ, вызывайте эндпоинт создания с count = 1 и ID заказа в качестве ключа идемпотентности. Заранее запасать коды не нужно, а повторный вызов для того же заказа создаст коды только один раз.
curl -X POST https://wokey.ai/api/issuer/v1/codes \
-H "Authorization: Bearer wkt_YOUR_ISSUING_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-20261017-0001" \
-d '{ "sourceType": "provider", "amountUsd": 10, "count": 1, "label": "order-20261017-0001" }'{
"batch": {
"id": "icb_…",
"sourceType": "provider",
"amountUsd": "10.00",
"count": 1,
"totalUsd": "10.00",
"label": "order-20261017-0001",
"createdAt": "2026-10-17T08:00:00.000Z"
},
"replayed": false,
"codes": [
{
"id": "ic_…",
"batchId": "icb_…",
"kind": "code",
"sourceType": "provider",
"amountUsd": "10.00",
"codeHint": "7K2M",
"status": "active",
"label": "order-20261017-0001",
"createdAt": "2026-10-17T08:00:00.000Z",
"redeemedAt": null,
"redeemedByMaskedEmail": null,
"voidRequestedAt": null,
"voidEffectiveAt": null,
"voidedAt": null,
"frozenAt": null,
"code": "WK-4F9Q-T3XA-8HRB-7K2M",
"redeemUrl": "https://wokey.ai/redeem#WK-4F9Q-T3XA-8HRB-7K2M"
}
]
}code — код активации, redeemUrl — ссылка для активации; отправьте покупателю любой из них. Покупатель активирует карту после входа в Wokey, и номинал зачисляется на его API-кредиты.
Эндпоинтыlink
Все пути начинаются с https://wokey.ai.
/api/issuer/v1/balanceБалансВозвращает доступный для вывода баланс каждого источника: provider (null, если у вас нет аккаунта провайдера), referrer, а для источника api — его переключатель, соответствие условиям и доступный баланс. Заодно возвращает средства за аннулированные карты, у которых закончился 72-часовой период ожидания.
/api/issuer/v1/codesСоздание подарочных картСписывает средства с выбранного источника и создаёт пачку карт одного номинала. Возвращает batch, replayed (был ли это повтор по ключу идемпотентности) и codes (каждая карта с code и redeemUrl). Номинал списывается сразу при создании.
| Параметр | Обязательный | Описание |
|---|---|---|
| sourceType | Да | provider, referrer или api; см. «Источники средств». |
| amountUsd | Да | Номинал одной карты в USD, от 1 до 1 000 000, не более двух знаков после точки. |
| count | Нет | Количество карт, от 1 до 500. По умолчанию 1. |
| label | Нет | Заметка до 120 символов, например ID заказа или канал. По ней можно искать в списке. |
| idempotencyKey | Да | Ключ идемпотентности до 100 символов. Можно передать и в заголовке Idempotency-Key. |
/api/issuer/v1/codesСписок картВозвращает { items, nextCursor }, новые сначала. Список не содержит сами коды, только последние 4 символа в codeHint; у активированных карт есть замаскированный email получателя в redeemedByMaskedEmail.
| Параметр | Обязательный | Описание |
|---|---|---|
| status | Нет | active, voiding, voided, redeemed или frozen. |
| sourceType | Нет | Фильтр по источнику средств. |
| batchId | Нет | Только одна пачка. |
| search | Нет | Поиск по заметке или последним 4 символам кода. |
| code | Нет | Полный код, точное совпадение. Помогает при спорах с покупателями. |
| cursor | Нет | nextCursor из предыдущей страницы. |
| limit | Нет | Размер страницы, по умолчанию 50, максимум 200. |
/api/issuer/v1/codes/:idДанные картыВозвращает одну карту вместе с code и redeemUrl. Каждое чтение кода записывается в журнал аудита.
/api/issuer/v1/codes/:id/voidАннулирование картыАннулировать можно только неактивированные (active) карты. Аннулированная карта сразу перестаёт работать, а номинал возвращается на исходный источник через 72 часа. Если карты нет или она не active, возвращается issued_credit_not_found.
/api/issuer/v1/codes/:id/void/cancelОтмена аннулированияОтменяет аннулирование в течение 72-часового периода ожидания, карта снова становится active. Если карта не аннулируется, возвращается issued_credit_not_voiding.
/api/issuer/v1/direct-topupsПрямое пополнениеЗачисляет сумму прямо на API-кредиты другого аккаунта без создания кода; получатель получает уведомление. Возвращает { direct, replayed }.
| Параметр | Обязательный | Описание |
|---|---|---|
| sourceType | Да | provider или referrer. Источник API-кредитов для прямых пополнений не поддерживается. |
| recipientIdentifier | Да | Код получения (PAY-XXXX-XXXX) или email аккаунта получателя. Нельзя указать себя. |
| amountUsd | Да | Сумма в USD, от 1 до 1 000 000, не более двух знаков после точки. |
| label | Нет | Заметка до 120 символов. |
| idempotencyKey | Да | Ключ идемпотентности до 100 символов. Можно передать и в заголовке Idempotency-Key. |
Источники средствlink
| sourceType | Источник средств | Примечания |
|---|---|---|
| provider | Доход провайдера | Ваш доход провайдера, доступный для вывода. Нужен аккаунт провайдера, расчёты которого не заморожены. |
| referrer | Реферальное вознаграждение | Реферальное вознаграждение, доступное для вывода. |
| api | API-кредиты | Только подарочные карты, без прямых пополнений. Доступно только подходящим аккаунтам: каждый API-кредит должен прийти из пополнения в блокчейне или из вашего собственного дохода провайдера либо реферального вознаграждения. Проверьте api.enabled и api.eligible в ответе balance. |
Ключи идемпотентностиlink
- Для создания карт и прямых пополнений ключ идемпотентности обязателен. Удобно использовать ID заказа.
- Ключи уникальны в пределах аккаунта и общие для сайта и API выпуска, независимо от того, какой токен отправил запрос.
- Повтор запроса с тем же ключом и теми же параметрами ничего не списывает и возвращает первый результат с replayed = true; повтор создания снова возвращает те же коды.
- Тот же ключ с другими параметрами (sourceType, amountUsd, count, а для прямого пополнения — получатель) возвращает 409 idempotency_key_conflict.
- После сетевого таймаута или ответа 5xx повторите запрос с тем же ключом — двойного списания не будет.
Статусы и аннулирование картlink
| status | Значение |
|---|---|
| active | Не активирована, её можно активировать. |
| redeemed | Активирована; номинал зачислен на API-кредиты получателя. |
| voiding | Аннулируется и больше не может быть активирована. В течение 72-часового периода ожидания аннулирование можно отменить. |
| voided | Аннулирована; номинал возвращён на исходный источник. |
| frozen | Заморожена платформой. Её нельзя активировать или аннулировать самостоятельно. С вопросами обращайтесь в поддержку. |
- Номинал списывается при создании карты. Карты в статусах active, voiding, redeemed и frozen считаются оплаченными; баланс возвращается только для voided.
- Если карта уже продана или подарена, после аннулирования получатель не сможет её активировать.
- Возврат после периода ожидания проводится автоматически, с уведомлением на сайте; вызов balance тоже проводит наступившие возвраты.
Коды ошибокlink
Ошибки имеют вид { "error": { "code": "…", "message": "…", "type": "invalid_request_error" } }. Ориентируйтесь на code, а не на текст message.
| code | HTTP | Значение и что делать |
|---|---|---|
| invalid_issuer_token | 401 | Токена нет, у него неверный формат, его не существует или он отозван. |
| issuer_token_ip_not_allowed | 403 | IP запроса не входит в белый список этого токена. |
| issuer_token_daily_limit_exceeded | 429 | Сумма карт и прямых пополнений через этот токен за сегодня (UTC) превысит его дневной лимит. |
| rate_limited | 429 | Слишком много запросов. Повторите позже с тем же ключом идемпотентности. |
| issued_credits_disabled | 403 | Платформа приостановила новый выпуск. Выпущенные карты по-прежнему активируются, а запросы, аннулирование и его отмена работают. |
| issuer_not_eligible | 403 | Этот аккаунт не может выпускать подарочные карты. |
| invalid_source_type | 400 | sourceType не равен provider, referrer или api. |
| invalid_amount | 400 | Сумма вне диапазона от 1 до 1 000 000 или содержит больше двух знаков после точки. |
| invalid_count | 400 | count — не целое число от 1 до 500. |
| invalid_label | 400 | label не строка или длиннее 120 символов. |
| invalid_idempotency_key | 400 | Ключ идемпотентности отсутствует или длиннее 100 символов. |
| insufficient_withdrawable_balance | 400 | Недостаточно дохода провайдера или реферального вознаграждения, доступного для вывода. |
| insufficient_balance | 400 | Недостаточно API-кредитов. |
| api_source_not_eligible | 403 | Аккаунт не может выпускать карты из API-кредитов; причина — в api.disqualifiedBy ответа balance. |
| api_source_direct_not_supported | 400 | Источник API-кредитов нельзя использовать для прямых пополнений. |
| provider_profile_not_found | 404 | Выбран источник provider, но у аккаунта нет аккаунта провайдера. |
| provider_settlement_frozen | 403 | Расчёты провайдера заморожены, доход провайдера использовать нельзя. |
| withdrawable_balance_mismatch | 409 | Ошибка сверки баланса. Обратитесь в поддержку. |
| recipient_required | 400 | В прямом пополнении не указан получатель. |
| recipient_not_found | 404 | Аккаунт с таким кодом получения или email не найден. |
| recipient_not_eligible | 403 | Этот аккаунт сейчас не может получать кредиты. |
| cannot_transfer_to_self | 400 | Нельзя пополнить собственный аккаунт. |
| idempotency_key_conflict | 409 | Этот ключ идемпотентности уже использован для запроса с другими параметрами. |
| issued_credit_not_found | 404 | Карты нет, она не ваша или (при аннулировании) не в статусе active. |
| issued_credit_not_voiding | 409 | Карта не аннулируется или период ожидания истёк, отменить аннулирование нельзя. |
| code_generation_failed | 503 | Сейчас не удалось создать коды, средства не списаны. Повторите с тем же ключом идемпотентности. |
Ограничения и безопасностьlink
- Создание карт и прямые пополнения: не более 60 в минуту на аккаунт (сайт и API выпуска вместе).
- Чтение данных карты (с кодом): не более 120 в минуту на аккаунт.
- Не более 500 карт в пачке; номинал одной карты — от 1 до 1 000 000 USD.
- Не более 20 неотозванных токенов выпуска на аккаунт и не более 20 IP в белом списке каждого токена.
Рекомендации по безопасности
- Храните токен только на сервере (в бэкенде магазина или на своём сервере). Не размещайте его во фронтенде сайта, в приложении или в публичном репозитории.
- Если у вас фиксированный исходящий IP, задайте белый список. Записи сравниваются с IP точно; диапазоны не поддерживаются.
- Задайте дневной лимит, чтобы ограничить потери при утечке токена. Лимит считает карты и прямые пополнения вместе за сутки UTC.
- Смена пароля или выход из всех сессий не отзывает токены выпуска. Если подозреваете утечку, отзовите токен на вкладке «Токены выпуска» — он сразу перестанет работать.
- На вкладке «Токены выпуска» видно, когда и с какого IP каждый токен использовался последний раз. Проверяйте это время от времени.