Verificar y otorgar acceso a suscripciones desde tu backend

Desde tu backend, usa la API de servidor de Adapty para comprobar si un usuario tiene una suscripción activa y para conceder acceso manualmente. Esta guía cubre las dos llamadas más comunes — getProfile y grantAccessLevel — y muestra cómo hacer que un agente de codificación con IA escriba la integración para tu stack.

Tip

¿Usas un agente de codificación con IA? Haz clic en Copy for LLM debajo del título y pega toda esta página en tu agente — contiene las llamadas, los campos y los detalles que necesita.

Antes de empezar

  • Una clave de API secreta: Encuéntrala en App settings → General, en el campo Secret key. Las claves son específicas de cada app. Guárdala en una variable de entorno (por ejemplo, ADAPTY_SECRET_KEY) y envíala como Authorization: Api-Key {key}.
  • La URL base: Todas las solicitudes van a https://api.adapty.io.
  • Una forma de identificar al usuario: Envía adapty-customer-user-id (tu propio ID de usuario — solo funciona si identificas a los usuarios en la app) o adapty-profile-id (el ID de perfil de Adapty). Son intercambiables; usa uno.

Comprobar una suscripción

Para comprobar el estado, llama a getProfile con GET y pasa el identificador de usuario como encabezado — no hay cuerpo de solicitud.

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
}

A diferencia del perfil del SDK, la respuesta del servidor no tiene campo is_active. Determina el estado tú mismo a partir de access_levels[].expires_at: null significa acceso de por vida, una fecha futura significa activo y una fecha pasada significa expirado. Trata is_in_grace_period como aún activo. Para ver todos los campos de perfil y nivel de acceso, consulta getProfile.

Conceder acceso manualmente

Para desbloquear funciones de pago sin una compra —códigos promocionales, acceso para inversores o beta testers, casos de soporte— llama a grantAccessLevel con 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
});

Dos cosas a tener en cuenta:

  • El nivel de acceso debe existir previamente en tu dashboard (Access levels) — access_level_id es su identificador, no un nombre nuevo.
  • Las concesiones manuales no aparecen en los análisis. Solo se entregan a tu integración de webhook y al Event Feed, por lo que los gráficos de ingresos y conversión no las reflejarán.

Para los detalles de solicitud y respuesta, consulta grantAccessLevel.

Constrúyelo con tu agente de código IA

Dale a tu agente de código IA esta guía y la especificación de la API en Markdown (añade .md a cualquier URL de página), indícale tu stack y deja que escriba las llamadas:

Ejemplo de prompt:

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.

Límites

  • Límite de solicitudes: Se aplica por clave API y se asigna por app, por lo que no hay una cifra única válida para todas — consulta Límites de solicitudes. Es una tasa sostenida, no un presupuesto por minuto, y algunos endpoints tienen un límite inferior: createVirtualCurrencyTransaction permite 600 solicitudes por minuto por app por defecto. Indica a tu agente que reintente con backoff al recibir un 429 y que respete el encabezado Retry-After cuando esté presente.
  • Claves específicas por app: Cada clave funciona para una sola app; usa la clave correspondiente en cada caso.
  • Se requiere un identificador: Cada solicitud necesita adapty-customer-user-id o adapty-profile-id.