SlimSlim/Query

List users across projects (compatibility)

  • Sandbox: available
  • Staging: available
  • Production: unknown
GET
/v1/slim/query/admin/user

Compatibility route for older cross-project user list clients. Behaves exactly like GET /v1/slim/query/user. For new integrations, use GET /v1/slim/project/{id}/users.

Auth: bearer token. The caller must be a practitioner, an admin or a System Owner, and needs Practitioner:read. No extra admin check is applied. Scope: the caller's project (from the token), or the project in project=Project/<id> when it is your project or one of its sub-projects.

Behaviour

  • Same parameters, filters, sorting, paging and caching as GET /v1/slim/query/user.

Example

curl -X GET 'https://api.sandbox.ovok.com/v1/slim/query/admin/user?profileType=Practitioner&project=Project/c3499c27-2973-0a7f-807e-fb8676a92dcb' \  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk'

Authorization

bearer
headerAuthorizationBearer <JWT>

Query Parameters

sortBy?string
Default"profileName"
Value in"profileName""userName""accessPolicyName"
orderBy?string
Default"ASC"
Value in"ASC""DESC"
search?string
profileType*"Practitioner"
Value in"Practitioner"
project?string

project is used for scoping when provided by an administrator.

Match^Project\/\S+$
accessPolicy?string
Match^AccessPolicy\/\S+$
profile?string
Match^Practitioner\/\S+$
user?string
Match^User\/\S+$
page?string
Default"0"
count?string
Default"20"

Response Body

User query results retrieved successfully.

application/json
  1. response
total*number
resources*array<>
Example Request
curl -X GET 'https://api.sandbox.ovok.com/v1/slim/query/admin/user?profileType=Practitioner'
Example Response
{  "total": 0,  "resources": [    {      "user": {        "resourceType": "User",        "id": "string",        "firstName": "string",        "lastName": "string",        "email": "user@example.com",        "project": "string",        "meta": {          "project": "string",          "lastUpdated": "string"        }      },      "profile": {        "resourceType": "Practitioner",        "id": "string",        "name": [          null        ],        "meta": {          "project": "string",          "lastUpdated": "string"        }      },      "membership": {        "resourceType": "ProjectMembership",        "id": "string",        "project": "string",        "user": {          "reference": "string"        },        "profile": {          "reference": "string"        },        "accessPolicy": {          "reference": "string"        },        "meta": {          "project": "string",          "lastUpdated": "string"        }      },      "status": "Active",      "accessPolicy": {        "resourceType": "AccessPolicy",        "id": "string",        "name": "string",        "resource": [          {            "resourceType": "string"          }        ],        "meta": {          "project": "string",          "lastUpdated": "string"        }      }    }  ]}

List users (compatibility) GET

Compatibility route for older user list clients. Lists the practitioner users of a project with their profile, membership and access policy. For new integrations, use `GET /v1/slim/project/users`. **Auth:** bearer token. The caller must be a practitioner, an admin or a System Owner, and needs `Practitioner:read`. **Scope:** the caller's project (from the token). When you pass `project=Project/<id>`, that project is used instead. It must be your project or one of its sub-projects. ## Behaviour - `profileType` is required and must be `Practitioner`. - Each row has `user`, `profile`, `membership` and, when set, `accessPolicy`, reduced to the fields a list needs. - A user's status is `Pending` when they have an unused invite or no password yet, otherwise `Active`. - `accessPolicy`, `profile` and `user` filter on exact references, for example `AccessPolicy/<id>`. - `search` matches profile name, user name and access policy name, with fuzzy matching. - `page` is zero-based. `count` defaults to 20, maximum 100. - Results are cached for up to 60 seconds. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/query/user?profileType=Practitioner&page=0&count=20' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```

Get sleep statistics GET

Returns a resident's sleep statistics for one night, grouped by device, with each metric compared against the average of the preceding nights. Use it for the sleep detail view. **Auth:** bearer token. The caller must be a practitioner, an admin or a System Owner, and needs `Observation:read` and `Observation:search`. **Scope:** the caller's project (from the token). Sleep data is read with your token, so Medplum's access policy limits what you see. ## Behaviour - The "night" is the calendar day, in the project's time zone, of `endDate`. A sleep recording belongs to the day its `effectivePeriod.end` falls on. - `lastDayCount` is how many earlier days feed `average`. It defaults to `7` and must be between 1 and 30. - Each device entry holds, per metric, `current` (the night of `endDate`), `average` (over the earlier nights that have a recording) and `diff`. A device with no recording for the night of `endDate` is left out. - When one night has several recordings, the one written last is used: the latest `meta.lastUpdated`. Its period and completeness do not count, so a shorter recording written later wins, and so can a same-day nap ending after the night. A metric it does not carry is `null`, never taken from another recording. The PDF export's sleep table uses the same rule, and so do the `GET /v1/slim/trends/graphs` charts where they can match a night's readings to its recordings. - `average` and `diff` use each earlier night's latest-written recording the same way. - Only recordings that end inside one of the resident's use periods of their device are counted, before a night's recording is picked. So a previous resident's night that ended before the device was handed over, but reached Ovok after it and was stored under this resident, is not shown. A resident with no device use history has all recordings counted. The PDF export and the `GET /v1/slim/trends/graphs` charts apply the same filter. - Once a resident has any use period, recordings of a device with no period of theirs, and those from before a device's earliest period, are not counted. A device assigned before use periods were recorded gets its first one on its next edit in Ovok, starting at the Device's last write before that edit. Each device whose recordings in a request all drop is counted in the `sleep.device_use_device_dropped` metric and logged at most once a minute. - Ovok reads the `sleep-stats` observations first and falls back to the LOINC pair `93832-4` (sleep duration) and `103216-8` (out-of-bed count) when there are none. - The response is `{}` when no qualifying recording exists. - Results are cached for up to 60 seconds per project, resident, `endDate` and `lastDayCount`. A write to the resident's data invalidates the cache sooner. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/sleep/statistics?patientId=c3499c27-2973-0a7f-807e-fb8676a92dcb&endDate=2026-09-28T00:00:00Z&lastDayCount=7' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```