Документация

Начало

1. Зарегистрируйте аккаунт

Регистрация вашего CryptoNow аккаунта.

2. Создайте мерчанта

Откройте Dashboard и добавьте мерчанта.

  • Name - название вашего сайта / магазина.
  • Webhook URL - сюда приходят server-to-server уведомления о событиях платежей. Если вы его не укажете - проверяйте статус платежа через Просмотр Сессии.
  • Default return URL - ваш магазин, куда может вернуться клиент.
  • Solana Wallet - кошелек, на который по умолчанию поступают платежи.
  • Commission mode - комиссия либо добавляется к сумме платежа, либо вычитается из нее (Читайте здесь).
  • Session timers - настройка времени для сессий (Читайте здесь).
3. Добавьте кошелек

Платежи поступают напрямую в ваш кошелек, поэтому мы рекомендуем некастодиальный Solana-кошелек: Solflare, Trust Wallet, MetaMask.

Используйте кошелек с поддержкой Solana.

4. Сохраните API-ключи

После создания мерчанта вы увидите Public key и Private key в Dashboard. Public key определяет вашего мерчанта. Private key подписывает API-запросы.

// Храните API Private Key и seed phrase в надежном месте и относитесь к ним как к паролям.

Принцип работы

Чтобы получить ссылку на оплату, для начала создайте сессию.

Через API
  1. Создайте платеж через API-запрос.
  2. В ответе вы получаете "url" (payment link) и направляете на него клиента.
  3. Когда клиент открывает "url", он видит страницу оплаты, сумму и детали, и может оплатить.
  4. Когда клиент оплатил, средства поступают напрямую в ваш Solana wallet, а клиент попадает на success page, где видит ссылку на txid в Solscan, а также "success_url" и "return_url", если вы их передавали (Читайте здесь). Перейдя по "success_url", клиент получает доступ к услуге, за которую заплатил.
Или вручную

Если вы хотите создать платеж без API, перейдите в Dashboard > Create Session.

Вы получите ссылку, которую отправите клиенту, после чего получите оплату.

// Укажите "return_url" вручную, потому что он не берется из настроек мерчанта по умолчанию.

Тайминги
  1. После создания платежа в Dashboard или API вы получаете "url" (payment link), и у клиента есть время, равное "Wait for open", чтобы открыть ссылку. Если ссылка не будет открыта вовремя, сессия станет неактивной и больше не сможет быть оплачена.
  2. Если клиент откроет "url" (payment link) до того, как истечет "Wait for open", сессия станет активной, и у клиента будет время, равное "Session duration", на оплату. После этого времени сессия станет неактивной и больше не сможет быть оплачена. После успешной оплаты сессия также становится неактивной.

// "Wait for open" и "Session duration" можно настроить в Dashboard.

Статусы в dashboard:
История сессий
  1. В процессе - сессия создана и может быть оплачена.
  2. Оплачено - сессия оплачена.
  3. Истекла - сессия стала неактивной и больше не может быть оплачена: таймаут Wait for open, таймаут Session duration или успешная оплата.
История платежей
  1. В процессе - платеж еще не подтвержден.
  2. Оплачено - платеж успешно подтвержден.
  3. Не оплачено - оплата не поступила до перехода сессии в inactive.

Базовая информация

Основные понятия
  • Merchant - ваш магазин, созданный в Dashboard. Он хранит адрес вашего кошелька, другие данные, API-ключи и историю платежей и сессий.
  • Merchant Edit - если вы измените любые параметры, такие как wallet, webhook URL, Default return URL, Commission mode или Session timers, изменения применятся только к новым сессиям. Уже существующие сессии сохраняют данные, которые были записаны при их создании.
  • Customer - Тот, кто платит за ваш продукт или услугу.
  • Session link (payment link) - вы получаете ее при создании сессии и отправляете клиенту. Когда он открывает "url", он может оплатить.
  • Fee - каждый платеж делится на "merchant_receives" (ваша чистая сумма) и "fee" (комиссия CryptoNow). Для платежей от $0.10 до $1.99 комиссия всегда $0.01. От $2.00 и выше она увеличивается на $0.01 за каждый полный доллар.
    Пример:
    $0.10 -> $0.01
    $1.99 -> $0.01
    $2.00 -> $0.02
    $10.00 -> $0.10
    $100.00 -> $1.00
  • Commission mode - вы выбираете, кто оплачивает сервисную комиссию: Merchant или Customer. Если выбран Merchant, клиент платит точную сумму "amount" которую вы передали, а вы получаете "amount - fee" на свой кошелек. Если выбран Customer, комиссия добавляется сверху, клиент платит "amount + fee", а вы получаете точную сумму "amount" на свой кошелек. Итоговая сумма которую оплатит клиент - это "total_amount".
  • Для USDC сумма остаётся 1 к 1 в USD. Если клиент платит в SOL, сумма в SOL рассчитывается по нашему курсу, фиксируется один раз в момент перехода к оплате и не меняется до конца сессии.
Время
Все таймстемпы в ответах API возвращаются в UTC и используют формат ISO 8601 (например, 2026-01-18T16:45:14.000Z). На фронтенде время показывается в локальной таймзоне пользователя.
Лимиты
  • Сумма платежа может быть от $0.10 до $100,000.
  • Максимум мерчантов на одного пользователя: 20.
  • Rate limit Merchant API v1: 500 запросов в минуту, плюс короткий burst-лимит 200 запросов за 10 секунд.

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

Запрос
Base URL:

Content-Type: application/json.

Используйте UTF-8 для JSON-тела.

POST подписывается телом запроса (payload). GET подписывается params и query.

Тело ответа:

Каждый ответ возвращает флаг статуса и данные результата.

  • success - true или false.
  • data - результат запроса.
  • error - сообщение, если success = false.
  • signature - подпись ответа для { success, data }.

Успешный запрос:

{
  "success": true,
  "data": {
    "property": "value",
    "second_property": "second_value"
  },
  "signature": "b8e4c0d13f6a9b27d5e8f104c3a6d92b7e0f5a1c8d4b63f290a7e5c1d8b4f603"
}

Запрос с ошибкой:

{
  "success": false,
  "error": "error message"
}

Аутентификация

Все API-запросы должны быть аутентифицированы.

Обязательные заголовки
  • X-Public-Key - идентифицирует вашего мерчанта и совпадает с Public key, который показан в Dashboard.
  • X-Signature - HMAC SHA-256 подпись payload запроса, подписанная вашим Private Key из Dashboard.
Аутентификация по подписи
  1. Соберите payload из данных запроса.
  2. Сгенерируйте HMAC SHA-256 подпись вашим Private Key с учетом правил canonicalization.
  3. Передайте подпись в X-Signature вместе с X-Public-Key.

Как сгенерировать подпись (Читайте здесь).

Коды ошибок
  • 401 - Ошибка аутентификации.
  • 429 - Слишком много запросов (превышен rate limit).
  • 500 - Внутренняя ошибка сервера.

Генерация подписи

Подпись используется для API-запросов и webhook-сообщений. CryptoNow подписывает JSON payload через HMAC SHA-256 и ваш Private Key.

Canonical payload

Собирайте canonical payload так:

  1. Отсортируйте ключи объекта по алфавиту на каждом уровне.
  2. Удалите поля со значением undefined. Поля со значением null оставьте.
  3. Сохраните исходный порядок элементов внутри массивов.
  4. Сериализуйте результат в одну точную JSON-строку перед подписью.
  5. Используйте эту итоговую JSON-строку для HMAC SHA-256.
Зачем нужна canonicalization

Она нужна, чтобы вы и CryptoNow всегда подписывали одну и ту же JSON-строку. Без canonicalization один и тот же payload может дать разную подпись просто из-за другого порядка ключей.

What is signed:

Для POST-запросов подписывайте JSON из body. Для GET-запросов подписывайте JSON-объект, собранный из params и query.

Формула подписи:
signature = HMAC_SHA256(canonical_json_payload, private_key)
Готовые примеры:

Используйте один из примеров ниже, чтобы создавать подписи для запросов Create Payment.

Проверка подписи:

Проверка использует те же правила, что и создание подписи. Соберите такую же canonical JSON-строку, посчитайте HMAC SHA-256 и сравните результат с подписью, которую вы получили.

  1. Возьмите JSON, который вы получили.
  2. Для API-ответов подписывается { success, data }. Для webhook подписывается { event, data }.
  3. Примените те же правила canonicalization.
  4. Посчитайте HMAC SHA-256 вашим Private Key.
  5. Сравните результат с подписью, которую вы получили.

// API responses include "signature". Webhooks use "X-Signature". The same rules apply everywhere.

Вебхуки

Webhook - это server-to-server уведомление, которое отправляется на ваш webhook URL, указанный в Dashboard когда происходит событие платежа или сессии. Webhook необязателен - если вы его не настраиваете, подтверждайте статус платежа и сессии с помощью API-запроса в Просмотр Сессии.

Чтобы подтвердить успешную доставку, верните HTTP 200 OK с вашего сервера.

График повторных попыток
  • Запрос #1: сразу после события.
  • Запрос #2: через 5 секунд после предыдущей попытки.
  • Запрос #3: через 10 секунд после предыдущей попытки.
  • Запрос #4: через 30 секунд после предыдущей попытки.
  • Запрос #5: через 2 минуты после предыдущей попытки.
  • Запрос #6: через 10 минут после предыдущей попытки.
  • Запрос #7: через 1 час после предыдущей попытки.
  • Запрос #8: через 6 часов после предыдущей попытки.
  • Запрос #9: через 24 часа после предыдущей попытки.

После последней попытки повторные запросы больше не отправляются. Если доставка успешна, последующие уведомления не отправляются.

Попытки доставки можно посмотреть в Dashboard > Actions > Webhook Logs.

Формат вебхука
МетодPOST
Content-Typeapplication/json
ЗаголовокX-Signature
Webhook-сообщения
payment.created - отправляется сразу после создания сессии (платежа)
payment.success - отправляется, когда платеж успешно подтвержден в блокчейне, помечен как paid, и сессия становится inactive
session.active - отправляется, когда клиент открывает ссылку оплаты и сессия становится active
session.inactive - отправляется, когда сессия становится inactive: успешная оплата, таймаут Wait for open или таймаут Session duration

// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).

Создать платеж

Создаёт платёжную сессию и возвращает ссылку. Направьте клиента по ней для оплаты.

Endpoint
МетодPOST
URLhttps://cryptnow.io/api/v1/payment/create
AuthX-Public-Key, X-Signature
Тело запроса
ПолеТипОбязательноОписание
order_idstring+Ваш id заказа. Используется для отслеживания и сопоставления платежей в вашей системе (1-100 символов).
amountnumber | string+Сумма в USD (до 2 знаков после запятой). Примеры: 10, 10.1, 10.10.
currencystring+Код валюты. Всегда отправляйте "USD".
coinstringСпособ оплаты для клиента. Установите "USDC" или "SOL", чтобы сделать его единственным доступным методом для этой сессии. Если не указано, клиент может выбрать метод оплаты сам.
return_urlstring (url)Ваш магазин, на который клиент может вернуться во время оплаты.
success_urlstring (url)URL, на который клиент перенаправляется после успешной оплаты (ссылка на ваш сервис).
recipient_walletstringПодменяет кошелек получателя для этого платежа. Средства поступят сюда, а не на дефолтный кошелек мерчанта.
Правила
  1. order_id должен быть уникальным в рамках одного мерчанта.
  2. success_url и return_url могут быть как HTTP, так и HTTPS.
Примечания
  • "return_url" используется для кнопки Back button, чтобы клиент мог вернуться в ваш магазин в любой момент во время оплаты. На маленьких экранах кнопка скрыта. Если поле не передано, используется Default return URL из настроек мерчанта.
  • После успешной оплаты клиент может нажать "Вернуться в магазин", чтобы получить доступ к вашей услуге за которую заплатил. Кнопка использует "success_url" если передан, иначе "return_url", иначе default return URL. Если ничего не задано, кнопка недоступна.
  • "recipient_wallet" подменяет кошелек получателя именно для этого платежа, и средства пойдут на кошелек, указанный в "recipient_wallet".
Пример запроса
curl 'https://cryptnow.io/api/v1/payment/create' \
  -X POST \
  -H 'X-Public-Key: public_4F8x...' \
  -H 'X-Signature: 21bc4f0d2d0e...' \
  -H 'Content-Type: application/json' \
  -d '{
    "amount": "14.20",
    "currency": "USD",
    "order_id": "147",
    "success_url": "https://site.io/order/5f2c9b"
  }'
Успешный ответ
{
  "success": true,
  "data": {
    "payment_id": 456,
    "session_key": "f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
    "session_status": "pending",
    "order_id": "147",
    "amount": "14.20",
    "total_amount": "14.20",
    "merchant_receives": "14.06",
    "fee": "0.14",
    "currency": "USD",
    "payment_method": "ALL",
    "token": null,
    "network": "Solana",
    "payment_status": null,
    "recipient_wallet": "BQLxH3Drh51hbjfR9GMeB5FTBZyCtpYLvD5eqpfXupyo",
    "payer_wallet": null,
    "txid": null,
    "created_at": "2026-02-14T10:00:00Z",
    "active_at": null,
    "paid_at": null,
    "inactive_at": "2026-02-14T10:30:00Z",
    "url": "https://cryptnow.io/payment?session=f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
    "return_url": null,
    "success_url": "https://site.io/order/5f2c9b"
  },
  "signature": "b8e4c0d13f6a9b27d5e8f104c3a6d92b7e0f5a1c8d4b63f290a7e5c1d8b4f603"
}
Ошибки
{
  "success": false,
  "error": "Payment with this order_id already exists"
}
Коды ошибок:
  • 400 - Неверный запрос, ошибка валидации или неизвестные поля.
  • 401 - Ошибка аутентификации.
  • 404 - Мерчант не найден.
  • 409 - Дубликат order_id или платеж уже существует.
  • 429 - Слишком много запросов (превышен rate limit).
  • 500 - Внутренняя ошибка сервера.

// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).

Просмотр Сессии

Возвращает платежную сессию по session_key, чтобы вы могли в любой момент проверить ее статус, тайминги и другие данные. Используйте этот endpoint, если не хотите использовать webhook и хотите получать информацию о сессии с помощью API-запроса.

Endpoint
МетодGET
URLhttps://cryptnow.io/api/v1/payment/session/:session_key
AuthX-Public-Key, X-Signature
Path params
ПолеТипОбязательноОписание
session_keystring (uuid)+Session id из Create Payment или webhooks.
Пример запроса
GEThttps://cryptnow.io/api/v1/payment/session/f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904
Успешный ответ
{
  "success": true,
  "data": {
    "payment_id": 456,
    "session_key": "f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
    "session_status": "pending",
    "order_id": "147",
    "amount": "14.20",
    "total_amount": "14.20",
    "merchant_receives": "14.06",
    "fee": "0.14",
    "currency": "USD",
    "payment_method": "ALL",
    "token": null,
    "network": "Solana",
    "payment_status": null,
    "recipient_wallet": "BQLxH3Drh51hbjfR9GMeB5FTBZyCtpYLvD5eqpfXupyo",
    "payer_wallet": null,
    "txid": null,
    "created_at": "2026-02-14T10:00:00Z",
    "active_at": "2026-02-14T10:00:15Z",
    "paid_at": null,
    "inactive_at": "2026-02-14T10:30:00Z",
    "url": "https://cryptnow.io/payment?session=f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
    "return_url": "https://site.io",
    "success_url": "https://site.io/order/5f2c9b"
  },
  "signature": "b8e4c0d13f6a9b27d5e8f104c3a6d92b7e0f5a1c8d4b63f290a7e5c1d8b4f603"
}
Ошибки
{
  "success": false,
  "error": "Session not found"
}
Коды ошибок:
  • 400 - Неверный session_key.
  • 401 - Ошибка аутентификации.
  • 404 - Сессия не найдена.
  • 429 - Слишком много запросов (превышен rate limit).
  • 500 - Внутренняя ошибка сервера.

// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).

Экспорт истории

Возвращает историю платежей вашего мерчанта с фильтрами по дате и статусу.

Если нужен быстрый экспорт без API, используйте выгрузку CSV в дашборде:

  1. Откройте Dashboard > Export CSV.
  2. Выберите мерчанта и примените фильтры (дата и статус).
  3. Нажмите Export CSV, чтобы скачать отфильтрованный список.

Если нужна автоматическая выгрузка или обработка на бэкенде, используйте API endpoint ниже.

Endpoint
МетодPOST
URLhttps://cryptnow.io/api/v1/payment/export
AuthX-Public-Key, X-Signature
Тело запроса
ПолеТипОбязательноОписание
date_fromstring+Начальная дата в формате DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS].
date_tostring+Конечная дата в формате DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS].
statusstring+Фильтр по статусу платежа: all или paid.
Правила
  1. date_from и date_to должны быть валидными датами (DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS]). Секунды необязательны.
  2. date_from должен быть раньше date_to.
  3. Фильтры интерпретируются в UTC как для экспорта CSV в Dashboard так и для API.
Пример запроса
curl 'https://cryptnow.io/api/v1/payment/export' \
  -X POST \
  -H 'X-Public-Key: public_4F8x...' \
  -H 'X-Signature: 21bc4f0d2d0e...' \
  -H 'Content-Type: application/json' \
  -d '{
    "date_from": "10.01.2026 09:00",
    "date_to": "12.01.2026 18:30:45",
    "status": "all"
  }'
Успешный ответ
{
  "success": true,
  "data": [
    {
      "payment_id": 456,
      "session_key": "f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
      "session_status": "inactive",
      "order_id": "147",
      "amount": "14.20",
      "total_amount": "14.20",
      "merchant_receives": "14.06",
      "fee": "0.14",
      "currency": "USD",
      "payment_method": "ALL",
      "token": "USDC",
      "network": "Solana",
      "payment_status": "paid",
      "recipient_wallet": "BQLxH3Drh51hbjfR9GMeB5FTBZyCtpYLvD5eqpfXupyo",
      "payer_wallet": "5eXgehWkldzarVA3LgJFkQkZbVF1eJHGxFKpNWrR7oaj",
      "txid": "WrHzgMNZERNUVc3ojR5Z199fPDxUVqTHAhrZvZFbcG7ajPVVhjG6spwKCPWXdy38J19fKSFFtP2gL87Jr9cmyLD",
      "created_at": "2026-02-14T10:00:00Z",
      "active_at": "2026-02-14T10:00:15Z",
      "paid_at": "2026-02-14T10:01:21Z",
      "inactive_at": "2026-02-14T10:30:00Z",
      "url": "https://cryptnow.io/payment?session=f3a91c20-7d44-4b8f-9c2a-6e15d3b8a904",
      "return_url": "https://site.io",
      "success_url": "https://site.io/order/5f2c9b"
    }
  ],
  "signature": "b8e4c0d13f6a9b27d5e8f104c3a6d92b7e0f5a1c8d4b63f290a7e5c1d8b4f603"
}
Ошибки
{
  "success": false,
  "error": "Invalid date_from format"
}
Коды ошибок:
  • 400 - Неверные фильтры, формат даты или неизвестные поля.
  • 401 - Ошибка аутентификации.
  • 429 - Слишком много запросов (превышен rate limit).
  • 500 - Внутренняя ошибка сервера.

// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).