Отправка писем и транзакций через Adapty Mail API

Adapty Mail API позволяет отправлять профили пользователей и транзакции в Adapty Mail напрямую с вашего сервера, минуя SDK Adapty. Используйте его, если вы хотите:

  • Добавляйте подписчиков, если у вас ещё нет базы в Adapty Mail.
  • Переиспользуйте базу подписчиков из других ваших приложений.
  • Передавайте данные в Adapty Mail напрямую с сервера, используя ваш бэкенд как источник истины.
Note

API или SDK? Большинство приложений передают данные в Adapty Mail через SDK Adapty, который автоматически собирает адреса электронной почты и данные о покупках — см. Подключение Adapty к Adapty Mail. Используйте API, если в вашем приложении нет SDK Adapty, если данные уже хранятся на вашем сервере или если вы импортируете подписчиков из другого источника. API можно также использовать вместе с другой точкой входа. Adapty Mail идентифицирует пользователей по адресу электронной почты. Если два источника сообщают об одном и том же адресе, они попадают в один профиль; разные адреса создают отдельные профили, даже если customer_user_id совпадает.

Перед началом работы

Warning

Завершите настройку Adapty Mail до отправки данных — это значит создать кампанию, сегменты (если нужны), веб-пейвол и запустить флоу. Adapty Mail отправляет письма только профилям, созданным после завершения этой настройки; профили, добавленные раньше, не получат никаких писем. Сначала пройдите Начало работы с Adapty Mail, а затем возвращайтесь сюда.

Вам также понадобятся API-ключ и базовый URL:

  • Секретный API-ключ: В Adapty Mail перейдите в Settings > Project и скопируйте Secret key. Ключ привязан к проекту, поэтому API понимает, к какому проекту относятся данные.
  • Базовый URL: Все запросы отправляются на https://api-mail.adapty.io.
  • Аутентификация: Передавайте ключ в заголовке Authorization в формате Bearer {your_secret_api_key}.
Important

Получите явное согласие пользователей, прежде чем собирать email-адреса и отправлять их в Adapty Mail. Вы несёте ответственность за соответствие требованиям GDPR, CAN-SPAM и аналогичных нормативных актов в ваших регионах.

Отправка профилей пользователей

Профиль содержит email пользователя и его атрибуты. Чтобы создать или обновить профиль, отправьте POST-запрос на /api/v1/profile/save/.

Обязательные поля:

  • Стабильный external_profile_id, которым владеет ваше приложение или бэкенд
  • email — адрес, на который Adapty Mail доставляет кампании
  • external_created_at — время создания пользователя, которое можно использовать в сегментах
Important

Всегда передавайте стабильный external_profile_id — никогда анонимный или привязанный к конкретной установке. Adapty Mail использует его, чтобы связывать письма, клики и покупки с одним профилем.

Если тот же пользователь попадает в Adapty Mail через другую точку входа, передавайте customer_user_id — тот же идентификатор пользователя, который отправляет источник. Для Adapty SDK это значение, которое вы передаёте в Adapty.identify(); FunnelFox передаёт тот, что хранит у себя. Этот параметр не определяет, на какой профиль попадёт пользователь — это делает адрес электронной почты. Но он добавляет второй способ найти профиль: событие транзакции, содержащее его, обрабатывается без email, а удаление может указывать его вместо адреса.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/save/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "external_profile_id": "user_12345",
    "external_created_at": "2026-06-01T10:30:00Z",
    "email": "jane@example.com",
    "country": "US",
    "custom_attributes": {
      "plan": "trial"
    }
  }'
Note

country и store_country принимают двухбуквенный код ISO 3166-1 alpha-2 — US, а не USA или United States. Любое другое значение будет отклонено.

device_info описывает устройство пользователя. Объект необязателен, но platform должен присутствовать всякий раз, когда вы его передаёте.

ПолеОпциональноеФильтр сегментаПримечания
platformНетДа
deviceДаДаМодель устройства.
osДаДа
localeДаДаAdapty Mail использует это поле, чтобы определить, какой перевод локализованной кампании отправить. Пользователь без локали получает письма на английском.
app_versionДаДаСравнивается в порядке версий, поэтому 1.10.0 стоит выше, чем 1.9.0.
timezoneДаНетОпределяет, когда пользователь получает письма. Без этого поля Adapty Mail считает часовой пояс пользователя UTC, и окно отправки 08:00–21:00 применяется по UTC, а не по местному времени пользователя.

См. справочник Сохранить профиль для получения информации обо всех доступных полях.

Отправка событий транзакций

Note

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

Все флоу, кроме never purchased, формируются на основе истории покупок. Отправляйте события транзакций профиля при обработке покупок, продлений и отмен — так Adapty Mail правильно определит, в какой флоу попадёт пользователь. События транзакций также обеспечивают атрибуцию выручки. Пропускайте их только в том случае, если вы запускаете исключительно кампании never purchased.

Чтобы зафиксировать транзакцию, отправьте POST-запрос на /api/v1/profile/transaction-event/save/. Используйте тот же external_profile_id, что вы отправляли вместе с профилем, — так Adapty Mail свяжет транзакцию с нужным пользователем.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/transaction-event/save/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "event_type": "subscription_started",
    "event_id": "evt_abc123",
    "event_datetime": "2026-06-10T14:20:05Z",
    "external_profile_id": "user_12345",
    "store": "app_store",
    "store_product_id": "premium_monthly",
    "store_transaction_id": "1000000123456789",
    "store_original_transaction_id": "1000000123456789",
    "purchased_at": "2026-06-10T14:20:00Z",
    "originally_purchased_at": "2026-06-10T14:20:00Z",
    "price_usd": "9.99"
  }'

See the Save transaction event reference for every available field.

You can send a transaction before the profile exists. Adapty Mail keeps the event unattached, then links it to the profile on the next save that includes the same external_profile_id.

Удаление профиля

Чтобы выполнить запрос на удаление данных, отправьте идентификаторы профиля на /api/v1/profile/delete/. Adapty Mail удалит персональные данные профиля и отменит его запланированные письма.

curl --request POST \
  --url 'https://api-mail.adapty.io/api/v1/profile/delete/' \
  --header 'Authorization: Bearer {your_secret_api_key}' \
  --header 'Content-Type: application/json' \
  --data '{
    "external_profile_id": "user_12345"
  }'

Идентифицируйте профиль по external_profile_id, customer_user_id или email — укажите хотя бы один параметр. Adapty Mail удаляет сохранённые данные, но не блокирует адрес: если источник снова пришлёт его, появится новый профиль без истории. Чтобы навсегда исключить пользователя, нужно остановить источник, который передаёт его данные.

Запрос на удаление, который завис по таймауту, оставляет вас в неопределённости — дошёл ли он до сервера, — и вы отправляете его повторно. Повторный вызов безопасен, если вы идентифицируете профиль по external_profile_id или customer_user_id: он завершится успешно и ничего не изменит. Повторный вызов, содержащий только email, вернёт 404, поскольку первое удаление очистило адрес, по которому произошло бы совпадение. Все коды ответов перечислены в справочнике Delete profile.

Привяжите события к флоу

Отправляйте event_type, соответствующий произошедшему событию. Adapty Mail определяет состояние профиля на основе истории событий и направляет его в подходящее флоу.

event_typeКогда отправлятьФлоу
subscription_startedПользователь оформляет новую подписку.Активна — без флоу повторного вовлечения
subscription_renewedПодписка автоматически продлевается.Активна — без флоу повторного вовлечения
subscription_renewal_reactivatedПользователь снова включает автопродление.Активна — без флоу повторного вовлечения
non_subscription_purchaseПользователь совершает разовую покупку.Активна — без флоу повторного вовлечения
subscription_renewal_cancelledПользователь отключает автопродление (подписка остаётся активной до истечения срока).Отмена продления
billing_issue_detectedПлатёж за продление не проходит.Проблема с оплатой
entered_grace_periodПлатёж не прошёл, но пользователь находится в льготном периоде.Проблема с оплатой
subscription_expiredПодписка истекает и доступ заканчивается.Истекла
subscription_refundedПокупка подписки возвращается.Возврат
non_subscription_purchase_refundedРазовая покупка возвращается.Возврат