KODARIO/ developers
KODARIO ДЛЯ РАЗРАБОТЧИКОВ

Твой сервис.
Наш каталог.

Подключай цифровые товары к своему сайту,
боту или системе продаж через один API.

ТВОЁ ПОДКЛЮЧЕНИЕ К KODARIOv1
# Получить каталог аренды
curl --get "https://kodario.pro/api/v1/rental/products" \
  --data-urlencode "currency=USD" \
  --data-urlencode "available_only=true" \
  -H "X-API-Key: $KODARIO_API_KEY"
JSON · HTTPS · Покупки в USD
АВТОРИЗАЦИЯX-API-Key
ЛИМИТ ЗАПРОСОВ300 / минуту / ключ
ОБНОВЛЕНИЕ НАЛИЧИЯКаждые 10 минут
СРОКИ АРЕНДЫ1 · 7 · 30 дней
01 / ПОДКЛЮЧЕНИЕ

От ключа к первому запросу

Войди в аккаунт, создай ключ ниже и передавай его в заголовке каждого запроса. API предназначен для подключения с сервера — ключ не должен попадать в код публичной страницы.

BASE URLhttps://kodario.pro/api/v1
  1. 01Создай ключДо 5 активных ключей на аккаунт.
  2. 02Прочитай каталогОбрабатывай все страницы ответа.
  3. 03Обновляй наличиеУчитывай available и дату проверки.
Что доступно в этой версии

Каталог всех опубликованных типов товаров, варианты и параметры, предварительный расчёт, точные котировки, покупка с баланса, история заказов и транзакций, выдача цифровых товаров, логины аренды и Steam Guard. Котировка ничего не покупает и не резервирует товар. Покупку создаёт только POST /orders.

02 / ДОСТУП

Твои API-ключи

Отдельный ключ для каждого проекта. Полный ключ показывается только при создании. При смене пароля аккаунта все ключи отзываются. По умолчанию ключ читает только каталог. Чтобы покупать и получать данные заказов, при создании отметь «Разрешить покупки». Уже выданные ключи не получают доступ к балансу автоматически.

Проверяем вход в аккаунт…

03 / ТОВАРЫ

Каталог и наличие

API возвращает опубликованные товары. Недоступные позиции остаются с available: false, чтобы ты мог скрывать их у себя. Скрытые вручную, удалённые и ожидающие модерации товары не выдаются.

GET/productsВсе цифровые товары

Параметры: currency — USD по умолчанию; остальные коды — из /currencies; limit — 1–100, по умолчанию 100; offset — с 0; q — поиск по названию; category_id — точная категория; available_only=true — только доступные.

curl --get "https://kodario.pro/api/v1/products" \
  --data-urlencode "currency=RUB" \
  --data-urlencode "limit=100" \
  --data-urlencode "offset=0" \
  -H "X-API-Key: $KODARIO_API_KEY"

Ответ содержит data, total, limit и offset. Увеличивай offset на limit, пока не получишь все товары.

ПРИМЕР СТРУКТУРЫ · ЦЕНЫ И ID УСЛОВНЫЕ
{
  "data": [{
    "id": 123,
    "title": "Название игры",
    "type": "rental",
    "currency": "USD",
    "price_from_minor": 31,
    "available": true,
    "rental_plans": [
      { "days": 1, "price_minor": 31 },
      { "days": 7, "price_minor": 137 },
      { "days": 30, "price_minor": 450 }
    ],
    "inventory_checked_at": "2026-09-22T12:00:00Z"
  }],
  "total": 1, "limit": 100, "offset": 0,
  "currency": "USD", "inventory_refresh_seconds": 600
}

Денежные поля в USD передаются в центах и допускают 2 знака после запятой: 6.25 означает 0.0625 USD. При оформлении передавайте полученную цену без округления. price_from_minor — минимальная цена пакета аренды либо минимальная цена цифрового товара. Для пополнений с произвольной суммой это ориентир за единицу price_unit, а не итог к оплате. Поля kind и requires_options показывают способ оформления: rental, shop, recharge, gift, skins или digital. Полная схема полей есть в OpenAPI. Набор сроков у разных игр может отличаться.

GET/rental/productsТолько аренда аккаунтов

Те же параметры и структура ответа, что у /products. Возвращает товары с пакетами аренды.

curl "https://kodario.pro/api/v1/rental/products?available_only=true" \
  -H "X-API-Key: $KODARIO_API_KEY"
GET/products/{id}Один товар

Используй id из каталога. Параметр currency задаёт валюту. Ответ — объект товара. Недоступный товар возвращается с available=false, скрытый или удалённый — 404.

curl "https://kodario.pro/api/v1/products/123?currency=USD" \
  -H "X-API-Key: $KODARIO_API_KEY"
GET/categoriesКатегории и подкатегории

Массив data: id, parent_id, title, icon, rank, product_count (включая подкатегории) и direct_product_count. Пустые категории не возвращаются. Для фильтра товаров передавай точный id категории.

curl "https://kodario.pro/api/v1/categories" \
  -H "X-API-Key: $KODARIO_API_KEY"
04 / СТОИМОСТЬ

Цена без догадок

Денежные поля USD передаются в центах с точностью до двух дробных знаков: 6.25 = 0.0625 USD; 100 = 1 USD. При покупке передавай полученную цену без округления. API возвращает итоговую цену KODARIO с действующей наценкой и настройками товара. Расчёты, баланс и списания всегда в USD; остальные валюты — только для отображения.

POST/rental/calculate-priceЦена аренды

Передай product_id, days (1, 7 или 30), quantity (1–10, по умолчанию 1) и currency (USD по умолчанию). Срок должен присутствовать в rental_plans выбранного товара.

curl "https://kodario.pro/api/v1/rental/calculate-price" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id":123,"days":7,"quantity":1,"currency":"USD"}'
ПРИМЕР ОТВЕТА
{
  "product_id": 123, "days": 7, "quantity": 1,
  "currency": "USD", "unit_price_minor": 137,
  "total_minor": 137, "available": true,
  "reservation": false,
  "calculated_at": "2026-09-22T12:00:00Z"
}

Цена актуальна на calculated_at. Запрос ничего не покупает. При недоступности товара возвращается 409 product_unavailable.

POST/calculate-priceЛюбой цифровой товар

Для обычного товара days=0, для аренды — доступный срок. У товара с вариантами передай offer из /products/{id}/options. Для произвольного пополнения: offer="quantity" и params.Quantity строкой. Параметр quantity (1–10) — число одинаковых единиц, а не сумма пополнения. Это предварительная оценка: перед оплатой обязателен /quotes.

curl "https://kodario.pro/api/v1/calculate-price" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id":123,"quantity":1,"currency":"RUB"}'
05 / ОФОРМЛЕНИЕ

От выбора до получения товара

Используй ключ с разрешением покупок. Он даёт доступ к балансу, истории и данным выдачи только владельца ключа. Все действия выполняются на твоём сервере.

GET/products/{id}/optionsНоминалы, регионы и поля получателя

options: false означает обычный товар или аренду. Иначе ответ содержит доступные offers и обязательные params. Копируй ключи полей с учётом регистра: например, Account, Quantity, invite или trade_link. Для Select используй только options[].value. Минимум пополнения приходит в minimum_quantity; сумма выражена в unit. Для Steam соблюдай steam_invite_only: в некоторых товарах нужна именно быстрая ссылка-приглашение.

POST/quotesПроверка перед покупкой

Для обычного товара передай product_id; для аренды добавь days. Для товара с параметрами добавь offer и params из options. Запрос не списывает деньги. Следующий пример условный: используй ID и параметры реального товара.

curl "https://kodario.pro/api/v1/quotes" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: quote-stars-00000001" \
  -d '{"product_id":123,"offer":"quantity","params":{"Quantity":"100","Account":"recipient"}}'

200 / ready: сохрани product_id, days, price_minor и quote_id. У простых товаров и аренды quote_id пустой. 202 / pending: проверка идёт; вызывай GET /quotes/{quote_id} через число секунд из Retry-After. До ready покупку не отправляй. Проверки с параметрами ограничены 30 новыми котировками за 15 минут на аккаунт; повтор с прежним ключом не создаёт новую. Учитывай expires_at.

POST/ordersОплатить с USD-баланса

Один запрос покупает одну позицию. Передавай точную цену из ready-котировки. У товара с параметрами quote_id обязателен; у обычного товара и аренды поле пропускается.

curl "https://kodario.pro/api/v1/orders" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order-stars-00000001" \
  -d '{"product_id":123,"days":0,"currency":"USD","price_minor":163.24,"quote_id":"QUOTE_ID_FROM_READY_RESPONSE"}'

201: новый заказ. 200: повтор возвращает прежний заказ. При потере ответа повтори тот же JSON с тем же Idempotency-Key — второго списания не будет, в том числе после истечения котировки. Для новой покупки нужен новый ключ. Допустимы 16–128 латинских букв, цифр и символов _.:-; удобно использовать UUID. Цена изменилась — получи новую котировку и согласуй её перед новым запросом.

GET/orders/{id}Статус и выдача

status=paid подтверждает оплату. Выдача готова при fulfillment_status=fulfilled. Pending означает обработку, а не повод покупать повторно. Для возврата проверь refunded_at и историю транзакций. Пустой fulfillment_status возможен у товара с ручной выдачей.

Цифровые коды: /orders/{id}/delivery. У выполненного пополнения, доставки игры Steam или скина codes может быть пустым — операция уже выполнена на аккаунте получателя. Аренда: /orders/{id}/credentials возвращает steam_login и steam_password; /orders/{id}/code — Steam Guard и expires_in. Данные аренды доступны только в течение оплаченного срока. До выдачи или после возврата delivery возвращает 404: ориентируйся на статус заказа.

Список всех покупок: GET /orders?limit=100&offset=0. Ответ: purchases, total, limit, offset. Переходи по страницам до total; старые покупки сохраняются при скрытии товара.

GET/balanceКошелёк и транзакции

Ответ: currency=USD и balance_minor. /transactions?filter=all&limit=100&offset=0 возвращает пополнения, расходы и возвраты; фильтры: all, deposits, expenses, refunds. API не начисляет средства на баланс. Используй существующий способ пополнения аккаунта.

GET/service-topupsВыгодные пополнения

Популярные сервисы и сравнимые варианты в USD. Для фиксированного номинала используй product_id и key конкретного offers[]. Для Steam и Stars с произвольным количеством запроси /service-topups/estimate?product_id=123&quantity=100. Ответ выбирает предложение для указанного количества. В /quotes передай product_id из ответа и заново получи options выбранного товара.

05 / СЕРВИС

Аккаунт и валюты

GET/accountПроверить подключение

Возвращает customer_id владельца ключа, api_version, capabilities, rental_days и purchases_enabled. Персональные данные аккаунта и ключи других проектов не выдаются.

curl "https://kodario.pro/api/v1/account" \
  -H "X-API-Key: $KODARIO_API_KEY"
GET/currenciesВалюты и курс

Возвращает base=USD, settlement_currency=USD и актуальный список кодов currencies. Параметр ?currency=EUR возвращает курс только выбранной валюты в поле rate. RUB берётся из ЦБ РФ, остальные справочные валюты — из ExchangeRate-API. Дата и источник — rate_date и rate_source. Без доступного курса валюта не подменяется. ЦБ РФ · ExchangeRate-API.

curl "https://kodario.pro/api/v1/currencies" \
  -H "X-API-Key: $KODARIO_API_KEY"
07 / УВЕДОМЛЕНИЯ

События на твой сервер

Вебхук отправляет изменения аккаунта на один HTTPS-адрес: создание и обновление заказов, результат проверки стоимости и изменения USD-баланса. Нужен ключ с разрешением покупок. События относятся ко всем операциям этого аккаунта, включая покупки на сайте. Старые операции до подключения не отправляются.

PUT/webhookПодключить уведомления
curl -X PUT "https://kodario.pro/api/v1/webhook" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://your-app.example/hooks/kodario","enabled":true,"events":["order.created","order.updated","quote.updated","balance.updated"]}'

В первом ответе сохрани secret на своём сервере: повторно он не показывается. GET /webhook возвращает настройки без секрета. active учитывает действительность управляющего ключа. Повтор одинакового PUT ничего не отменяет; изменение адреса, списка событий, enabled или управляющего ключа отменяет старую очередь. Чтобы привязать вебхук к новому ключу после отзыва прежнего, повтори PUT с новым ключом.

Разрешены только публичные HTTPS-адреса, порт 443. Перенаправления и адреса внутренних сетей заблокированы. Отзыв управляющего ключа и смена пароля прекращают новые доставки; уже отправленный запрос отозвать невозможно.

СобытиеСодержимое data
order.createdorder_id, product_id, сумма, остаток баланса после покупки, статус и статус выдачи.
order.updatedСтатус выдачи, возврат, отмена или изменение статуса заказа; для аренды — время начала и окончания.
quote.updatedquote_id, product_id, ready или failed, price_minor и expires_at. Только проверки с сохранённым quote_id.
balance.updatedcurrency=USD и balance_minor после пополнения, покупки или возврата.
webhook.testПроверка подключения, без покупки и списания денег.

У каждого события есть id, type, api_version, created_at и data. Денежные значения — USD-центы с двумя дробными знаками. Уведомление не содержит коды товаров, пароли и реквизиты получателя: после готовности используй защищённые методы выдачи.

HMACX-Kodario-SignatureПроверить подлинность

Заголовки: X-Kodario-Event-Id, X-Kodario-Timestamp (Unix, секунды) и X-Kodario-Signature: v1=.... Подпись: HMAC-SHA256 от timestamp + "." + исходные байты тела; ключ — вся строка secret, включая kwh_. Проверяй до разбора JSON.

import { createHmac, timingSafeEqual } from 'node:crypto';

function validSignature(rawBody, headers, secret) {
  const timestamp = String(headers['x-kodario-timestamp'] || '');
  const signature = String(headers['x-kodario-signature'] || '');
  if (!/^\d{1,12}$/.test(timestamp) ||
      Math.abs(Date.now() / 1000 - Number(timestamp)) > 300 ||
      !/^v1=[a-f0-9]{64}$/.test(signature)) return false;
  const expected = createHmac('sha256', secret)
    .update(timestamp + '.').update(rawBody).digest();
  const received = Buffer.from(signature.slice(3), 'hex');
  return timingSafeEqual(expected, received);
}

rawBody — Buffer исходного запроса, а не повторный JSON.stringify. После проверки сверяй event.id с заголовком и атомарно сохраняй событие с уникальным id. Повтор уже принятого события тоже подтверждай 2xx. Возвращай 2xx после надёжного сохранения, до тяжёлой обработки, в пределах 12 секунд. Порядок доставки не гарантирован: при необходимости получи текущее состояние заказа через API.

POST/webhook/testПроверить доставку
curl -X POST "https://kodario.pro/api/v1/webhook/test" \
  -H "X-API-Key: $KODARIO_API_KEY" \
  -H "Idempotency-Key: webhook-test-00000001"

Ответ 202 содержит event_id. Это постановка в очередь, а не подтверждение доставки. Повтор с тем же ключом возвращает то же событие в пределах 30 дней и текущей конфигурации. До пяти новых тестов в минуту.

GET/webhook/deliveriesЖурнал и повторные попытки

Параметры limit (до 100) и offset. История хранится 30 дней: тело события, status, attempts, http_status, error_code и время следующей попытки. Доставленным считается ответ 2xx.

При тайм-ауте, сетевом сбое или другом HTTP-статусе выполняется до 10 попыток: первая сразу, затем через 10 с, 30 с, 1 мин, 3 мин, 10 мин, 30 мин, 1 ч, 3 ч и 6 ч. Очередь сохраняется при перезапуске. У повторов прежние id и тело, но новая подпись и timestamp. Состояние failed можно повторить через POST /webhook/deliveries/{id}/retry — ещё 10 попыток, максимум 100. Повтор отправки не повторяет покупку.

POST/webhook/rotate-secretОбновить секрет

Вызывай управляющим ключом из key_id. Новый secret показывается один раз. Ожидающие события сохраняются и получают новую подпись; уже отправленные могут иметь старую. DELETE /webhook удаляет адрес и секрет, отменяет ожидающие доставки, сохраняет журнал.

06 / ОБРАБОТКА ОТВЕТОВ

Ошибки и ограничения

Лимит — 300 запросов за 60 секунд на ключ. Остаток передаётся в X-RateLimit-Remaining, время сброса Unix — в X-RateLimit-Reset. При 429 дождись количества секунд из Retry-After.

HTTPКодЧто делать
400invalid_request / invalid_duration / invalid_currency / not_rentalПроверь параметры.
401invalid_api_keyПроверь ключ и заголовок X-API-Key.
403commerce_permission_requiredСоздай ключ с разрешением покупок.
404not_foundОбнови каталог и проверь ID.
409product_unavailable / price_changed / insufficient_balance / conflict / quote_expired / quote_usedПроверь код. Не повторяй покупку с новым ключом, пока не установлен результат предыдущей.
415unsupported_media_typeПередай Content-Type: application/json.
429rate_limitedПодожди Retry-After секунд.
503service_unavailable / exchange_rate_unavailableПовтори позже; при проблеме курса можно запросить USD.
{"error":{"code":"invalid_api_key","message":"API key is invalid or revoked"}}

Смотри available, inventory_checked_at и prices_checked_at. Недостаток остатка или устаревшие данные ограничивают покупку так же, как на сайте. Частый опрос API не ускоряет обновление каталога. При временной сетевой ошибке повторяй запрос с задержкой; для POST /orders всегда сохраняй исходный Idempotency-Key.

Отозвать API-ключ?