API objects
Adapty API has JSON objects so you can understand a response structure and wrap it into your code.
All datetime values are ISO 8601, for example, “2020-01-15T15:10:36.517975+0000”.
Access level
Info about customer’s access level.
Access levels let you control what your app’s users can do in your mobile app without hardcoding specific product IDs. Each product defines how long the user gets a certain access level. So, whenever a user makes a purchase, Adapty grants access to the app for a specific period (for subscriptions) or forever (for lifetime purchases). Alternatively, you can grant specific access for a specified time to a user via server-side API.
You can do the following action via Adapty server-side API:
- Check users’s access level by retrieving their profile details
- Grant specific access to your end user without providing a transaction
- Set transaction and grant access level to your end user
- Revoke access level from your end user
| Parámetro | Tipo | Obligatorio | Nullable | Descripción |
|---|---|---|---|---|
| access_level_id | String | Sí | No | ID del nivel de acceso de pago configurado en el Adapty Dashboard. |
| store | String | Sí | No | Store donde se compró el producto. Opciones: app_store, play_store, stripe o el nombre de tu store personalizado. |
| store_product_id | String | Sí | No | ID del producto en el store (como App Store, Google Play o Stripe) que desbloqueó este nivel de acceso. |
| store_base_plan_id | String | Sí | Sí | ID del plan base en Google Play o ID de precio en Stripe. |
| store_transaction_id | String | Sí | No | ID de transacción en el store (App Store, Google Play, Stripe, etc.). |
| store_original_transaction_id | String | Sí | No | Para suscripciones, este ID vincula la transacción original en la cadena de renovaciones. Las transacciones posteriores se registran como renovaciones. Si no hay renovación, store_original_transaction_id coincide con store_transaction_id. |
| offer | Object | Sí | No | El objeto Offer. Puede ser null si el cliente no tiene niveles de acceso. |
| environment | String | No | No | Entorno de la transacción que otorgó el acceso. Opciones: Sandbox, Production. |
| starts_at | ISO 8601 date | Sí | Sí | Fecha y hora en que el nivel de acceso se activa. Puede ser en el futuro. |
| purchased_at | ISO 8601 date | Sí | No | Fecha y hora de la compra más reciente para el nivel de acceso. |
| originally_purchased_at | ISO 8601 date | Sí | No | Para suscripciones, es la fecha y hora de la primera compra (original) en la cadena, vinculada a store_original_transaction_id. |
| expires_at | ISO 8601 date | Sí | Sí | Fecha y hora en que expira el nivel de acceso. Puede ser en el pasado, o null para acceso de por vida. |
| renewal_cancelled_at | ISO 8601 date | Sí | Sí | Fecha y hora en que se desactivó la renovación automática de una suscripción. La suscripción puede seguir activa; simplemente no se renovará de forma automática. Se establece en null si el usuario reactiva la suscripción. |
| billing_issue_detected_at | ISO 8601 date | Sí | Sí | Fecha y hora en que se detectó un problema de facturación (como un cargo fallido a la tarjeta). La suscripción puede seguir activa. Se limpia si el pago se procesa posteriormente. |
| is_in_grace_period | Boolean | Sí | No | Indica si la suscripción está en un período de gracia (solo para suscripciones de renovación automática). |
| cancellation_reason | String | Sí | Sí | Motivo de cancelación, con opciones como: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, upgraded, unknown. |
Although the SDK includes the is_active parameter to check if a subscription is active, the server-side API does not provide this parameter. However, you can determine subscription status at any time by checking whether the current date falls between the starts_at and expires_at parameters.
Installation Meta
Information about installation of the app on a specific device.
You can do the following action via Adapty server-side API:
| Parameter | Type | Required | Nullable | Description |
|---|---|---|---|---|
| device_id | String | Yes | No | The device identifier is generated on the client side. |
| device | String | No | Yes | The end-user-visible device model name. |
| locale | String | No | Yes | The locale used by the end user. |
| os | String | No | Yes | The operating system used by the end user. |
| platform | String | No | Yes | The device platform used by the end user. |
| timezone | String | No | Yes | The timezone of the end user. |
| user_agent | String | No | Yes | Details about the end user environment: device, operating system, and browser information of the end user interacting with your application. |
| idfa | String | No | Yes | The Identifier for Advertisers, assigned by Apple to a user’s device. |
| idfv | String | No | Yes | The Identifier for Vendors (IDFV) is a code assigned to all apps by one developer and is shared across all apps by that developer on your device. |
| advertising_id | String | No | Yes | The Advertising ID is a unique identifier offered by the Android Operating System that advertisers might use to uniquely identify you. |
| android_id | String | No | Yes | On Android 8.0 (API level 26) and higher versions of the platform, a 64-bit number (expressed as a hexadecimal string), unique to each combination of app-signing key, user, and device. For more details, see Android developer documentation. |
| android_app_set_id | String | No | Yes | An AppSetId - unique, per-device, per developer-account user-resettable ID for non-monetizing advertising use cases. |
Non Subscription
Info about non-subscription purchases. These can be one-time (consumable) products, unlocks (like new map unlock in the game), etc.
You can do the following action via Adapty server-side API:
- Check user’s current non-subscriptions by retrieving their profile details
| Parameter | Type | Required | Nullable | Description |
|---|---|---|---|---|
| purchase_id | String | Yes | No | Identifier of the purchase in Adapty. You can use it to ensure that you’ve already processed this purchase, for example tracking one-time products. |
| store | String | Yes | No | Store where the product was purchased. Possible values are: app_store, play_store, stripe, name of your custom store. |
| store_product_id | String | Yes | No | Identifier of the product in the app store (App Store/Google Play/Stripe, etc.) that unlocked this access level. |
| store_base_plan_id | String | Yes | Yes | Base plan ID in the Google Play Store or price ID in Stripe. |
| store_transaction_id | String | Yes | No | The ID of the transaction in the app store (App Store/Google Play/Stripe, etc.). |
| store_original_transaction_id | String | Yes | No | In case of prolonged subscriptions, a chain of subscriptions is generated. The original transaction i the very first transaction in this chain and the chain is linked by it. Other transactions in the chain are prolongations. If no prolongation, |
| purchased_at | ISO 8601 date | Yes | No | The datetime when the access level was purchased the latest time. |
| environment | String | No | No | Environment of the transaction that provided the access level. Possible values: Sandbox, Production. |
| is_refund | Boolean | Yes | No | Indicates if the product has been refunded. |
| is_consumable | Boolean | Yes | No | Indicates whether the product is consumable. |
One-Time Purchase
| Parámetro | Tipo | Obligatorio | Nullable | Descripción |
|---|---|---|---|---|
| purchase_type | String | Sí | No | El tipo de producto comprado. Valor posible: one_time_purchase. |
| store | String | Sí | No | Store donde se compró el producto. Valores posibles: app_store, play_store, stripe o el Store ID de tu store personalizada. |
| environment | String | No | No | Entorno de transacción que proporcionó el nivel de acceso. Opciones: Sandbox, Production. Se usa Production por defecto. |
| store_product_id | String | Sí | No | El ID del producto en la store (App Store, Google Play, Stripe, etc.) que desbloqueó este nivel de acceso. |
| store_transaction_id | String | Sí | No | ID de transacción en la store (App Store, Google Play, Stripe, etc.). |
| store_original_transaction_id | String | Sí | No | En suscripciones recurrentes, es el ID de transacción original que vincula la cadena de renovaciones. La transacción original es la primera de la cadena; las posteriores son renovaciones. Si no hay renovación, |
| offer | Object | No | Sí | La oferta utilizada para la compra como objeto Offer. |
| is_family_shared | Boolean | No | No | Valor booleano que indica si el producto admite compartir en familia en App Store Connect. Solo iOS. Siempre false en iOS inferior a 14.0 y macOS inferior a 11.0. Se usa false por defecto. |
| price | Object | Sí | No | Precio de la compra única como objeto Price. Una compra inicial de suscripción con coste cero es una prueba gratuita; una renovación con coste cero es una renovación gratuita. |
| purchased_at | ISO 8601 date | Sí | No | La fecha y hora en que se realizó la última compra del nivel de acceso. |
| refunded_at | ISO 8601 date | No | No | Si se reembolsó, muestra la fecha y hora del reembolso. |
| cancellation_reason | String | No | No | Posibles motivos de cancelación: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, cancelled_by_developer, new_subscription, unknown. |
| variation_id | String | No | No | El ID de variante utilizado para rastrear las compras hasta el paywall específico desde el que se realizaron. |
Offer
Information on the applied offer. The Offer object is a part of the Subscription, and Access level objects.
You can do the following actions with offers via Adapty server-side API:
- Apply offer when setting a transaction to your user
| Parameter | Type | Required | Nullable | Description |
|---|---|---|---|---|
| category | String | Yes | No | The category of the applied offer. Options are: introductory, promotional, offer_code, win_back. |
| type | String | Yes | No | The type of active offer. Options are: free_trial, pay_as_you_go, pay_up_front, and unknown. If this isn’t null, it means the offer was applied in the current subscription period. |
| id | String | No | Yes | The ID of the applied offer. |
Price
Information about the cost of your product in local currency. The Price object is a part of the Subscription and Purchase objects.
You can do the following actions with product price via Adapty server-side API:
- Set transaction to your user and specify its price
| Parameter | Type | Required | Nullable | Description |
|---|---|---|---|---|
| country | String | Yes | No | The country where the price applies. |
| currency | String | Yes | No | The currency used for the price. |
| value | Float | Yes | No | The product’s cost in the local currency. |
Profile
Info about the customer and their subscription
You can do the following actions with user profiles via Adapty server-side API:
- Retrieve/get the end-user’s profile with their access levels, subscriptions, non-subscriptions, etc.
- Create a new end-user profile
- Update your end-user profile
- Delete your end-user
| Parámetro | Tipo | Nullable | Descripción |
|---|---|---|---|
| app_id | String | :heavy_minus_sign: | El ID interno de tu app. Puedes verlo en el Adapty Dashboard: App Settings -> pestaña General. |
| profile_id | UUID | :heavy_minus_sign: | ID de perfil de Adapty. Puedes verlo en el campo Adapty ID en el Adapty Dashboard -> Profiles -> página del perfil específico. |
| customer_user_id | String | :heavy_plus_sign: | El ID de tu usuario en tu sistema. Puedes verlo en el campo Customer user ID en el Adapty Dashboard -> Profiles -> página del perfil específico. Solo funcionará si identificas a los usuarios en el código de tu app móvil mediante el SDK. |
| total_revenue_usd | Float | :heavy_minus_sign: | Un valor flotante que representa los ingresos totales en USD generados en el perfil. |
| segment_hash | String | :heavy_minus_sign: | Parámetro interno. |
| timestamp | Integer | :heavy_minus_sign: | Tiempo de respuesta en milisegundos; necesario para resolver condiciones de carrera. |
| custom_attributes | Array | :heavy_minus_sign: | Se permite establecer un máximo de 30 atributos personalizados en el perfil. Si incluyes el array Clave: La clave debe ser una cadena de no más de 30 caracteres. Solo se permiten letras, números, guiones, puntos y guiones bajos. Valor: El valor del atributo no puede superar los 30 caracteres. Solo se permiten cadenas y flotantes como valores; los booleanos se convertirán a flotantes. Envía un valor vacío o null para eliminar el atributo. |
| access_levels | Array | :heavy_plus_sign: | Array de objetos Access level. Puede ser null si el cliente no tiene niveles de acceso. |
| subscriptions | Array | :heavy_plus_sign: | Array de objetos Subscription. Puede ser null si el cliente no tiene suscripciones. |
| non_subscriptions | Array | :heavy_plus_sign: | Array de objetos Non-Subscription. Puede ser null si el cliente no tiene compras. |
Product
This object contains details about a product in Adapty.
| Name | Type | Required | Description |
|---|---|---|---|
| title | String | No | Product name from the Products section in the Adapty Dashboard. |
| is_consumable | Boolean | Yes | Indicates whether the product is consumable. |
| adapty_product_id | UUID | No | Internal product ID as used in Adapty. |
| vendor_product_id | String | Yes | The product ID in app stores. If access was granted without a real store transaction,
|
| introductory_offer_eligibility | Boolean | No | Specifies if the user is eligible for an iOS introductory offer. |
| promotional_offer_eligibility | Boolean | No | Specifies if the user is eligible for a promotional offer. |
| base_plan_id | String | No | Base plan ID for Google Play or price ID for Stripe. |
| offer | JSON | No | An Offer object as a JSON. |
{
"title": "Monthly Subscription w/o Trial",
"is_consumable": true,
"adapty_product_id": "InternalProductId",
"vendor_product_id": "onemonth_no_trial",
"introductory_offer_eligibility": false,
"promotional_offer_eligibility": true,
"base_plan_id": "B1",
"offer": {
"category": "promotional",
"type": "pay_up_front",
"id": "StoreOfferId"
}
}
RemoteConfig
This object contains information about a remote config for a paywall.
{
"lang": "en",
"data": "{\"bodyItems\":[{\"spacerValue\":{\"height\":20,\"style\":{\"type\":\"emptySpace\"}},\"type\":\"spacer\"},{\"mediaValue\":{\"ratio\":\"1:1\",\"source\":{\"fileType\":\"image\",\"reference\":{\"en\":\"bundle/images/new1.png\"}},\"widthStyle\":\"full\"},\"type\":\"media\"},{\"titleValue\":{\"alignment\":\"center\",\"subtitleConfig\":{\"fontSize\":17,\"text\":\"\",\"color\":\"#FFFFFF\"},\"titleConfig\":{\"fontSize\":22,\"text\":\"\"}},\"type\":\"title\"},{\"productListValue\":{\"items\":[{\"productId\":\"exampleapp.oneWeek\",\"promoText\":\"paywall.promo-1.title\",\"backgroundColor\":\"#0B867D\"},{\"discountRate\":80,\"productId\":\"exampleapp.oneYear\",\"promoText\":\"paywall.promo-2.title\",\"backgroundColor\":\"#0B867D\"}],\"layout\":\"vertical\"},\"type\":\"productList\"}],\"defaultProductId\":\"exampleapp.oneWeek\",\"footer\":{\"singleProductValue\":{\"customTitles\":{\"exampleapp.oneWeek\":\"Subscribe\",\"exampleapp.oneYear\":\"Subscribe\"},\"productId\":\"exampleapp.oneWeek\"},\"type\":\"singleProduct\"},\"id\":\"exampleapp\",\"isFullScreen\":true,\"settings\":{\"backgroundColor\":\"#000000\",\"closeButtonAlignment\":\"left\",\"closeButtonIconStyle\":\"light\",\"colorScheme\":{\"accent\":\"#007566\",\"background\":\"#001B0D\",\"label\":\"#FFFFFF\",\"primary\":\"#10C6B6\",\"secondaryLabel\":\"#FFFFFF\",\"seperator\":\"#FFFFFF\"},\"isFullScreen\":true,\"shouldShowAlertOnClose\":false,\"showCloseButtonAfter\":1,\"triggerPurchaseWithAlert\":false,\"triggerPurchaseWithProductChange\":false}}"
}
| Name | Type | Required | Description |
|---|---|---|---|
| lang | String | Yes | Locale code for the paywall localization. It uses language and region subtags separated by a hyphen (-). Examples: Refer to Localizations and locale codes for more details. |
| data | String | Yes | Serialized JSON string representing the remote config of your paywall. You can find it in the Remote Config tab of a specific paywall in the Adapty Dashboard. |
Subscription
Info about your end user subscription. You can do the following action via Adapty server-side API:
- Check the user’s current subscription by retrieving their profile details
- Set transaction to your user and grant a subscription to them
| Parámetro | Tipo | Obligatorio | Nullable | Descripción |
|---|---|---|---|---|
| purchase_type | String | Sí | No | El tipo de producto comprado. Valor posible: subscription. |
| store | String | Sí | No | Store donde se adquirió el producto. Las opciones son app_store, play_store, stripe o el Store ID de tu store personalizada. |
| environment | String | No | No | Entorno donde se realizó la transacción. Las opciones son Sandbox o Production. Se usa Production por defecto. |
| store_product_id | String | Sí | No | ID del producto en el store (App Store, Google Play, Stripe, etc.) que desbloqueó este nivel de acceso. |
| store_transaction_id | String | Sí | No | ID de la transacción en el store (App Store, Google Play, Stripe, etc.). |
| store_original_transaction_id | String | Sí | No | En las suscripciones, este ID está vinculado a la primera transacción de una cadena de renovaciones. Cada renovación está conectada a esta transacción original. Si no hay renovación, |
| offer | Object | No | Sí | La oferta utilizada en la compra, representada como un objeto Offer. |
| is_family_shared | Boolean | No | No | Valor booleano que indica si el producto admite compartir en familia en App Store Connect. Solo iOS. Siempre false en iOS por debajo de la versión 14.0 y macOS por debajo de la 11.0. El valor por defecto es false. |
| price | Object | Sí | No | Precio de la suscripción o compra como objeto Price. Una compra inicial de suscripción con coste cero es una prueba gratuita; una renovación con coste cero es una renovación gratuita. |
| purchased_at | ISO 8601 date | Sí | No | La fecha y hora de la compra más reciente del nivel de acceso. |
| refunded_at | ISO 8601 date | No | No | La fecha y hora en que se reembolsó la suscripción, si aplica. |
| cancellation_reason | String | No | No | Los posibles motivos de cancelación son: voluntarily_cancelled, billing_error, price_increase, product_was_not_available, refund, upgraded o unknown. |
| variation_id | String | No | No | El ID de variante utilizado para rastrear las compras hasta el paywall específico desde el que se realizaron. |
| originally_purchased_at | ISO 8601 date | Sí | No | En cadenas de suscripciones, esta es la fecha de compra de la transacción original, vinculada mediante store_original_transaction_id. |
| expires_at | ISO 8601 date | Sí | No | La fecha y hora en que expira el nivel de acceso. Puede ser en el pasado y null para el acceso de por vida. |
| renew_status | Boolean | Sí | No | Indica si la renovación automática está habilitada para la suscripción. |
| renew_status_changed_at | ISO 8601 date | No | No | La fecha y hora en que se habilitó o deshabilitó la renovación automática. |
| billing_issue_detected_at | ISO 8601 date | No | No | La fecha y hora en que se detectó un problema de facturación (p. ej., un cargo fallido en la tarjeta). La suscripción puede seguir activa. Se borra si el pago se procesa correctamente. |
| grace_period_expires_at | ISO 8601 date | No | No | La fecha y hora en que finalizará el período de gracia si la suscripción se encuentra actualmente en uno. |
Although the SDK includes the is_active parameter to check if a subscription is active, the server-side API does not provide this parameter. However, you can determine subscription status at any time by checking whether the current date falls between the starts_at and expires_at parameters of the Access Level object.