Skip to main content

Update profile with server-side API

Changes your end user profile attributes.

Method and endpoint

PATCH https://api.adapty.io/api/v2/server-side-api/profile/

Example request

curl --location --request PATCH 'https://api.adapty.io/api/v2/server-side-api/profile/' \
--header 'Authorization: Api-Key <YOUR_SECRET_API_KEY>' \
--header 'adapty-customer-user-id: <YOUR_CUSTOMER_USER_ID>' \
--header 'adapty-platform: <OPTIONAL_DEVICE_PLATFORM>' \
--header 'Content-Type: application/json' \
--data-raw '{
"first_name": "Jane",
"last_name": "Doe",
"gender": "f",
"email": "jane.doe@example.com",
"phone_number": "+1234567890",
"birthday": "2000-12-31",
"ip_country": "FR",
"store_country": "US",
"store": "app_store",
"analytics_disabled": true,
"custom_attributes": [
{
"key": "favourite_sport",
"value": "yoga"
}
],
"installation_meta": {
"device_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"device": "string",
"locale": "en",
"os": "string",
"platform": "iOS",
"timezone": "Europe/Rome",
"user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1",
"idfa": "EA7583CD-A667-48BC-B806-42ECB2B48333",
"idfv": "E9D48DA5-3930-4B41-8521-D953AECD2F33",
"advertising_id": "",
"android_id": "",
"android_app_set_id": ""
}
}'

Placeholders:

  • <YOUR_CUSTOMER_USER_ID>: The unique ID of the customer in your system.
  • <YOUR_SECRET_API_KEY>: Your secret API key for authorization.
  • <OPTIONAL_DEVICE_PLATFORM>: The platform of the device where the user has your app installed. Useful when the user has installed your app on multiple devices.

Parameters

ParameterTypeRequired in requestNullable in requestDescription
first_nameStringYour end user's first name.
last_nameStringYour end user's last name.
genderStringYour end user's gender.
emailStringYour end user's email.
phone_numberStringYour end user's phone number.
birthdayISO 8601 dateYour end user's birthday.
ip_countryStringCountry of the end user in ISO 3166-2 format. It needs to be passed if the request is made from the server and not from the client in order to set the current country. Otherwise, we determine the country by the IP address of the request.
store_countryStringCountry of the end user's app store.
storeStringThe platform the user uses to make purchases in your app. Possible values: app_store, play_store, or stripe.
analytics_disabledBoolean

Option to opt out of external analytics. When analytics is disabled, events won’t be sent to integrations, and the fields idfa, idfv, and advertising_id will become nullable.

ON: External analytics is opted out for this user.

OFF: Analytics is active by default.

custom_attributesDictionary

Allows setting up to 30 custom attributes for the profile. If you use the custom_attributes dictionary, at least one pair o a key and value is required.

Key: Must be a string with no more than 30 characters, using only letters, numbers, dashes, periods, and underscores.

Value: Must be a string or float with no more than 30 characters. Booleans and integers will be converted to floats. To delete an attribute, send an empty value or null.

installation_metaDictionaryContains information about the specific app on a specific device, structured as a dictionary of Installation Meta objects.
tip

profile_id and/or customer_user_id must be included in the request header, as described in the Authorization section.

If you're adding a customer_user_id to an existing profile:

  1. Use the POST method.
  2. Add both profile_id and customer_user_id to the request header.

This will link the customer_user_id to the user's existing profile.


Successful response: 200: OK

The request is successful. The response body contains the data field, which encapsulates the user's profile and associated information.

ParameterTypeNullableDescription
dataObjectContains the Profile object with user details and metadata.

data object structure

The data field is the primary container for the user profile. It includes several fields:

ParameterTypeNullableDescription
app_idStringThe internal ID of your app. You can see in the the Adapty Dashboard: App Settings -> General tab.
profile_idUUIDAdapty profile ID. You can see it in the Adapty ID field on the Adapty Dashboard -> Profiles -> specific profile page.
customer_user_idStringThe ID of your user in your system. You can see it in the Customer user ID field on the Adapty Dashboard -> Profiles -> specific profile page. It will work only if you identify the users in your mobile app code via Adapty SDK.
total_revenue_usdFloatA float value representing the total revenue in USD earned in the profile.
segment_hashStringInternal parameter.
timestampIntegerResponse time in milliseconds, needs for resolve a race condition.
custom_attributesDictionary

A maximum of 30 custom attributes to the profile are allowed to be set. If you provide the custom_attributes dictionary, you must provide at least one attribute key.

Key: The key must be a string with no more than 30 characters. Only letters, numbers, dashes, points, and underscores allowed

Value: The attribute value must be no more than 30 characters. Only strings and floats are allowed as values, booleans will be converted to floats. Send an empty value or null to delete the attribute.

access_levelsDictionaryProfile Paid Access Level objects. Dictionary where the keys are paid access level identifiers configured by a developer in the Adapty Dashboard. Values are Access level objects. Can be null if the customer has no access levels.
subscriptionsDictionaryDictionary where the keys are vendor product IDs. Values are Subscription objects. Can be null if the customer has no subscriptions.
non_subscriptionsDictionaryDictionary where the keys are vendor product ids. Values are an array of Non-Subscription objects. Can be null if the customer has no purchases.

Successful response example

{
"data": {
"app_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"customer_user_id": "8612ED7C-3477-466D-93AE-1854B8E5FDD5",
"total_revenue_usd": 109.88999999999999,
"segment_hash": "string",
"timestamp": 0,
"custom_attributes": [
{
"key": "string",
"value": "string"
}
],
"access_levels": [
{
"access_level_id": "premium",
"store": "app_store",
"store_product_id": "weekly_8.99",
"store_base_plan_id": "",
"store_transaction_id": "530001802720333",
"store_original_transaction_id": "530001724306018",
"offer": {
"category": "introductory",
"type": "free_trial",
"id": "offer12"
},
"environment": "Production",
"starts_at": "2022-10-12T09:42:50.000000+0000",
"purchased_at": "2022-10-12T09:42:50.000000+0000",
"originally_purchased_at": "2021-10-12T09:42:50.000000+0000",
"expires_at": "2022-10-12T09:42:50.000000+0000",
"renewal_cancelled_at": "2022-10-12T09:42:50.000000+0000",
"billing_issue_detected_at": "2022-10-12T09:42:50.000000+0000",
"is_in_grace_period": true,
"cancellation_reason": "voluntarily_cancelled"
}
],
"subscriptions": [
{
"store": "app_store",
"store_product_id": "weekly_8.99",
"store_base_plan_id": "",
"store_transaction_id": "530001802720333",
"store_original_transaction_id": "530001724306018",
"offer": {
"offer_category": "introductory",
"offer_type": "free_trial",
"offer_id": "offer12"
},
"environment": "Production",
"purchased_at": "2022-10-12T09:42:50.000000+0000",
"originally_purchased_at": "2021-10-12T09:42:50.000000+0000",
"expires_at": "2022-10-12T09:42:50.000000+0000",
"renewal_cancelled_at": "2022-10-12T09:42:50.000000+0000",
"billing_issue_detected_at": "2022-10-12T09:42:50.000000+0000",
"is_in_grace_period": true,
"cancellation_reason": "voluntarily_cancelled"
}
],
"non_subscriptions": [
{
"purchase_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"store": "app_store",
"store_product_id": "weekly_8.99",
"store_base_plan_id": "",
"store_transaction_id": "530001724306018",
"store_original_transaction_id": "530001724306018",
"purchased_at": "2022-10-12T09:42:50.000000+0000",
"environment": "Production",
"is_refund": true,
"is_consumable": true
}
]
}
}

Errors

400: Bad request

The request failed due to some error in a field.

Body
ParameterTypeDescription
errorsObject
  • source: (string) Field that caused the error(s)
  • errors: (list) listed errors.
error_codeStringShort error name.
status_codeIntegerHTTP status, always 400.
Response example
{
"errors": [
{
"source": "string",
"errors": [
"string"
]
}
],
"error_code": "string",
"status_code": 0
}

401: Unauthorized

The request failed due to missing or incorrect authorization. Check the Authorization page, paying close attention to the Authorization header.

The request also failed because the specified profile wasn’t found.

Body

ParameterTypeDescription
errorsObject
  • source: (string) Always non_field_errors.
  • errors: A description of the error.
error_codeStringShort error name. Always not_authenticated.
status_codeIntegerHTTP status. Always 401.

Response example

{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Authentication credentials were not provided."
]
}
],
"error_code": "not_authenticated",
"status_code": 401
}

404: Not found

The request failed because the specified profile wasn’t found. Double-check the customer_user_id or profile_id for any typos.

Body
ParameterTypeDescription
errorsObject
  • source: (string) Always null.
  • errors: A description of the error.
error_codeStringShort error name. Always profile_does_not_exist.
status_codeIntegerHTTP status. Always 404.
Response example
{
"errors": [
{
"source": null,
"errors": [
"Profile not found"
]
}
],
"error_code": "profile_does_not_exist",
"status_code": 404
}

See also: