Lava top
Разработчикам

Добро пожаловать в API‑портал
lava.top!

С нашим API вы легко настроите интеграции: управляйте продуктами, получайте отчеты о продажах, работайте с подписками, принимайте донаты и настраивайте уведомления через webhook.
Мы постарались сделать документацию простой и понятной. Здесь вы найдёте всё, чтобы быстро разобраться, какие параметры передавать, что вернёт API в ответ, и как лучше настроить свою интеграцию.

Введение

Поддержка

Если вдруг что-то останется непонятным — напишите нам в поддержку: https://t.me/lava_sup_bot

Общая информация

Интеграция — это процесс объединения двух или более сервисов с помощью API. Она позволяет системам обмениваться данными и событиями, обеспечивая их совместную и автоматизированную работу.

С помощью lava.top можно настроить интеграцию с любой внешней системой, сервисом, сайтом или с Telegram-ботом: принимать и отслеживать оплаты, управлять доступом и контролировать статусы подписок. Всё это делает рабочие процессы проще и удобнее.

Начнем с ключевых терминов:
Public API

Public API — программный интерфейс lava.top, который позволяет внешним программам и приложениям взаимодействовать друг с другом по сети.

API key

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

Webhook

Webhook — механизм, позволяющий одному сервису автоматически отправлять данные другому сервису в ответ на определенные события. Проще говоря, это уведомление, которое ваша система получает, когда что-то произошло. Вместо того чтобы постоянно опрашивать сервер («что нового?»), вы один раз настраиваете URL, и сервер сам уведомляет вас, когда нужно.

Возврат

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

Чарджбэк

Чарджбэк — оспаривание платежа покупателем через его банк. Инициируется вне платформы. На момент получения диспута сумма и комиссия эквайера уже удержаны с баланса автора.

Типовые сценарии использования нашего API:
Покупка продукта, первый платеж по подписке

diagram1diagram1

Работа с подпиской 2ой и последующие списания по подписке

diagram2diagram2

Возврат покупателя на страницу автора после оплаты
Возврат средств и чарджбэк по продаже

Настройка интеграции

Начало работы

Для того, чтобы начать настройку интеграции на платформе, потребуется создать API key и добавить webhook.

Как создать API key

1
Как создать API key
  1. Перейдите в раздел Интеграции в основном меню, выберите тип интеграции Public API.

screenshot1.pngscreenshot1.png

  1. Нажмите Настроить API key.

screenshot1-1.pngscreenshot1-1.png

  1. Платформа создаст ключ автоматически: скопируйте и сохраните его на своём устройстве.

screenshot2.pngscreenshot2.png

Как добавить webhook

2
Как добавить webhook
  1. Создайте API key и подтвердите, что вы его сохранили.
  2. Нажмите на кнопку Добавить Webhook.

screenshot3.pngscreenshot3.png

  1. Заполните поля:
  • URL — это ссылка на сервис, куда будут отправляться webhook (сервер, который будет обрабатывать запросы);
  • Тип события:
  1. payment.success — Успешная оплата
  2. payment.failed — Неуспешная оплата
  3. subscription.recurring.payment.success — Успешное продление подписки
  4. subscription.recurring.payment.failed — Неуспешное продление подписки
  5. subscription.cancelled — Отмена подписки
  6. refund.success — Успешный возврат
  7. chargeback.initiated — Получен запрос на чарджбэк

screenshot13.pngscreenshot13.png

Один webhook принимает любой набор событий — отметьте нужные в списке. Создавать отдельный webhook под каждое событие не нужно. Если удобно, события можно развести по разным URL: например, платежи на один адрес, возвраты и чарджбэки на другой.

События «Успешный возврат» и «Получен запрос на чарджбэк» приходят только если отмечены. Перед тем как их включить, убедитесь, что ваш обработчик возвращает 2xx на любое событие, включая незнакомое — иначе вы получите массовые повторные отправки.

  1. Выберите тип аутентификации:
  • Basic - введите логин и пароль от вашего сервиса, куда будут отправляться webhook.

screenshot5.pngscreenshot5.png

  • API key вашего сервиса - введите API key от вашего сервиса, куда будут отправляться webhook. Максимальная длина ключа — 80 символов.

screenshot6.pngscreenshot6.png

При аутентификации Basic: lava.top будет отправлять webhook-запросы по указанному URL, аутентифицированные при помощи basic (HTTP) аутентификации путем отправки запроса вида user:pass@example.com - для такого запроса может использоваться только https соединение.

При аутентификации по API Key: lava.top будет отправлять webhook-запросы по указанному URL, аутентифицированные при помощи ключа. Принимающая сторона должна получить ключ из http-заголовка «X-Api-Key».

Как добавить webhook для уже созданных ключей

Для этого нажмите на три точки рядом с нужным ключом и выберите Добавить Webhook.

screenshot7.pngscreenshot7.png

После выполнения этих шагов можно перейти к API документации и продолжить работу.

API документация

API документация

Для получения детального описания методов API используйте API документацию.

Документация представлена в формате Open API v3.0.0 (Swagger).

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

Swagger документация с интерактивными примерами

Вы сможете подобрать API-метод по основным сценариям работы:

Products

Products - для работы с цифровыми продуктами: получение списка продуктов и изменение их параметров (например, цены).

Invoices

Invoices — для создания контрактов на покупку (в том числе на произвольную сумму), проверки их статуса и настройки возврата покупателя на страницу автора после оплаты.
Доступны методы /api/v2/invoices и /api/v3/invoice

Custom Price Invoices

Custom Price Invoices - позволяет создать контракт на произвольную сумму для продуктов, опубликованных с признаком «Цена по запросу через API». Стоимость и валюта передаются в каждом запросе — без необходимости менять настройки продукта.

Reports

Reports - для получения данных для аналитики по продажам через API.

Subscriptions

Subscriptions - для управления подписками пользователей.

Donate

Donate - для получения ссылок на донат.

Интерактивность документации поможет протестировать методы и убедиться в их корректной работе.

Чтобы опробовать метод:
  1. укажите API key:
  • нажмите кнопку Authorize в верхнем углу страницы:

screenshot8.pngscreenshot8.png

  • заполните ApiKeyAuth (apiKey), (используйте API key, который вы получили в ЛК Автора в пользовательском интерфейсе lava.top Интеграции → API → Создать API key (более подробно рассказывали про это здесь)):

screenshot9.pngscreenshot9.png

  1. нажмите кнопку Try it out, введите необходимые данные и выберите опцию Execute:

screenshot10.pngscreenshot10.png

Создание контракта на произвольную сумму через API

Создание контракта на произвольную сумму через API

Если вы используете lava.top как платёжную инфраструктуру — для лендингов, CRM или кастомных сервисов — вам не нужно каждый раз менять цену продукта. Вместо этого опубликуйте контент с признаком «Цена по запросу API» и передавайте сумму напрямую в запросе на создание контракта.

1
Подготовка продукта

В интерфейсе lava.top при публикации Цифрового продукта, Консультации или Курса включите опцию «Цена по запросу API». Блок стоимости скроется. Продукт будет доступен только по ссылке и только через API.

Поддерживаемые типы контента: Цифровой продукт, Консультация, Курс.
2
Создание контракта

Используйте метод POST /api/v3/invoice. Передайте offerId продукта, опубликованного с признаком «Цена по запросу», а также amount и currency в теле запроса.

Пример
1.curl --location 'https://gate.lava.top/api/v3/invoice' \
2. --header 'Accept: application/json' \
3. --header 'X-Api-Key: {api_key}' \
4. --header 'Content-Type: application/json' \
5. --data-raw '{
6. "email": "client@example.com",
7. "offerId": "836b9fc5-7ae9-4a27-9642-592bc44072b7",
8. "currency": "EUR",
9. "amount": 120
10. }'

С указанием провайдера

Пример
1.curl --location 'https://gate.lava.top/api/v3/invoice' \
2. --header 'Accept: application/json' \
3. --header 'X-Api-Key: {api_key}' \
4. --header 'Content-Type: application/json' \
5. --data-raw '{
6. "email": "client@example.com",
7. "offerId": "836b9fc5-7ae9-4a27-9642-592bc44072b7",
8. "currency": "EUR",
9. "amount": 120,
10. "paymentProvider": "PAYPAL"
11. }'

Возврат покупателя после оплаты

Возврат покупателя после оплаты

Если вы продаёте через собственный сайт, лендинг или бот, покупателю после оплаты логично вернуться к вам, а не остаться на странице lava.top. Передайте при создании инвойса адреса своих страниц — и мы отправим покупателя туда, как только станет известен результат оплаты. Отдельные адреса для успешной оплаты, неуспешной и отмены.

1
Передайте адреса при создании инвойса

Используйте метод POST /api/v3/invoice. Добавьте в тело запроса опциональные поля successful_return_url, failure_return_url, cancel_return_url. Можно передать любое подмножество — одно поле, два или все три.

screenshot21.pngscreenshot21.png

Все три адреса

Пример
1.curl --location 'https://gate.lava.top/api/v3/invoice' \
2. --header 'Accept: application/json' \
3. --header 'X-Api-Key: {api_key}' \
4. --header 'Content-Type: application/json' \
5. --data-raw '{
6. "email": "client@example.com",
7. "offerId": "836b9fc5-7ae9-4a27-9642-592bc44072b7",
8. "currency": "EUR",
9. "successful_return_url": "https://school.example.com/thanks",
10. "failure_return_url": "https://school.example.com/payment-error",
11. "cancel_return_url": "https://school.example.com/checkout"
12. }'

Только страница успешной оплаты

Пример
1.curl --location 'https://gate.lava.top/api/v3/invoice' \
2. --header 'Accept: application/json' \
3. --header 'X-Api-Key: {api_key}' \
4. --header 'Content-Type: application/json' \
5. --data-raw '{
6. "email": "client@example.com",
7. "offerId": "836b9fc5-7ae9-4a27-9642-592bc44072b7",
8. "currency": "EUR",
9. "paymentProvider": "PAYPAL",
10. "successful_return_url": "https://school.example.com/thanks?utm_source=lava"
11. }'
ПолеОписание
successful_return_urlАдрес страницы, на которую вернётся покупатель после успешной оплаты
failure_return_urlАдрес страницы для неуспешной оплаты
cancel_return_urlАдрес страницы для отменённой оплаты

Требования к значениям:

  • Только схема https
  • Абсолютный URL
  • Не более 512 символов на каждое поле
Если хотя бы одно из переданных значений не соответствует требованиям, инвойс не создаётся и возвращается ошибка 400. Частичного сохранения нет.
2
Как покупатель возвращается на вашу страницу

После оплаты покупатель сначала возвращается на страницу lava.top, а затем сразу переходит на ваш адрес.

Промежуточная страница показывает индикатор загрузки и не дублирует статус оплаты — результат покупатель уже видел в форме оплаты и увидит на вашей странице.

Если адрес для этого исхода не передан, покупатель остаётся на нашей странице и видит финальный статус, как и раньше.
3
Маршрутизация по исходу оплаты
Оплата подтверждена

Целевой адрес: successful_return_url

Если адрес не передан: Финальный статус на странице lava.top

Оплата не прошла

Целевой адрес: failure_return_url

Если адрес не передан: Финальный статус на странице lava.top

Покупатель отменил оплату

Целевой адрес: cancel_return_url

Если адрес не передан: failure_return_url, если передан, иначе финальный статус

Отмену оплаты мы передаём отдельно там, где платёжный провайдер сообщает её отдельно от отказа. Часть провайдеров этого не различает — в таких случаях покупатель уйдёт на failure_return_url. Это ожидаемое поведение.
4
Параметры в адресе возврата

К вашему адресу мы добавляем два параметра:

  • invoiceId — ID инвойса
  • status — success / failed / cancelled

Ваши собственные query-параметры сохраняются, наши добавляются через &. Если в адресе есть якорь (#), параметры добавляются до него.

Пример: адрес https://school.example.com/thanks?utm_source=lava превратится в https://school.example.com/thanks?utm_source=lava&invoiceId=3fa85f64-5717-4562-b3fc-2c963f66afa6&status=success.

Параметр status не является подтверждением оплаты и не может быть основанием для выдачи доступа к контенту.
Это значение в адресной строке, его можно подделать на стороне покупателя. Источник правды о состоянии оплаты — webhook payment.success и метод GET /api/v1/invoices/{id}.

Персональные данные покупателя в адресе возврата не передаются. Email и другие данные не добавляются в параметры: адресная строка попадает в логи, историю браузера и заголовок referer.

Ограничения
  • Работает только для инвойсов, созданных через API. На прямые продажи через lava.top не распространяется
  • Для подписок работает только на первой оплате. Продления выполняются без участия браузера
  • Если автоматический переход не сработал, покупатель остаётся на нашей странице и видит ссылку для перехода вручную

Библиотеки API

Библиотеки API

Мы подготовили несколько open source-библиотек, которые помогут вам быстрее и удобнее использовать возможности нашей платформы.

Наш API соответствует спецификации Open API (Swagger), которая может быть сложной для работы, и эти библиотеки помогут упростить процесс.

Поля successful_return_url, failure_return_url и cancel_return_url пока доступны только при прямом обращении к API. В библиотеках они не поддержаны.

!Python

Python

Скачайте пакет с PyPI, обычно с помощью pip:

Установка
1.pip install lava-top-sdk

Убедитесь, что при установке библиотеки lava-top-sdk также устанавливаются все её зависимости.

!TypeScript

TypeScript

Доступно на npm

Установка
1.npm install --save lava-top-sdk

!Kotlin

Kotlin

Подключите пакет из репозитория Maven

Установка
1.<dependency>
2. <groupId>top.lava</groupId>
3. <artifactId>lava-top-kotlin-sdk</artifactId>
4. <version>1.0.0</version>
5.</dependency>

Клиенты и API keys

Клиенты и API keys

На платформе lava.top используются два типа API key:

Ключ для подписи запросов к lava.top

Этот ключ используется вашей системой для отправки запросов к lava.top. Так мы идентифицируем вас.

Ключ для подписи webhook от lava.top

Этот ключ создается на стороне вашего сервиса и передается lava.top. Lava.top использует его, добавляя в X-Api-Key заголовок HTTP запроса при отправке webhook на вашу сторону.

Оба ключа помогают выстроить надежную и безопасную интеграцию между вашей системой и lava.top.

Ошибки

Ошибки

Платформа lava.top использует HTTP-коды ответа для обозначения успешного выполнения или ошибки при обработке API-запросов.

Исходящие соединения происходят с IP-адреса 158.160.60.174

ВАЖНО: Добавьте себе этот адрес в белый список!
Политика повторов

Если webhook не были доставлены, система предпримет попытки повторно отправить их на указанный URL. Повторные попытки осуществляются по логике: сначала 1с, 5с, 15с, далее 10 попыток с интервалом в 1 мин, далее, если не удалось, еще 5 попыток с интервалом в 1 час.

Всего будет сделано до 20 попыток.

Наиболее популярные ошибки:

КодОписание
400Bad Request: Запрос некорректен. Проверьте синтаксис, параметры, ограничения по размеру. При создании инвойса ошибка также возвращается, если адрес возврата передан не по схеме https, не является абсолютным URL или превышает 512 символов.
401Unauthorized: Ошибка аутентификации. Проверьте API key, OAuth-токен, срок его действия и наличие нужных прав (scope).
403Forbidden: Доступ к ресурсу отклонён. Возможно, у вас недостаточно прав или вы обращаетесь к закрытому ресурсу.
404Not Found: Ресурс не найден. Проверьте URL, идентификатор объекта или его наличие в вашем аккаунте.
405Method Not Allowed: HTTP-метод не поддерживается для данного эндпоинта. Обратитесь к документации API.
406Not Acceptable: Неподдерживаемый формат запроса или ответа. API поддерживает только application/json.
408Request Timeout: Сервер не дождался завершения запроса. Повторите попытку с меньшим объёмом данных.
410Gone: Ресурс был безвозвратно удалён и больше недоступен.
429Too Many Requests: Превышен лимит обращений. Уменьшите частоту запросов.
500Internal Server Error: Ошибка на стороне сервера. Повторите попытку позже.
503Service Unavailable: Сервис временно недоступен из-за технических работ или перегрузки. Повторите попытку позже.

Ограничения по количеству запросов

Ограничения по количеству запросов

Платформа lava.top использует ограничение на частоту запросов для защиты от перегрузок и обеспечения стабильной работы API.

50
Текущий лимит: 50 запросов в секунду с одного IP-адреса.
Если лимит превышен, сервер вернет ошибку с кодом 429. В этом случае рекомендуется подождать и повторить запрос позже.
Для высоконагруженных проектов вы можете обратиться в поддержку: https://t.me/lava_sup_bot

Webhook

Webhook

Мы уже рассказывали, что в разделе «Интеграции» в основном меню есть возможность настраивать интеграцию с Public API, где можно создавать API keys и добавлять webhook.

Также там можно просматривать историю их отправки, статус и повторить отправку в случае ошибки доставки и/или обработки webkook.

!История webhooks

История webhooks

Историю можно найти в карточке аккаунта. Для этого перейдите в редактирование Интеграции → API → История веб-хуков (кнопка в правом верхнем углу страницы).

screenshot11.pngscreenshot11.png

Здесь фиксируются события, на которые настроены соответствующие webhook. Эти события различаются по типу, статусу и паре API Key+webhook. В деталях платежа можно увидеть тело запроса, отправленного в момент события, а также историю попыток отправки (при неудачном списании по подписке webhook приходит только по последней попытке списания (т.е. если было 3 попытки списания, то webhook придет только по третей)). Чтобы просмотреть детали платежа, нужно кликнуть по строке webhook.

screenshot19.pngscreenshot19.png

Чтобы найти нужный webhook можно использовать расширенные фильтры - искать по Почте покупателя, ID инвойса или Названию или ID продукта.

screenshot12.pngscreenshot12.png

!Типы событий

Типы событий

Каждое событие привязано к типу платежа и статусу контракта.

Типы платежей:

  • оплата (покупка цифрового продукта, курса, консультации или первый платёж по подписке);
  • рекуррентный платёж (продление или отмена подписки).

Статусы контракта:

  • success (успешный платёж);
  • failed (незавершённый платёж, например, недостаточно средств на балансе клиента);
  • cancelled (отменённый, в случае подписки).

Поэтому в истории можно встретить следующие Типы событий:

  • payment.success — успешная покупка продуктов (не донатов) или первая оплата подписки;
  • payment.failed — неуспешная покупка продуктов (не донатов) или первая оплата подписки;
  • subscription.recurring.payment.success — успешное продление подписки (второй, третий и последующие платежи);
  • subscription.recurring.payment.failed — неуспешное продление подписки (второй, третий и последующие платежи);
  • subscription.cancelled — отмена ранее купленной подписки;
  • refund.success — возврат средств по продаже выполнен, полный или частичный;
  • chargeback.initiated — покупатель открыл диспут через свой банк.

Чтобы получать события, создайте webhook и отметьте нужные события в поле «Тип события». Ограничений на комбинации нет: один webhook может принимать как одно событие, так и все семь. Соответствие позиций в форме и типов событий — в разделе «Настройка интеграции»:

screenshot13.pngscreenshot13.png

!События возврата и чарджбэка

События возврата и чарджбэка

Возвраты и чарджбэки происходят после того, как продажа состоялась, и влияют и на ваш баланс, и на доступ покупателя к контенту. Эти события позволяют отозвать доступ в вашей системе автоматически и вести сверку без ручной выгрузки.

screenshot20.pngscreenshot20.png

СобытиеКогда отправляетсяСостояние баланса
refund.successВ момент выполнения возврата на стороне lava.top, независимо от инициатораСумма возврата списана с баланса, комиссия платформы не возвращается
chargeback.initiatedВ момент получения диспута от эквайераСумма диспута и комиссия эквайера удержаны. При отрицательном балансе вывод закрывается

Оба события приходят в общей обёртке. Тело события — в поле data, его состав зависит от типа события.

json
1.{
2. "event_id": "7ea82675-4ded-4133-95a7-a6efbaf165cc",
3. "event_type": "refund.success",
4. "created_at": "2024-02-05T09:38:27.33277Z",
5. "data": { }
6.}

События refund.success и chargeback.initiated используют структуру с обёрткой и именами полей в snake_case. События payment.* и subscription.* сохраняют прежний формат — плоскую структуру с именами в camelCase (eventType, contractId, buyer).

Если ваш обработчик принимает все типы событий на один URL, учитывайте это при разборе.

Payload события refund.success

json
1.{
2. "event_id": "7ea82675-4ded-4133-95a7-a6efbaf165cc",
3. "event_type": "refund.success",
4. "created_at": "2024-02-05T09:38:27.33277Z",
5. "data": {
6. "refund_id": "7ea82675-4ded-4133-95a7-a6efbaf165cc",
7. "refund_type": "full",
8. "initiator": "creator",
9. "amount": 400.00,
10. "currency": "EUR",
11. "product": {
12. "product_name": "Тестовый продукт",
13. "product_id": "d31384b8-e412-4be5-a2ec-297ae6666c8f",
14. "product_type": "DIGITAL_PRODUCT",
15. "tier_id": "836b9fc5-7ae9-4a27-9642-592bc44072b7"
16. },
17. "customer_email": "test@lava.top",
18. "balance_impact": {
19. "debited_amount": 368.00,
20. "currency": "EUR"
21. },
22. "subscription_cancelled": false
23. }
24.}
ПолеОписание
refund_idID возврата
refund_typefull — полный возврат, partial — частичный
initiatorcreator — вы, admin — поддержка, system — платформа
amount, currencyСумма и валюта возврата
productПродукт, по которому сделан возврат
customer_emailПочта покупателя
balance_impact.debited_amountСумма, списанная с вашего баланса
subscription_cancelledОтменена ли подписка этим возвратом

Payload события chargeback.initiated

json
1.{
2. "event_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
3. "event_type": "chargeback.initiated",
4. "created_at": "2024-02-05T09:38:27.33277Z",
5. "data": {
6. "chargeback_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
7. "dispute_date": "2024-02-05",
8. "reason_category": "fraud",
9. "reason_description": "Fraudulent transaction",
10. "amount": 400.00,
11. "currency": "EUR",
12. "product": {
13. "product_name": "Тестовый продукт",
14. "product_id": "d31384b8-e412-4be5-a2ec-297ae6666c8f",
15. "product_type": "DIGITAL_PRODUCT",
16. "tier_id": "836b9fc5-7ae9-4a27-9642-592bc44072b7"
17. },
18. "customer_email": "test@lava.top",
19. "balance_impact": {
20. "debited_amount": 400.00,
21. "provider_fee": 40.00,
22. "currency": "EUR"
23. },
24. "subscription_cancelled": false
25. }
26.}
ПолеОписание
chargeback_idID чарджбэка
dispute_dateДата открытия диспута
reason_categoryКатегория причины диспута, передаётся банком покупателя
reason_descriptionПояснение банка, если передано
amount, currencyОспариваемая сумма и валюта
balance_impact.debited_amountУдержанная сумма диспута
balance_impact.provider_feeКомиссия эквайера за обработку диспута
subscription_cancelledОтменена ли подписка этим чарджбэком
Как обрабатывать эти события
  • Используйте event_id для защиты от повторной обработки. При повторных отправках он не меняется.
  • Порядок доставки событий не гарантирован. Опирайтесь на event_id и created_at, а не на последовательность получения.
  • Возврат и отмена подписки — независимые события. Возврат не обязательно отменяет подписку.
  • На каждый частичный возврат приходит отдельное событие со своим event_id и refund_id.
  • Возвращайте 2xx на любой тип события, включая незнакомый.

Если возврат или чарджбэк отменяет подписку, поле subscription_cancelled приходит со значением true, и дополнительно отправляется отдельное событие subscription.cancelled в существующем формате.

Чтобы его получать, отметьте «Отмена подписки» в настройках webhook.

Не обрабатывайте одну отмену дважды: используйте subscription_cancelled для немедленной реакции, а subscription.cancelled — как основное событие жизненного цикла подписки, с датами cancelledAt и willExpireAt.

Ограничения
  • Мы сообщаем об открытии диспута. Итог чарджбэка — выигран, проигран или отозван покупателем — через webhook не сообщается.
  • Чарджбэк по донату отправляется, хотя возвраты по донатам правилами платформы запрещены: чарджбэк инициирует банк, а не платформа.
  • Возврат по транзакции, по которой был чарджбэк, невозможен. Событие refund.success для неё не приходит.
  • Если после частичного возврата открыт чарджбэк, поле amount содержит оспариваемый остаток, а не полную сумму продажи.

!Статус webhook

Статус webhook

Статус показывает был ли получен webhook.

screenshot14.pngscreenshot14.png

Может быть только два статуса:

  • DELIVERED (доставлено) — webhook успешно доставлен.
  • FAILED (не доставлено) — произошел сбой при доставке.

Статус webhook определяется HTTP-кодом, который поступает вместе с событием.

Событие считается доставленным, если ваш сервис ответил кодом 2xx в течение 10 секунд. Если ответ не получен за это время, попытка считается неудачной и выполняется повторная отправка по общей политике повторов.

!Политика повторов

Политика повторов

Платформа lava.top использует HTTP-коды ответа для обозначения успешного выполнения или ошибки при обработке API-запросов.

В случае получения кода о неудачной доставке lava.top повторяет попытки отправки до 19 раз.

Если webhook не были доставлены, система предпримет попытки повторно отправить их на указанный URL. Повторные попытки осуществляются по логике: сначала 1с, 5с, 15с, далее 10 попыток с интервалом в 1 мин, далее, если не удалось, еще 5 попыток с интервалом в 1 час.

Всего будет сделано до 20 попыток.

При каждой попытке отправить webhook в историю будет добавляться событие с соответствующим HTTP-кодом. Если статус-код указывает на успех, то появится одно событие об успешной или неуспешной оплате. При неуспешном ответе может быть до 20 попыток (они прекращаются после успешной отправки или после 19 попыток). Все эти события можно просмотреть в разделе «История попыток отправки» в деталях webhook. 

screenshot15.pngscreenshot15.png

Наиболее популярные коды ответов:

  • Код 401 / Код 403 — неверные данные авторизации, нельзя получить доступ к методу принятия webhook;
  • Код 404 — в webhook прописан неверный URL
  • Код 500 — ошибка на стороне сервера автора, который принимает webhook.

screenshot16.pngscreenshot16.png

!Повторная отправка webhook

Повторная отправка webhook

С помощью кнопки стрелки каждый webhook можно отправить повторно.

screenshot17.pngscreenshot17.png

Нажмите и подтвердите отправку.

screenshot18.pngscreenshot18.png

История изменений

История изменений

Мы регулярно улучшаем возможности интеграции: добавляем новые функции, исправляем ошибки и обновляем документацию. Здесь вы можете следить за всеми изменениями.

Август 2026
Последнее

Добавлены webhooks о возвратах и чарджбэках.

  • Новые типы событий: refund.success — возврат средств по продаже, полный или частичный; chargeback.initiated — оспаривание платежа банком покупателя.
  • Новые события отмечаются в настройках webhook: Интеграции → API, поле «Тип события».
  • Payload содержит финансовый эффект на баланс: списанную сумму и комиссию эквайера.
  • Поле subscription_cancelled сообщает, отменена ли подписка этим событием. При отмене дополнительно приходит событие subscription.cancelled.

Добавлена возможность вернуть покупателя на свою страницу после оплаты.

  • В POST /api/v3/invoice добавлены опциональные поля successful_return_url, failure_return_url, cancel_return_url.
  • К адресу возврата добавляются параметры invoiceId и status.
  • Если адреса не переданы, поведение после оплаты не меняется.

Важно для действующих интеграций.

  • Перед включением новых типов событий убедитесь, что ваш обработчик возвращает 2xx на незнакомый тип события.
  • Параметр status в адресе возврата не является подтверждением оплаты. Доступ к контенту выдавайте по webhook.
Май 2026

Добавлена возможность создания контракта на произвольную сумму через API.

Реализован метод POST /api/v3/invoice с поддержкой параметров amount и currency для продуктов, опубликованных с признаком «Цена по запросу через API».

Поддерживаемые типы контента: Цифровой продукт, Консультация, Курс.

Поддерживаемые валюты: RUB, USD, EUR. Тип контракта: ONE_TIME.

Декабрь 2025

Обновлена навигация раздела «Интеграции».

В ЛК автора появился самостоятельный раздел «Интеграции» в боковом меню. Управление API-ключами и веб-хуками перенесено сюда из раздела Профиль. Навигационный путь: Интеграции → API.

Июль 2025

Добавлена возможность оплаты подписок через Stripe.

Реализованы методы /api/v2/invoices и /api/v2/invoices/{id} с обновленной типизацией контрактов:

  • INVOICE - оплата продуктов, консультаций, курсов,
  • SUBSCRIPTION_FIRST_INVOICE - первое списание по подписке,
  • SUBSCRIPTION_RENEWAL - рекуррентный платеж по подписке.
Апрель 2025

Добавлена возможность отправки донатов через Stripe.

Доработан запрос GET /invoices: теперь возвращается поле parentInvoiceId (ID родительской транзакции при оформлении подписки).

Февраль 2025

Добавлена возможностью оплаты через PayPal:

  • оплата подписок,
  • отправка доната.

Улучшен функционал работы с webkook:

  • возможность повторной отправки,
  • получение списка webhook,
  • добавление типа (события) в тело webhook,
  • возможность поиска webhook по Product ID в ЛК кабинете автора (Интеграции → API → История веб-хуков).
Январь 2025

Добавлена поддержка UTM-меток.

Декабрь 2024

Добавлена возможность оплаты цифровых продуктов через провайдера Stripe.

FAQs

FAQs

Здесь мы собрали наиболее частые вопросы, которые могут возникать у пользователей нашего API.

!Общие вопросы

Общие вопросы

!С какого IP-адреса будут приходить webhook?

С какого IP-адреса будут приходить webhook?

!Какой URL использовать для отправки запросов (LAVA_API_URL)?

Какой URL использовать для отправки запросов (LAVA_API_URL)?

!Как принимать платежи по API?

Как принимать платежи по API?

!Как правильно установить валюту и платежного провайдера?

Как правильно установить валюту и платежного провайдера?

!Нужно ли отвечать на webhook?

Нужно ли отвечать на webhook?

!Есть ли тестовая зона?

Есть ли тестовая зона?

!Каким параметром передается ключ на API?

Каким параметром передается ключ на API?

!Можно ли отправлять webhook на HTTP?

Можно ли отправлять webhook на HTTP?

!Необходимо ли пользователю вводить адрес электронной почты на стороне сервиса?

Необходимо ли пользователю вводить адрес электронной почты на стороне сервиса?

!Осуществляется ли проверка данных?

Осуществляется ли проверка данных?

!Клиент оплатил, но я не получил webhook. Почему?

Клиент оплатил, но я не получил webhook. Почему?

!Есть ли ограничения по времени у ссылки на оплату?

Есть ли ограничения по времени у ссылки на оплату?

!Можно ли передать свои данные при создании ссылки на оплату?

Можно ли передать свои данные при создании ссылки на оплату?

!Можно ли вернуть покупателя на мою страницу после оплаты?

Можно ли вернуть покупателя на мою страницу после оплаты?

!Можно ли выдавать доступ по параметру status?

Можно ли выдавать доступ по параметру status?

!Почему покупатель попал на failure_return_url вместо cancel_return_url?

Почему покупатель попал на failure_return_url вместо cancel_return_url?

!Работают ли адреса возврата при продлении подписки?

Работают ли адреса возврата при продлении подписки?

!Передаются ли данные покупателя в адрес возврата?

Передаются ли данные покупателя в адрес возврата?

!Покупка/продажа продуктов

Покупка/продажа продуктов

!Как выглядят webhook при оплате продуктов?

Как выглядят webhook при оплате продуктов?

!Можно ли увидеть скрытый со страницы автора продукт через API?

Можно ли увидеть скрытый со страницы автора продукт через API?

!Подписки

Подписки

!Как создать рекуррентный платёж?

Как создать рекуррентный платёж?

!Как создать подписку с рекуррентными платежами более чем на один месяц?

Как создать подписку с рекуррентными платежами более чем на один месяц?

!Как принимать платежи по подписке с разными периодами оплаты?

Как принимать платежи по подписке с разными периодами оплаты?

!Какие есть периоды оплаты подписок?

Какие есть периоды оплаты подписок?

!В чём разница между contractId и parentContractId?

В чём разница между contractId и parentContractId?

!Как выглядят webhook при оплате подписки?

Как выглядят webhook при оплате подписки?

!Есть ли дополнительные попытки списания, если платеж не прошел?

Есть ли дополнительные попытки списания, если платеж не прошел?

!Как автор может отменить подписку клиента?

Как автор может отменить подписку клиента?

!Можно ли проверить статус подписки через API?

Можно ли проверить статус подписки через API?

!Можно ли оформить одну и ту же подписку дважды?

Можно ли оформить одну и ту же подписку дважды?

!Как обновить стоимость подписки?

Как обновить стоимость подписки?

!События webhook

События webhook

!Если webhook не был отправлен из-за ошибки, будет ли он отправлен позже?

Если webhook не был отправлен из-за ошибки, будет ли он отправлен позже?

!Нет события в истории webhook — что это значит?

Нет события в истории webhook — что это значит?

!Можно ли получить информацию по всем webhook за прошлый период?

Можно ли получить информацию по всем webhook за прошлый период?

!Как найти нужное событие в истории webhook через фильтр?

Как найти нужное событие в истории webhook через фильтр?

!Что значат HTTP-коды у webhook?

Что значат HTTP-коды у webhook?

!Можно отправить webhook повторно?

Можно отправить webhook повторно?

!Приходит ли webhook при возврате средств?

Приходит ли webhook при возврате средств?

!Чем отличается возврат от чарджбэка?

Чем отличается возврат от чарджбэка?

!Сообщается ли итог чарджбэка?

Сообщается ли итог чарджбэка?

!Отменяется ли подписка при возврате?

Отменяется ли подписка при возврате?

!Почему у новых событий другая структура?

Почему у новых событий другая структура?

!Гарантирован ли порядок доставки событий?

Гарантирован ли порядок доставки событий?

!Что делать, если пришло незнакомое событие?

Что делать, если пришло незнакомое событие?

!Как включить новые типы событий?

Как включить новые типы событий?

Готовы начать?

Создайте API key и начните интегрировать
платежи в ваш сервис уже сегодня