The Get Profile API returns a user’s profile synchronously, given their email, phone number or profileId.
Do I need to call it? #
Use it when your system needs to read what Releva currently holds about a user — for example their subscription status, tags or custom fields — in order to keep it in sync. If you need a complete copy of everything we hold about a user (devices, events, attribution) for a GDPR access request, use Export Profile Data instead.
Request Parameters #
You may perform requests to the API using the following curl equivalent:
curl -XGET -H 'Authorization: Bearer <secretKey>' 'https://releva.ai/api/v0/profiles?email=<email>'
curl -XGET -H 'Authorization: Bearer <secretKey>' 'https://releva.ai/api/v0/profiles?profileId=<profileId>'
curl -XGET -H 'Authorization: Bearer <secretKey>' 'https://releva.ai/api/v0/profiles?phoneNumber=%2B359888123456'Request URL Parameters #
| Field | Type | Description |
|---|---|---|
| String (Optional) | User’s email address. Matching is case-insensitive. | |
| profileId | String (Optional) | User’s profile id. |
| phoneNumber | String (Optional) | User’s phone number, in the same form you sent it when creating the profile (international or national). URL-encode the leading + as %2B. |
Note that email, profileId and phoneNumber are optional but we need exactly one of them. Any other parameter is rejected with HTTP status 400.
Response Format #
A successful response will return HTTP Status 200 with the following structure:
{
"profile": {
"id": "5f0c3a7e-2b1d-4c8e-9a6f-1d2e3f4a5b6c",
"email": "jane.doe@example.com",
"phoneNumber": "+359888123456",
"firstName": "Jane",
"lastName": "Doe",
"registeredAt": "2025-11-02T10:15:00.000Z",
"subscribedAt": "2025-11-02T10:15:00.000Z",
"unsubscribedAt": null,
"birthday": "1990-05-17",
"tags": ["vip"],
"subscriptions": ["marketing"],
"custom": {
"string": [{ "key": "loyaltyTier", "values": ["gold"] }]
},
"location": { "lat": 42.6977, "lon": 23.3219 },
"consent": null,
"unsubscribeLink": null
}
}The Profile Object #
| Field | Type | Description |
|---|---|---|
| id | String | The profile id. Use it as profileId in other profile APIs. |
| String or null | User’s email address. | |
| phoneNumber | String or null | User’s phone number in international format. |
| firstName | String or null | User’s first name. |
| lastName | String or null | User’s last name. |
| registeredAt | String or null | ISO-8601 date and time the user registered. |
| subscribedAt | String or null | ISO-8601 date and time the user subscribed to marketing communication; null if not subscribed. |
| unsubscribedAt | String or null | ISO-8601 date and time the user last unsubscribed. |
| birthday | String or null | User’s birthday as an ISO-8601 date (YYYY-MM-DD). |
| tags | Array of String | Tags assigned to the user. Empty array if none. |
| subscriptions | Array of String | Subscriptions the user holds. Empty array if none. |
| custom | Object or null | Custom fields, in the same structure as in Create/Update Profile. |
| location | Object or null | User’s location as { "lat": Number, "lon": Number }. |
| consent | String or null | Consent value last set for the user. |
| unsubscribeLink | String or null | Your own unsubscribe link for this user, if you provided one. |
Every field is always present; a value the profile does not have is returned as null (or an empty array for tags and subscriptions).
If the profile you ask for by profileId has since been merged into another profile, the surviving profile is returned, so the id in the response can differ from the one you requested.
If no profile matches, the response is HTTP status 404. Only identified profiles — those with an email or phone number — can be looked up; an anonymous visitor’s profile returns 404.
An error response will return a HTTP 4xx or 5xx status code and have the following structure:
{
"message": "A description of the error and how to fix it, if it's a client error."
}