---
title: Get Profile Data
description: "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…"
url: "https://releva.ai/documentation/profiles-2/get-profile-data/"
updated: "2026-10-06"
category: Developer Documentation / Profiles
---

# Get Profile Data

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](/documentation/profiles-2/export-profile-data/) instead.

### Request Parameters

You may perform requests to the API using the following curl equivalent:

```js
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 |
| --- | --- | --- |
| email | 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:

```js
{
  "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. |
| email | 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](/documentation/profiles-2/). |
| 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:

```js
{
  "message": "A description of the error and how to fix it, if it's a client error."
}
```
