API: как работать с документацией?
Документация API помогает разработчикам понять, как работать с API: какие параметры нужно передавать и какие ответы ожидать. Она служит основой для создания, поддержки и расширения интеграций программного обеспечения, основанных на API.
Ознакомиться с документацией можно по ссылке — https://gate.lava.top/docs. Не забудьте предварительно авторизоваться. Это можно сделать через:
- Bearer-токен;
- API-ключ, который был создан в личном кабинете lava.top.
В верхней части страницы можно найти полный перечень доступных методов API, а в нижней — подробные схемы, которые помогут лучше понять их структуру.
Доступные методы:
Products:
- GET/api/v1/invoice — этот метод поможет создать контракт на покупку и принять оплаты.
- GET/api/v2/products — с помощью этого метода можно получить список всех продуктов автора.
- PATCH/api/v2/products/{productId} — подойдет для обновления стоимости продукта (на данный момент неактивен).
Invoices:
- POST/api/v2/invoice — метод для создания контракта на покупку контента (аналогичен /api/v1/invoice).
- GET/api/v1/invoices — метод для получения страницы контрактов API-ключа, использованного в запросе.
- GET/api/v1/invoices/{id} — поможет проверить конкретный контракт по его id.
Reports:
- GET/api/v1/sales/ — этот метод поможет увидеть список всех продаж автора.
- GET/api/v1/sales/{productId} — необходим для просмотра продаж автора по конкретному продукту.
Subscriptions:
- DELETE/api/v1/subscriptions — этот метод поможет отменить подписку у клиента.
Donate:
- GET/api/v1/donate — с помощью этого метода можно принимать донаты.
Webhooks:
- POST/example-of-webhook-route-contract — здесь можно увидеть пример API-метода, которому должен следовать сервис автора для приёма вебхуков от lava.top
Интерактивность документации поможет протестировать методы и убедиться в их корректной работе. Чтобы опробовать метод, нажмите кнопку «Try it out», введите необходимые данные и выберите опцию «Execute».
Далее в статье собраны ответы на вопросы, которые могут возникнуть в процессе работы с документацией.
Содержание:
Общие вопросы
Вопросы о подписках
Общие вопросы
С каких IP-адресов будут поступать вебхуки?
Исходящие соединения происходят с IP-адреса 158.160.60.174.
Какой URL использовать для отправки запросов (LAVA_API_URL)?
Запросы необходимо отправлять на gate.lava.top.
Как принимать платежи по API?
Оплаты принимаются через метод POST — /api/v2/invoice. Вот что надо сделать, чтобы создать ссылку на оплату (создать invoice):
1. Получить список продуктов методом GET v2/products.
2. Выбрать продукт, который хотим продавать.
3. Скопировать offer_id продукта, по которому хотим получать платежи.
4. Отправить запрос на создание invoice методом POST v2/invoice. Для этого укажите в запросе:
- email покупателя;
- offer_id продукта;
- currency — валюту в которой будет покупка;
- paymentMethod — банк, через который пройдет оплата;
- language — язык, на котором будут отправляться письма клиенту об успешной покупке;
- clientUTM — метки, которые можно использовать для более точной информации об оплате (подробнее здесь).
5. Покупатель получит ссылку на оплату.
Как правильно установить валюту и платежный метод?
С карт российских банков можно оплатить в ₽, а с иностранных — в $ или €.
Для платежей в ₽ (RUB) доступен платежный метод BANK131, для платежей в € (EUR) или $ (USD) — UNLIMINT, PAYPAL и STRIPE.
*STRIPE доступен только для оплаты продуктов.
Как выглядят вебхуки при оплате продуктов?
Успешно оплаченный продукт (не подписка):
{
"buyer": {
"email":"[email protected]"
},
"amount":0,
"status":"completed",
"product": {
"id":"06d8bbba-01ee-437c-b646-b729e8b10d94",
"title":"Чек-лист для путешественников"
},
"currency":"RUB",
"eventType":"payment.success",
"timestamp":"2025-02-25T17:41:00.214516Z",
"contractId":"3115b27b-2312-430a-9ea4-5dfe200afedd",
"errorMessage":""
}
Ошибка при совершении оплаты продукта (не подписка):
{
"buyer": {
"email":"[email protected]"
},
"amount":2050,
"status":"failed",
"product": {
"id":"06d8bbba-01ee-437c-b646-b729e8b10d95",
"title":"Чек-лист для путешественников"
},
"currency":"RUB",
"timestamp":"2025-01-19T14:00:38.217567Z",
"contractId":"b6dbcbc8-76c6-44b1-b884-a6fa83e319e3",
"errorMessage":"Payment window is opened but not completed"
}
Успешно оплаченный продукт с UTM-меткой (не подписка):
{
"buyer": {
"email":"[email protected]"
},
"amount":0,
"status":"completed",
"product": {
"id":"06d8bbba-01ee-437c-b646-b729e8b10d98",
"title":"Чек-лист для путешественников"
},
"currency":"EUR",
"clientUtm": {
"utm_source":"google"
},
"eventType":"payment.success",
"timestamp":"2025-02-26T05:37:03.253994Z",
"contractId":"3fbf3ebd-2f3f-473b-820b-7089b5af0231",
"errorMessage":""
}
Клиент купил продукт, но я не получил вебхук. Почему?
Скорее всего, клиент купил продукт через платформу, а не через настроенную интеграцию. Такие платежи не видны при запросе по API, их можно отслеживать в личном кабинете в разделе «Мои продажи».
Также важно, чтобы для каждого типа события был настроен соответствующий вебхук.
Например, для приёма платежей по продуктам нужно создать только вебхук с типом «Результат платежа», а для подписок два: «Результат платежа» — на него будут приходить события оформления подписки (первая оплата) и «Регулярный платёж» — на него будут приходить события продления подписки (все последующие автоматические оплаты).
Если вебхуки не были отправлены из-за ошибки, будут ли они отправлены позже?
Если вебхуки не были доставлены, система предпримет попытки повторно отправить их на указанный URL. Периодичность повторных попыток составляет:
- 1s,
- 5s,
- 15s,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1m,
- 1h,
- 1h,
- 1h,
- 1h,
- 1h.
Всего будет сделано до 20 попыток.
Нужно ли отвечать на вебхуки?
Да, на вебхуки нужно отвечать кодом 2ХХ или 3ХХ.
Это подтверждает, что запрос получен успешно. Любая другая информация, возвращаемая в заголовках или теле запроса, в таком случае игнорируется.
Есть ли тестовая зона?
Сейчас тестовой зоны нет. Однако можно протестировать интеграцию с минимальным по стоимости контентом. Например, для подписки минимальный платёж составит 50₽, 5$ или 5€.
Есть ли ограничения по времени у ссылки на оплату?
Для контрактов в $ и € этот срок составляет 15 минут, а для контрактов в ₽ — 24 часа.
Можно ли увидеть скрытый со страницы автора продукт через API?
Продукт будет отображаться, если в запросе на получение списка продуктов указать параметр feedVisibility со значением ALL или ONLY_HIDDEN. Если же указать ONLY_VISIBLE, продукт не будет виден.
Возможные значения: ALL, ONLY_VISIBLE, ONLY_HIDDEN. По умолчанию используется ONLY_VISIBLE.
Каким параметром передается ключ на API?
Ключ передается через хедеры X-Api-Key:{api_key}
Пример запроса:
curl --location 'https://gate.lava.top/api/v2/invoice' \
--header 'accept: application/json' \
--header 'X-Api-Key: a3qwWQdrzGdASXEoORla2B5BUGhxWlpGW9 Z4U0S9VyGHA1ScHJVXb9VStpj35OLV' \
--header 'Content-Type: application/json' \
--data-raw '{
"email":"[email protected]",
"offerId": "d3d784da-124c-4124-8a00-0a22abcb9bb0",
"currency": "RUB",
"buyerLanguage":"EN"
}'
Можно ли отправлять вебхуки на HTTP?
Нет, URL-адрес, по которому будут отправляться вебхуки, должен быть защищён протоколом HTTPS. Мы ввели ограничение на использование HTTP в целях безопасности.
Необходимо ли пользователю вводить адрес электронной почты на стороне сервиса?
Да, эта информация должна быть получена и передана при создании инвойса, иначе возникнет ошибка.
Можно ли передать свои данные при создании ссылки на оплату?
При создании контракта через API можно указать UTM-метки. Вот как это работает:
При отправке запроса POST /invoice автор может передать объект clientUtm, который может содержать один или несколько параметров, начинающихся с utm_*.
- utm_source (источник трафика, например Google, Facebook) — максимум 100 символов;
- utm_medium (средство маркетинговой кампании, например электронная почта, CPC, баннер) — максимум 100 символов;
- utm_campaign (конкретное имя кампании или идентификатор, например spring_sale, product_launch) — максимум 100 символов;
- utm_term (ключевые слова или поисковые термины для платных кампаний, например «sneakers») — максимум 100 символов;
- utm_content (варианты одного и того же объявления или кампании, например «banner_ad_A») — максимум 100 символов.
Пример:
}
curl -X 'POST' \
'https://gate.lava.top/api/v2/invoice' \
-H 'accept: application/json' \
-H 'X-Api-Key: 0oURuGfr83o85FgAyGmzPEzfMo46phQNexByKYTwTtbGst7tPLmKdxraGHZAPNWa' \
-H 'Content-Type: application/json' \
-d '{
"email": "[email protected]",
"offerId": "77fbbeac-792f-4f19-9d3e-0e6918238944",
"periodicity": "ONE_TIME",
"currency": "RUB",
"paymentMethod": "BANK131",
"buyerLanguage": "RU",
"clientUtm": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "summer_sale",
"utm_term": "running_shoes",
"utm_content": "homepage_banner"
}
}'
Если при создании контракта были применены UTM-метки, они будут возвращены в веб-хук события.
Осуществляется ли проверка данных?
Со своей стороны мы проверяем корректность данных, в частности, email адрес. Например, покупатель не сможет ввести невалидный адрес. Также мы контролируем валюту платежа — нельзя создать платёж в валюте, отличной от ₽, $ или €. Кроме того, мы проверяем offerId — нельзя создать платёж на идентификатор продукта другого автора или несуществующего продукта.
Вопросы о подписках
Как создать рекуррентный платеж?
Тип контракта определяется автоматически в зависимости от выбранного продукта. Можно выделить два основных типа продуктов:
1. Subscription (подписка) — контракты этого типа всегда будут повторяющимися. Покупатель должен будет совершить первый платёж вручную, а последующие платежи будут происходить автоматически с заданной периодичностью, например, раз в месяц. Также можно настроить другие периоды оплаты.
2. Все остальные типы (продукт, курс, консультация и донат) — для них будет доступен только обычный платёж, то есть разовое списание.
Поэтому для подписки нужно создать два вебхука с типами события: «Результат платежа» и «Регулярный платеж». На первый будут приходить события оформления подписки (первый платеж), на второй — продления (все последующие автоматические платежи).
Как создать подписку с рекуррентными платежами более чем на один месяц?
Сделать это можно через личный кабинет. Для этого перейдите в раздел редактирования тарифов подписки и отметьте галочками периоды, которые хотите включить в подписку. Также укажите стоимость каждого периода.
Как принимать платежи по подписке с разными периодами оплаты?
Оплаты также принимаются через метод POST — /api/v2/invoice. Вот что нужно сделать:
1. Создать подписку в личном кабинете, включив нужные периоды оплаты.
2. Получить список тарифов подписки с различными периодами оплаты методом GET v2/products.
3. Скопировать offer_id нужного тарифа подписки.
4. Отправить запрос на создание invoice методом POST v2/invoice. Для этого укажите в запросе:
- email покупателя;
- offer_id тарифа;
- periodicity — период оплаты;
- currency — валюту в которой будет покупка;
- paymentMethod — банк, через который пройдет оплата;
- language — язык, на котором будут отправляться письма клиенту об успешной покупке;
- clientUTM — метки, которые можно использовать для более точной информации об оплате (подробнее здесь).
curl --location 'https://gate.lava.top/api/v2/invoice' \
--header 'accept: application/json' \
--header 'X-Api-Key: a3qwWQdrzGdASXEoORla2B5BUGhxWlpGW9 Z4U0S9VyGHA1ScHJVXb9VStpj35OLV' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "[email protected]",
"offerId": "d3d784da-124c-4124-8a00-0a22abcb9bb0",
"periodicity": "PERIOD_90_DAYS",
"currency": "RUB",
"paymentMethod": "BANK131",
"buyerLanguage": "EN"
}'
5. Покупатель получит ссылку на оплату.
Какие есть периоды оплаты подписок?
Существуют следующие периоды рекуррентных списаний ("periodicity"):
- 1 месяц («MONTHLY») — списание через 30 дней;
- 3 месяца («PERIOD_90_DAYS») — списание через 90 дней;
- 6 месяцев («PERIOD_180_DAYS») — списание через 180 дней;
- 12 месяцев («PERIOD_YEAR») — списание через 365 дней.
В чём разница между contractId и parentContractId?
ContractId — это уникальный идентификатор платежа. Он будет меняться для каждого нового платежа.
ParentContractId — это идентификатор родительского (первого успешно осуществленного платежа по подписке) контракта, который используется в каждом последующем дочернем платеже. Для каждого последующего платежа по подписке этот идентификатор будет одинаковым.
Если покупатель оформляет новую подписку, например, по другому тарифу или если он отменяет подписку и сразу оформляет новую, создается новый parentContractId. В таких случаях формируется новый контракт с уникальным contractId, и во всех последующих платежах будет использоваться родительский идентификатор, связанный с этим первым платежом.
Таким образом, parentContractId всегда равен contractId первого платежа.
Как выглядят вебхуки при оплате подписки?
Успешная оплата подписки:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-active",
"product": {
"id":"e3dc5b9b-d511-4b79-9457-edfb405a5cc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"payment.success",
"timestamp":"2025-02-26T05:56:37.612665Z",
"contractId":"32a8f412-2b99-408e-9682-2995971c26fc",
"errorMessage":""
}
Успешный совершенный второй, третий и последующие платежи по подписке:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-active",
"product": {
"id":"e3dc5b9b-d511-4b79-9457-edfb404a5vc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"subscription.recurring.payment.success",
"timestamp":"2025-02-26T05:39:22.774967Z",
"contractId":"1e255225-23ac-4b6a-8528-1848cf5e153f",
"errorMessage":"",
"parentContractId":"1e180437-56b7-46d9-a649-31c85403d1f2"
}
Ошибка при оплате первого платежа по подписке:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-failed",
"product": {
"id":"e3dc5b9b-d511-4b79-9457-edfb504a5cc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"payment.failed",
"timestamp":"2025-02-26T06:00:07.801014Z",
"contractId":"9fca98a4-9478-4728-a2af-90ff306ef289",
"errorMessage":"Payment window is opened but not completed"
}
Ошибка при оплате второго, третьего и последующих платежей по подписке:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-failed",
"product": {
"id":"e3dc5b9b-d511-5b79-9457-edfb404a5cc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"subscription.recurring.payment.failed",
"timestamp":"2025-02-26T05:49:35.206788Z",
"contractId":"166c85e7-456f-42e0-95fb-346a6fcd59a7",
"errorMessage":"Not sufficient funds",
"parentContractId":"a3f8bd97-29b4-47e5-907c-a2c690921120"
}
Успешная оплата подписки с UTM-меткой:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-active",
"product": {
"id":"2f4e2827-3c4e-4ab3-a2ea-2d03439a8f9c",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"clientUtm": {
"utm_source":"google"
},
"eventType":"payment.success",
"timestamp":"2025-02-26T06:10:25.520428Z",
"contractId":"0098bba1-876f-49e4-90af-96028689590f",
"errorMessage":""
}
Есть ли дополнительные попытки списания, если платеж не прошел?
Да, если очередной платеж по подписке не прошел (например, на карте было недостаточно средств), будет еще две дополнительные попытки списания: через 8 и 24 часа.
При этом автор получит вебхук только в том случае, если одна из этих попыток будет успешной и подписка продлится:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-active",
"product": {
"id":"e3dc5b9b-d511-4b79-9457-edfb404a5vc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"subscription.recurring.payment.success",
"timestamp":"2025-02-26T05:39:22.774967Z",
"contractId":"1e255225-23ac-4b6a-8528-1848cf5e153f",
"errorMessage":"",
"parentContractId":"1e180437-56b7-46d9-a649-31c85403d1f2"
}
Либо если последняя попытка также будет неуспешной и подписка автоматически отменится:
{
"buyer": {
"email":"[email protected]"
},
"amount":1000,
"status":"subscription-failed",
"product": {
"id":"e3dc5b9b-d511-5b79-9457-edfb404a5cc5",
"title":"Subscription 3094697731"
},
"currency":"RUB",
"eventType":"subscription.recurring.payment.failed",
"timestamp":"2025-02-26T05:49:35.206788Z",
"contractId":"166c85e7-456f-42e0-95fb-346a6fcd59a7",
"errorMessage":"Not sufficient funds",
"parentContractId":"a3f8bd97-29b4-47e5-907c-a2c690921120"
}
Вебхуков по каждой дополнительной попытке списания не будет.
Как автор может отменить подписку клиента?
Это можно сделать через API методом DELETE/api/v1/subscriptions. Необходимо передать ID первого контракта и почту покупателя.
Пример:
-X 'DELETE' \
'https://api.lava.top/pas/api/v1/subscriptions?contractId={parentContractId}&email={buyerEmail}' \
-H 'accept: */*' \
-H 'X-Api-Key: {api_key}'
Можно ли проверить статус подписки через API?
С помощью метода GET/api/v1/invoices можно получить список продаж, в котором также можно увидеть следующие данные:
- актуальный статус контракта;
- сумма контракта;
- почта покупателя и маска номера карты;
- название продукта и тарифа;
- для подписок — ParentInvoiceID — ID родительской транзакции по оформлению подписки;
- статус подписки (исключение — expired — подписку отменили намеренно до наступления повторного списания);
- назначенные UTM-метки по каждому контракту.
Пример:
{
"items": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"type": "ONE_TIME",
"datetime": "2025-01-17T14:02:34.852Z",
"status": "NEW",
"receipt": {
"amount": 0,
"currency": "RUB",
"fee": 0
},
"buyer": {
"email": "[email protected]",
"cardMask": "**** **** **** 1234"
},
"product": {
"name": "Урок по психологии",
"offer": "Подписка на 12 мес."
},
"parentInvoice": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
},
"subscriptionStatus": "ACTIVE",
"clientUtm": {
"utmSource": "google",
"utmMedium": "cpc",
"utmCampaign: "summer_sale",
"utmTerm": "running_shoes",
"utmContent: "homepage_banner"
}
}
],
"page": 0,
"size": 0,
"total": 0
}
Можно ли оформить одну и ту же подписку дважды?
Да, это возможно. Списания привязываются к контракту, то есть, первому платежу по подписке.
Как обновить стоимость подписки?
В настоящее время функция обновления стоимости подписки через метод PATCH products/{product_id} недоступна. Изменить стоимость можно только в личном кабинете.
Если у вас еще остались вопросы, напишите нам https://t.me/lava_sup_bot. Будем рады помочь!м