List administered projects
- Sandbox: available
- Staging: available
- Production: unknown
Lists every project you administer, with the tenant code you need to switch to it. Every other /v1/projects route answers about the single project of your token; use this one to build a project picker.
Auth: bearer token. The caller must be a Practitioner, a project admin, or hold the System Owner access policy. You do not need to be an admin of your current project. Scope: your own user's Practitioner memberships across all projects, kept only where the membership is an admin one.
Behaviour
- One row per project, in membership order, even when you hold two memberships on one project.
page(from 0, default 0) andcount(1 to 100, default 20) page over the projects.totalcounts the projects you administer, not your memberships.tenantCodeisnullfor a project that has none.nameisnullwhen the project can no longer be read; the row is kept.isMainProjectistruefor a project with no parent,falsefor a child, andnullwhen the hierarchy could not be read.parentProjectIdis set only when the parent is also a project you administer; otherwise it isnull.- To switch, pass
tenantCodetoPOST /v1/auth/tenant/Practitioner/login/token.
Example
curl -X GET 'https://api.sandbox.ovok.com/v1/projects?page=0&count=20' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk'bearerAuthorizationBearer <JWT>page?string"0"count?string"20"The caller's administered projects: id, name and tenant code.
application/json- response
total*number0 <= valuepage*number0 <= valuecount*number1 <= valueresources*array<>curl -X GET 'https://api.sandbox.ovok.com/v1/projects'{ "total": 0, "page": 0, "count": 1, "resources": [ { "projectId": "string", "name": "string", "tenantCode": "string", "isMainProject": true, "parentProjectId": "string" } ]}Update a project text setting PUT
Sets one text setting of your current project, such as an app URL or a default access policy, or removes it with `null`. **Auth:** bearer token of a project admin. The caller must also be a Practitioner, an admin or hold the System Owner access policy. **Scope:** the caller's project (from the token). ## Behaviour - `:key` must be one of the text keys returned in `values` by `GET /v1/project/settings`. It may be URL-encoded. - `value` is trimmed and checked for the key's kind: - App URL keys (`PATIENT_APP_URL`, `PRACTITIONER_APP_URL`, `PATIENT_SIGNUP_URL`, `CLINICIAN_DASHBOARD_URL`): see App URLs below. The canonical form is stored. - Access policy keys (`DEFAULT_PATIENT_ACCESS_POLICY`, `DEFAULT_PRACTITIONER_ACCESS_POLICY`, `CLINICIAN_INVITE_ACCESS_POLICY`): `AccessPolicy/<id>` of an AccessPolicy in this project. - `null` removes the entry. Every other entry of `Project.setting[]` is kept as it is. - `DEFAULT_PATIENT_ACCESS_POLICY` is written to `Project.defaultPatientAccessPolicy`, not to `Project.setting[]`. Removing it turns patient registration and patient invitations off: see `effectiveSettings` in `GET /v1/project/settings`. - The write only succeeds if the project did not change since the server read it; otherwise it answers 409. - The response is the full settings envelope after the write, as `GET /v1/project/settings` returns it. ## App URLs `PATIENT_APP_URL` and `PRACTITIONER_APP_URL` are the app roots that links in emails are built on: `https://app.example.com` gives `https://app.example.com/setpassword/<id>/<secret>`. - Resolution order, per audience: the project's setting, then the parent project's, then the legacy setting (`PATIENT_SIGNUP_URL` or `CLINICIAN_DASHBOARD_URL`, on the project then its parent), then the request `Origin` for flows that allow it, then the deployment default. - For set-password and invite links, only the origin of `PATIENT_SIGNUP_URL` is used: `https://app.example.com/register` gives `https://app.example.com`, and `vitalwise://register` gives `vitalwise://`. Set `PATIENT_APP_URL` if the patient app lives under a path. - The continue-as-patient link (a business-address sign-up turned into a clinician invite) uses `PATIENT_SIGNUP_URL` in full whenever it is set, ahead of `PATIENT_APP_URL`. - An app URL is an https URL on any host (http only on localhost), or an app deep link `scheme://[host][/path]`: `vitalwise://` gives `vitalwise:///setpassword/<id>/<secret>`. A web URL on this API's own host is refused, and a stored one is skipped when an email is sent. - Only the canonical form is stored and used, without a trailing slash. Userinfo, a query, a fragment, an opaque `scheme:path`, and web, script or local schemes used as a deep link (`javascript:`, `data:`, `file:` and others) are refused on write and skipped on send. - An invite with no app URL for its audience answers 409 `app_url_not_configured` and creates nothing. - An unknown `:key` returns 400 `UNKNOWN_SETTING` with the accepted keys. A web app URL on this API's own host returns 400 `APP_URL_NOT_ALLOWED`. A value that is not valid for the key returns 422 `INVALID_SETTING_VALUE`. ## Example ```bash curl -X PUT 'https://api.sandbox.ovok.com/v1/project/settings/values/PRACTITIONER_APP_URL' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' \ -H 'Content-Type: application/json' \ -d '{ "value": "https://app.example.com" }' ```
List current project members GET
Lists the Practitioner members of your current project, one page at a time. **Auth:** bearer token. The caller must be a Practitioner, a project admin, or hold the System Owner access policy. **Scope:** the caller's project (from the token). ## Behaviour - Only memberships with a Practitioner profile are returned; patient, bot and client memberships are left out. - Filters: `accessPolicyId` (the membership's access policy), `profileId` (a Practitioner id) and `userId`. - `page` (from 0, default 0) and `count` (1 to 100, default 20) page the results. `total` is the exact number of matches. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/projects/me/members?page=0&count=20' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```