Документация
Начало
Регистрация вашего CryptoNow аккаунта.
Откройте Dashboard и добавьте мерчанта.
- Name - название вашего сайта / магазина.
- Webhook URL - сюда приходят server-to-server уведомления о событиях платежей. Если вы его не укажете - проверяйте статус платежа через Просмотр Сессии.
- Default return URL - ваш магазин, куда может вернуться клиент.
- Solana Wallet - кошелек, на который по умолчанию поступают платежи.
- Commission mode - комиссия либо добавляется к сумме платежа, либо вычитается из нее (Читайте здесь).
- Session timers - настройка времени для сессий (Читайте здесь).
Платежи поступают напрямую в ваш кошелек, поэтому мы рекомендуем некастодиальный Solana-кошелек: Solflare, Trust Wallet, MetaMask.
Используйте кошелек с поддержкой Solana.
После создания мерчанта вы увидите Public key и Private key в Dashboard. Public key определяет вашего мерчанта. Private key подписывает API-запросы.
// Храните API Private Key и seed phrase в надежном месте и относитесь к ним как к паролям.
Принцип работы
Чтобы получить ссылку на оплату, для начала создайте сессию.
- Создайте платеж через API-запрос.
- В ответе вы получаете "url" (payment link) и направляете на него клиента.
- Когда клиент открывает "url", он видит страницу оплаты, сумму и детали, и может оплатить.
- Когда клиент оплатил, средства поступают напрямую в ваш Solana wallet, а клиент попадает на success page, где видит ссылку на txid в Solscan, а также "success_url" и "return_url", если вы их передавали (Читайте здесь). Перейдя по "success_url", клиент получает доступ к услуге, за которую заплатил.
Если вы хотите создать платеж без API, перейдите в Dashboard > Create Session.
Вы получите ссылку, которую отправите клиенту, после чего получите оплату.
// Укажите "return_url" вручную, потому что он не берется из настроек мерчанта по умолчанию.
- После создания платежа в Dashboard или API вы получаете "url" (payment link), и у клиента есть время, равное "Wait for open", чтобы открыть ссылку. Если ссылка не будет открыта вовремя, сессия станет неактивной и больше не сможет быть оплачена.
- Если клиент откроет "url" (payment link) до того, как истечет "Wait for open", сессия станет активной, и у клиента будет время, равное "Session duration", на оплату. После этого времени сессия станет неактивной и больше не сможет быть оплачена. После успешной оплаты сессия также становится неактивной.
// "Wait for open" и "Session duration" можно настроить в Dashboard.
- В процессе - сессия создана и может быть оплачена.
- Оплачено - сессия оплачена.
- Истекла - сессия стала неактивной и больше не может быть оплачена: таймаут Wait for open, таймаут Session duration или успешная оплата.
- В процессе - платеж еще не подтвержден.
- Оплачено - платеж успешно подтвержден.
- Не оплачено - оплата не поступила до перехода сессии в 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 рассчитывается по нашему курсу, фиксируется один раз в момент перехода к оплате и не меняется до конца сессии.
- Сумма платежа может быть от $0.10 до $100,000.
- Максимум мерчантов на одного пользователя: 20.
- Rate limit Merchant API v1: 500 запросов в минуту, плюс короткий burst-лимит 200 запросов за 10 секунд.
Вы можете активировать или деактивировать merchant в Dashboard. Деактивация merchant блокирует API-запросы, создание сессий из Dashboard и редактирование merchant. Включить его обратно можно в любой момент.
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-запросы должны быть аутентифицированы.
- Соберите payload из данных запроса.
- Сгенерируйте HMAC SHA-256 подпись вашим Private Key с учетом правил canonicalization.
- Передайте подпись в X-Signature вместе с X-Public-Key.
Как сгенерировать подпись (Читайте здесь).
- 401 - Ошибка аутентификации.
- 429 - Слишком много запросов (превышен rate limit).
- 500 - Внутренняя ошибка сервера.
Генерация подписи
Подпись используется для API-запросов и webhook-сообщений. CryptoNow подписывает JSON payload через HMAC SHA-256 и ваш Private Key.
Собирайте canonical payload так:
- Отсортируйте ключи объекта по алфавиту на каждом уровне.
- Удалите поля со значением undefined. Поля со значением null оставьте.
- Сохраните исходный порядок элементов внутри массивов.
- Сериализуйте результат в одну точную JSON-строку перед подписью.
- Используйте эту итоговую JSON-строку для HMAC SHA-256.
Она нужна, чтобы вы и CryptoNow всегда подписывали одну и ту же JSON-строку. Без canonicalization один и тот же payload может дать разную подпись просто из-за другого порядка ключей.
Для POST-запросов подписывайте JSON из body. Для GET-запросов подписывайте JSON-объект, собранный из params и query.
Используйте один из примеров ниже, чтобы создавать подписи для запросов Create Payment.
Проверка использует те же правила, что и создание подписи. Соберите такую же canonical JSON-строку, посчитайте HMAC SHA-256 и сравните результат с подписью, которую вы получили.
- Возьмите JSON, который вы получили.
- Для API-ответов подписывается { success, data }. Для webhook подписывается { event, data }.
- Примените те же правила canonicalization.
- Посчитайте HMAC SHA-256 вашим Private Key.
- Сравните результат с подписью, которую вы получили.
// 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-Type | application/json |
| Заголовок | X-Signature |
// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).
Создать платеж
Создаёт платёжную сессию и возвращает ссылку. Направьте клиента по ней для оплаты.
| Метод | POST |
| URL | https://cryptnow.io/api/v1/payment/create |
| Auth | X-Public-Key, X-Signature |
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
| order_id | string | + | Ваш id заказа. Используется для отслеживания и сопоставления платежей в вашей системе (1-100 символов). |
| amount | number | string | + | Сумма в USD (до 2 знаков после запятой). Примеры: 10, 10.1, 10.10. |
| currency | string | + | Код валюты. Всегда отправляйте "USD". |
| coin | string | Способ оплаты для клиента. Установите "USDC" или "SOL", чтобы сделать его единственным доступным методом для этой сессии. Если не указано, клиент может выбрать метод оплаты сам. | |
| return_url | string (url) | Ваш магазин, на который клиент может вернуться во время оплаты. | |
| success_url | string (url) | URL, на который клиент перенаправляется после успешной оплаты (ссылка на ваш сервис). | |
| recipient_wallet | string | Подменяет кошелек получателя для этого платежа. Средства поступят сюда, а не на дефолтный кошелек мерчанта. |
- order_id должен быть уникальным в рамках одного мерчанта.
- 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-запроса.
| Метод | GET |
| URL | https://cryptnow.io/api/v1/payment/session/:session_key |
| Auth | X-Public-Key, X-Signature |
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
| session_key | string (uuid) | + | Session id из Create Payment или webhooks. |
| GET | https://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 в дашборде:
- Откройте Dashboard > Export CSV.
- Выберите мерчанта и примените фильтры (дата и статус).
- Нажмите Export CSV, чтобы скачать отфильтрованный список.
Если нужна автоматическая выгрузка или обработка на бэкенде, используйте API endpoint ниже.
| Метод | POST |
| URL | https://cryptnow.io/api/v1/payment/export |
| Auth | X-Public-Key, X-Signature |
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
| date_from | string | + | Начальная дата в формате DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS]. |
| date_to | string | + | Конечная дата в формате DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS]. |
| status | string | + | Фильтр по статусу платежа: all или paid. |
- date_from и date_to должны быть валидными датами (DD.MM.YYYY или DD.MM.YYYY HH:MM[:SS]). Секунды необязательны.
- date_from должен быть раньше date_to.
- Фильтры интерпретируются в 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 - Внутренняя ошибка сервера.
// Всегда проверяйте подпись для всех ответов и вебхуков (Читайте здесь).