Profiles
List Profiles
List or look up patient profiles by email
GET
List patient profiles accessible to your API key, or look one up by exact email address.
When
email is provided, the endpoint performs a Redis-cached exact-match lookup against the
canonical sign-in email and returns 0 or 1 result; limit and offset are ignored in that
case. When omitted, the endpoint returns a paginated list of profiles scoped to your API
key’s access context.
Email matching is case-insensitive and exact — substring and prefix matches are not supported.
Only the canonical sign-in email is checked; alternate addresses such as work_email are not
considered.
Requires
profiles_view or impersonate scope.Request
Query parameters
Filter by exact email address (case-insensitive). When set, returns 0 or 1 result and
limit/offset are ignored. The lookup is served by a Redis-cached reverse index, with an
indexed SQL fallback.Maximum number of profiles to return. Defaults to 100, maximum 500. Ignored when
email is set.Number of profiles to skip for pagination. Defaults to 0. Ignored when
email is set.Response
On success, the API returns200 OK with an array of profile objects. The shape of each
entry matches Get Profile.
Unique profile identifier (UUID).
Profile handle or username. May be
null.First name. May be
null.Last name. May be
null.Email address. May be
null.Phone number in E.164 format. May be
null.Biological sex per ISO/IEC 5218 (
1 = male, 2 = female). May be null.Date of birth in
YYYY-MM-DD format. May be null.Height in centimeters. May be
null.Weight in kilograms. May be
null.Preferred language (
en, de, or fi).ISO 8601 timestamp of when the profile was created.
ISO 8601 timestamp of the last update. May be
null.Behaviour notes
- An empty array is returned both when no profile matches the email and when a match exists outside your access context. This is intentional — it prevents the endpoint from leaking the existence of profiles you cannot read.
- Newly created profiles are immediately discoverable by
emailbecause the create flow warms the cache synchronously. - The unfiltered list is ordered by
created_atdescending (newest first) and paginated vialimitandoffset.
Error responses
| Status | Description |
|---|---|
400 | Validation error — invalid email format, or limit/offset out of range. |
403 | Forbidden — your API key does not have the required scope (profiles_view/impersonate). |
500 | Internal server error. |