Проверка и предоставление доступа к подписке через бэкенд
Используйте серверный API Adapty, чтобы из вашего бэкенда проверять наличие активной подписки у пользователя и вручную выдавать доступ. В этом гайде рассмотрены два самых распространённых запроса — getProfile и grantAccessLevel — и показано, как поручить AI-агенту написать интеграцию под ваш стек.
Используете AI-агент? Нажмите Copy for LLM под заголовком и вставьте всю эту страницу в агент — там есть все вызовы, поля и важные нюансы.
Прежде чем начать
- Секретный ключ API: Найдите его в App settings → General, в поле Secret key. Ключи привязаны к конкретному приложению. Сохраните его в переменную окружения (например,
ADAPTY_SECRET_KEY) и передавайте в заголовкеAuthorization: Api-Key {key}. - Базовый URL: Все запросы отправляются на
https://api.adapty.io. - Способ идентифицировать пользователя: Передавайте либо
adapty-customer-user-id(ваш собственный идентификатор пользователя — работает только если вы идентифицируете пользователей в приложении), либоadapty-profile-id(идентификатор профиля Adapty). Они взаимозаменяемы — используйте любой из них.
Проверка подписки
Чтобы проверить статус, вызовите getProfile с методом GET и передайте идентификатор пользователя в заголовке — тело запроса не требуется.
const res = await fetch("https://api.adapty.io/api/v2/server-side-api/profile/", {
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
},
});
const { data } = await res.json();
function hasActiveAccess(profile, accessLevelId = "premium") {
const level = profile.access_levels?.find(a => a.access_level_id === accessLevelId);
if (!level) return false;
if (level.is_in_grace_period) return true;
if (!level.expires_at) return true; // lifetime / non-expiring
return new Date(level.expires_at) > new Date(); // not expired yet
}
if (hasActiveAccess(data)) {
// unlock premium features
}
В отличие от профиля в SDK, серверный ответ не содержит поля is_active. Определяйте статус самостоятельно по access_levels[].expires_at: null означает пожизненный доступ, дата в будущем — активная подписка, дата в прошлом — истёкшая. Считайте is_in_grace_period активным состоянием. Полное описание полей профиля и уровней доступа см. в getProfile.
Предоставление доступа вручную
Чтобы разблокировать платные функции без покупки — промокоды, доступ для инвесторов или бета-тестеров, решение обращений в поддержку — вызовите grantAccessLevel через POST.
await fetch("https://api.adapty.io/api/v2/server-side-api/purchase/profile/grant/access-level/", {
method: "POST",
headers: {
"Authorization": `Api-Key ${process.env.ADAPTY_SECRET_KEY}`,
"adapty-customer-user-id": userId,
"Content-Type": "application/json",
},
body: JSON.stringify({ access_level_id: "premium" }), // add "expires_at" for temporary access
});
- Уровень доступа должен уже существовать в вашем дашборде (Access levels) —
access_level_idэто его идентификатор, а не новое имя. - Ручные выдачи не отображаются в аналитике. Они доставляются только в вебхук-интеграцию и Event Feed, поэтому в графиках доходов и конверсий они не учитываются.
Подробнее о запросе и ответе см. grantAccessLevel.
Создайте это с помощью AI-агента
Передайте своему AI-агенту этот гайд и спецификацию API в формате Markdown (добавьте .md к любому URL страницы), укажите свой стек — и пусть он напишет вызовы:
Пример промпта:
Using the Adapty server-side API spec, write backend functions to check whether a
user has an active "premium" access level (GET /profile/, derive status from
expires_at — there's no is_active field) and to grant it (grantAccessLevel).
Authenticate with ADAPTY_SECRET_KEY and identify users by adapty-customer-user-id.
The agent writes the code, but it can’t run your backend or set your keys — you provide the secret key and the user identifiers.
Ограничения
- Лимит запросов: до 40 000 запросов в минуту на приложение.
- Ключи привязаны к приложению: каждый ключ работает только для одного приложения — используйте соответствующий ключ для каждого из них.
- Обязательный идентификатор: каждый запрос должен содержать
adapty-customer-user-idилиadapty-profile-id.