Set user consent and refund settings with API
Adapty Refund Saver helps you handle refund requests from Apple’s App Store automatically and more efficiently.
By default, Refund Saver always asks Apple to decline a user’s refund request. You can change this default behavior for all users in the Adapty Dashboard, or adjust it for a specific user using the Dashboard, the Adapty SDK, or the server-side API, as explained below.
To use Refund Saver, you need to get the user’s consent to share their data with Apple. You can record user's consent through the Adapty SDK or the server-side API, as shown below.
Method and endpoint
POST https://api.adapty.io/api/v2/server-side-api/purchase/profile/refund-saver/settings/
Example request
- cURL
- Python
- JavaScript
curl --location 'https://api.adapty.io/api/v2/server-side-api/purchase/profile/refund-saver/settings/' \
--header 'adapty-customer-user-id: <YOUR_CUSTOMER_USER_ID>' \
--header 'Content-Type: application/json' \
--header 'Authorization: Api-Key <YOUR_SECRET_API_KEY>' \
--data '{
"custom_preference": "grant",
"consent": true
}'
import requests
import json
url = "https://api.adapty.io/api/v2/server-side-api/purchase/profile/refund-saver/settings/"
payload = json.dumps({
"custom_preference": "grant",
"consent": True
})
headers = {
"adapty-customer-user-id": "<YOUR_CUSTOMER_USER_ID>",
"Content-Type": "application/json",
"Authorization": "Api-Key <YOUR_SECRET_API_KEY>"
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const myHeaders = new Headers();
myHeaders.append("adapty-customer-user-id", "<YOUR_CUSTOMER_USER_ID>");
myHeaders.append("Content-Type", "application/json");
myHeaders.append("Authorization", "Api-Key <YOUR_SECRET_API_KEY>");
const raw = JSON.stringify({
"custom_preference": "grant",
"consent": true
});
const requestOptions = {
method: "POST",
headers: myHeaders,
body: raw,
redirect: "follow"
};
fetch("https://api.adapty.io/api/v2/server-side-api/purchase/profile/refund-saver/settings/", requestOptions)
.then((response) => response.text())
.then((result) => console.log(result))
.catch((error) => console.error(error));
Placeholders:
<YOUR_CUSTOMER_USER_ID>
: The unique ID of the customer in your system.<YOUR_SECRET_API_KEY>
: Your secret API key for authorization.
Parameters
Parameter | Type | Required in request | Nullable in request | Description |
---|---|---|---|---|
custom_preference | String | ➖ | ➕ | Set the refund preference individually for the user. Possible values are: – grant : approve each refund request – no_preference : do not provide any recommendations to Apple. In this case, Apple will determine the refund outcome based on its internal policies and user history) – decline : decline each refund request. The default value is null . So, if you don't set custom_preference , the default behavior will be used. |
consent | Boolean | ➖ | ➕ | Record if the user gave their consent to share their data. – True means that if you receive an in-app refund request, you may provide Apple with information about the user's in-app purchase activity. – false means Refund Saver won't share the user's data with Apple. The default value is null . So, if you don't set consent , the default behavior will be used. |
Successful response: 200: OK
Parameter | Type | Description |
---|---|---|
profile_id | String | Customer profile ID. |
consent | Boolean | Defines whether the user consented to share their data. |
custom preference | String | The refund preference. |
Successful response example
{
"profile_id": "e5aab402-b1bd-4039-b632-57a91ebc0779",
"settings": {
"consent": true,
"custom_preference": "no_preference"
}
}
Errors
400: Bad request
profile_does_not_exist
The request failed because the profile in the request header wasn’t found. Double-check that there are no typos in the profile_id
or customer_user_id
you entered in the request header, and make sure it’s for the correct app.
Body
Parameter | Type | Description |
---|---|---|
errors | Object |
|
error_code | String | Short error name. Possible value: profile_does_not_exist . |
status_code | Integer | HTTP status. Always 400 . |
Response example
The profile is not found
{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Profile not found"
]
}
],
"error_code": "profile_does_not_exist",
"status_code": 400
}
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
Parameter | Type | Description |
---|---|---|
errors | Object |
|
error_code | String | Short error name. Always not_authenticated . |
status_code | Integer | HTTP status. Always 401. |
Response example
{
"errors": [
{
"source": "non_field_errors",
"errors": [
"Authentication credentials were not provided."
]
}
],
"error_code": "not_authenticated",
"status_code": 401
}
See also: