Create location
- Sandbox: available
- Staging: available
- Production: unknown
Creates a location (room or bed), optionally in a zone.
Auth: Bearer token. The caller must be a practitioner, an admin, a super admin, or hold the "System Owner" access policy. The access policy must grant Location:create and Device:update (an admin or super admin who holds no access policy skips this check).
Scope: The location is created in the caller's project (from the token). A super-admin caller can pass ?projectId=<uuid> to create it in that project instead. Any other caller who passes projectId gets a 403.
Behaviour
namemust be unique. The check is an exact name match against the locations your token can search. With?projectId, the check runs in that project only.- When any of
floor,roomorbedis set, the combination of zone, floor, room and bed must also be unique. The comparison ignores case and extra whitespace. A location with only a name has no such check. floor,roomandbedare stored as type codes on the location.organizationIdsets the zone. The zone must be in your project, one of its sub-projects, or its parent project.- The create is guarded against a concurrent create of the same floor, room and bed. If another request creates it first, you get a 409 that names the existing location.
- No devices or residents are attached. Use
PUT /v1/slim/location/{id}for that. - A location-created entry is added to the change history. A failure to write that entry does not fail the request.
- The response is the created location, in the same shape as
GET /v1/slim/location/{id}. - If a location with the same zone, floor, room and bed exists, the request is refused with 409 and the body carries
existingLocationIdandexistingLocationName.
Example
curl -X POST 'https://api.sandbox.ovok.com/v1/slim/location' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' \ -H 'Content-Type: application/json' \ -d '{ "name": "Room 201", "floor": "2", "room": "201", "bed": "A", "organizationId": "87ea5dfc-8b8e-384d-8489-79496e706390" }'bearerAuthorizationBearer <JWT>application/json- body
name*string1 <= lengthfloor?stringroom?stringbed?stringorganizationId?stringLocation created successfully.
application/json- response
id*stringLocation id.
name*stringfloor?stringroom?stringbed?stringorganizationId?stringorganizationName?stringdeviceId?array<string>Every device at the location. Omitted when the location has none.
deviceName?stringAlphabetically first name among the devices at the location.
patientId?stringResident on the first device at the location that has one.
patientName?stringcurl -X POST 'https://api.sandbox.ovok.com/v1/slim/location' \ -H 'Content-Type: application/json' \ -d '{ "name": "string"}'{ "id": "string", "name": "string", "floor": "string", "room": "string", "bed": "string", "organizationId": "string", "organizationName": "string", "deviceId": [ "string" ], "deviceName": "string", "patientId": "string", "patientName": "string"}List locations GET
Lists the locations (rooms and beds) in your project, with the device, resident and zone at each one. Use it for the location table in the Slim dashboard. **Auth:** Bearer token. The caller must be a practitioner, an admin, a super admin, or hold the "System Owner" access policy. The access policy must grant `Location:search` and `Location:read` (an admin or super admin who holds no access policy skips this check). **Scope:** The caller's project (from the token). Only locations, devices and residents in that project are returned. ## Behaviour - Read-only. - **One row per device.** A location with several devices appears once per device. A location with no device appears once, without device and resident fields. `total` counts rows, not locations. - `patientId` and `patientName` are the resident assigned to that row's device. `organizationId` and `organizationName` are the location's zone. - `search` matches, as a case-insensitive substring, the location name, the name of a device at the location, the name of a resident on such a device, or the zone name. - `floor`, `room` and `bed` match the location's codes exactly. `organizationId` keeps locations in that zone. `deviceId` keeps only the row for that device. - Rows are sorted by floor, room, bed, device name, then location name. The sort is case-insensitive and numeric-aware ("2" before "10"). Rows with a missing value sort after rows that have one. - Pagination is zero-based: `page` (default `0`) and `count` (default `20`, max `100`). - Unknown query parameters are rejected. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/location?search=Room%20201&page=0&count=20' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```
List locations in a project (admin) GET
Lists the locations of a given project. The admin dashboard uses it to fill the location picker after you choose a project. **Auth:** Bearer token. The caller must be a Medplum project admin. Super admins without the admin role, practitioners and System Owner callers are refused. The access-policy check (`Location:search`, `Location:read`) is skipped only for an admin who holds no access policy. **Scope:** The project named by the required `projectId` query parameter. The search runs with Ovok's admin client, not the caller's token. ## Behaviour - Read-only. - Locations are sorted by name. - Pagination is zero-based: `page` (default `0`) and `count` (default `50`, max `100`). - `total` is an estimate: when a page is full it is one more than the rows seen so far, so a full page means more may follow. - Unlike `GET /v1/slim/location`, rows carry no device or resident fields: one row per location. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/slim/location/admin/list?projectId=c3499c27-2973-0a7f-807e-fb8676a92dcb&page=0&count=50' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```