/api/v1/profile/save/ Save profile
Creates or updates a profile in Adapty Mail. A profile carries the user's email and attributes that Adapty Mail uses to identify recipients and build segments.
Identify each user by a stable external_profile_id. Sending the same external_profile_id
again updates the existing profile rather than creating a duplicate.
Request body
Stable identifier for the user, owned by your app or backend. Reuse the same value across requests so Adapty Mail links emails, clicks, and purchases to one profile. Never use an anonymous or per-install identifier.
The user creation time, in ISO 8601 format (for example, "2026-06-01T10:30:00Z").
You can use this date in segments.
The user's email address. Adapty Mail delivers campaigns to this address.
The user's first name.
The user's last name.
The user's gender.
The user's date of birth, in ISO 8601 format (for example, "1990-05-21").
The user's country as a two-letter uppercase ISO 3166-1 alpha-2 code (for example, US).
The user's store region as a two-letter uppercase ISO 3166-1 alpha-2 code (for example, US).
Arbitrary key-value pairs (string or number values) to attach to the profile. Use them to
build segments — for example, plan, signup_source, or trial_days.
The platform the user is on, for example, iOS or Android.
Device model, for example, iPhone15,2.
Operating system version, for example, 17.5.
The user's locale, for example, en-US.
The user's timezone, for example, America/New_York.
Version of your app the user is running, for example, 3.1.0.
Responses
Profile saved successfully. The response body is an empty object.
Schema
Example
{} Validation failed — a required field is missing or invalid. field_name shows which field.
Schema
Standard error response. Every failure returns a 4XX status with this shape.
Human-readable description of the error.
Machine-readable error identifier.
HTTP status code for this error.
The request field that caused the error, or null if the error isn't field-specific.
Example
{
"errors": [
{
"message": "Field required",
"error_code": "base_error",
"status_code": 400,
"field_name": "email"
}
]
} Missing or invalid secret API key.
Schema
Standard error response. Every failure returns a 4XX status with this shape.
Human-readable description of the error.
Machine-readable error identifier.
HTTP status code for this error.
The request field that caused the error, or null if the error isn't field-specific.
Example
{
"errors": [
{
"message": "Secret key doesn't exist",
"error_code": "secret_key_does_not_exist_error",
"status_code": 403,
"field_name": null
}
]
}