Payload CMS Public Delivery

List published items of a content type

  • Sandbox: available
  • Staging: available
  • Production: unknown
GET
/v1/public/cms/{contentTypeSlug}/items

Lists the published items of a user-defined content type for one tenant. First-class collections are read with GET /v1/public/cms/collections/{collectionSlug}/items instead.

Auth: one of the following:

  • The CMS public API key, in the x-api-key header, as Authorization: Bearer <key>, or as the apiKey query parameter.
  • A signed-in Ovok session (bearer token), which may only read its own tenant.

Scope: the tenant you name, by tenant code (x-ovok-tenant-code header or tenant query parameter) or by project id (x-ovok-medplum-project-id header or projectId query parameter). Headers win over query parameters, and a tenant code wins over a project id. If you name neither, a signed-in session reads its own tenant. Each Ovok deployment has one set of content; there is no environment to choose.

Behaviour

  • Returns the CMS content-items whose content type has the slug contentTypeSlug and whose status is published, in the CMS list envelope.
  • At most 100 items are returned. There is no paging, sorting or locale selection on this route.
  • Responses are cached by Ovok for up to 60 seconds. A request that names a tenant gets Cache-Control: public, s-maxage=60, stale-while-revalidate=300 and a Vary on the tenant and API key headers. A request that names no tenant gets Cache-Control: no-store. Error responses carry neither.

Example

curl -X GET 'https://api.sandbox.ovok.com/v1/public/cms/faq/items?tenant=my-medical-project' \  -H 'x-api-key: <cms public api key>'

Authorization

api-key
headerx-api-key<token>

Path Parameters

contentTypeSlug*string

Slug of the user-defined content type whose published items to list.

Query Parameters

tenant?unknown

Tenant code identifying the project (alternative to the x-ovok-tenant-code header).

Response Body

Published content items (Payload list envelope).

application/json
  1. response
docs*array<>
totalDocs*number
limit*number
totalPages*number
page*number
pagingCounter*number
hasPrevPage*boolean
hasNextPage*boolean
prevPage*number
nextPage*number
Example Request
curl -X GET 'https://api.sandbox.ovok.com/v1/public/cms/string/items'
Example Response
{  "docs": [    {      "property1": null,      "property2": null    }  ],  "totalDocs": 0,  "limit": 0,  "totalPages": 0,  "page": 0,  "pagingCounter": 0,  "hasPrevPage": true,  "hasNextPage": true,  "prevPage": 0,  "nextPage": 0}

Get a published document by slug GET

Returns one published document of a CMS collection by its slug. Use it for stable public pages and deep links, such as terms and conditions or a privacy policy. **Auth:** one of the following, checked in this order: - The CMS public API key, in the `x-api-key` header, as `Authorization: Bearer <key>`, or as the `apiKey` query parameter. - No key, for collections configured as keyless (by default `legal-pages` and `translations`). - A signed-in Ovok session (bearer token), which may only read its own tenant. **Scope:** the tenant you name, by tenant code (`x-ovok-tenant-code` header or `tenant` query parameter) or by project id (`x-ovok-medplum-project-id` header or `projectId` query parameter). Headers win over query parameters, and a tenant code wins over a project id. If you name neither, a signed-in session reads its own tenant. Each Ovok deployment has one set of content; there is no environment to choose. ## Behaviour - Any collection except the `users` and `tenants` system collections can be read. - Only a document with status `published` is returned. The response is the document itself, with the fields its collection defines. - `slug` must start with a lowercase letter or digit and contain only lowercase letters, digits, `-`, `_` and `.`, up to 128 characters. - `locale` is a language tag such as `de` or `en-US`. Without it, the CMS default locale is used. Missing translations fall back as configured in the CMS. - If the tenant has no published document with this slug, Ovok returns the shared tenant's document with that slug, when one exists. - Responses are cached by Ovok for up to 60 seconds. A request that names a tenant gets `Cache-Control: public, s-maxage=60, stale-while-revalidate=300` and a `Vary` on the tenant and API key headers. A request that names no tenant gets `Cache-Control: no-store`. Error responses carry neither. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/public/cms/collections/legal-pages/items/terms-and-conditions?tenant=my-medical-project&locale=en-US' ```

Get current project settings GET

Returns the settings of your current project: the on/off settings and the text settings such as app URLs and default access policies. **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 - Settings are read from `Project.setting[]` by name. - `settings` always has every on/off key. A key that is not stored, or not stored as a boolean, is `false`. - `values` always has every text key. A key that is not stored, or is blank, is `null`. - `DEFAULT_PATIENT_ACCESS_POLICY` is read from `Project.defaultPatientAccessPolicy`, as `AccessPolicy/<id>`: the policy patient registration and patient invites give a new patient. - Entries of `Project.setting[]` with other names are not returned. ## Saved and effective values `settings` cannot tell a switch turned off from one never saved. Two records, with every on/off key, can: - `overrides`: the saved value, `true` or `false`, or `null` when none is saved (or it is not stored as a boolean). - `effectiveSettings`: what Ovok applies. The saved value, else the default below, and off while the feature lacks what it needs (the column on the right). | Key | Default | Also needs | | --- | --- | --- | | `PATIENT_LOGIN_ENABLED`, `PRACTITIONER_LOGIN_ENABLED`, `RELATED_PERSON_LOGIN_ENABLED` | on | | | `PATIENT_INVITATION_ENABLED` | on | `DEFAULT_PATIENT_ACCESS_POLICY`. | | `PRACTITIONER_INVITATION_ENABLED`, `RELATED_PERSON_INVITATION_ENABLED` | on | | | `PATIENT_REGISTRATION_ENABLED` | on | `DEFAULT_PATIENT_ACCESS_POLICY`, naming a policy that can be read. | | `PRACTITIONER_REGISTRATION_ENABLED` | off | `DEFAULT_PRACTITIONER_ACCESS_POLICY` (or `CLINICIAN_INVITE_ACCESS_POLICY`): an AccessPolicy of this project. | | `CLINICIAN_INVITE_ON_BUSINESS_EMAIL` | off | Effective `PATIENT_REGISTRATION_ENABLED`, and the default practitioner access policy as above. | | `CONTENT_ENABLED`, `MAILING_ENABLED` | off | Markers the Console sets; Ovok does not act on them. | | `SIGNALS_SEND_AUTO` | off | A Signals tenant of the project's own. Observations created through FHIR go to it, and a resident's first one enrols the resident in Signals; ingest readings go there on their own. | | `SIGNALS_ANNOTATE_OBSERVATIONS` | as `SIGNALS_SEND_AUTO` | A Signals tenant of the project's own. Signals' alerts and episodes are written into the project as `DetectedIssue` and `Flag`, and an alert's reading gets its `interpretation`. Project roles need read on `DetectedIssue` and `Flag` to see them. | - App URLs are not folded in: they are in `values`, and a flow that needs a missing one reports it, for example an invite answers 409 `app_url_not_configured`. - Some routes need more. The sharing invites (`/v1/invites`) also need practitioner sharing on, set through the patient-sharing settings. - With `PRACTITIONER_LOGIN_ENABLED` off, a practitioner who is a project admin keeps refreshing an open session, so they can turn it back on. - A default access policy that cannot be read at that moment counts as missing, as it does for the flows themselves. - Every key is read from the first `Project.setting[]` entry of its name. ## 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. ## Example ```bash curl -X GET 'https://api.sandbox.ovok.com/v1/project/settings' \ -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE3NjcyNjg4MDAsImV4cCI6MTc2NzI3MjQwMH0.Ql3B_ztDvctlyZ2z0vp4sl3ExXRQGkzmxdmTAqxNzZk' ```