Kallyope Content REST API

Anonymous, read-only REST surface behind kallyope.com. Kallyope runs WordPress and exposes the WordPress REST API publicly at https://kallyope.com/wp-json with 326 registered routes across 14 namespaces. The publicly readable surface is the stock wp/v2 namespace, which Kallyope has extended with a first-party custom post type — "document" (scientific posters, presentations, publications and video) — and four first-party custom taxonomies that classify it: program (drug programs, e.g. elismetrep), event (scientific congresses such as the American Headache Society and Academy of Neurology annual meetings), content-type (presentation, poster, publication, video, terms-conditions) and document-type. Alongside those sit the core posts (company news), pages, media, categories, users, search, types and taxonomies collections. No authentication is required for reads and none of the write methods are reachable anonymously; no API keys, rate-limit headers or developer documentation are published for it. This is a content and marketing API, not a Klarity platform, research-data or clinical API.

Documentation

Specifications

Other Resources

OpenAPI Specification

kallyope-content-api-openapi.yml Raw ↑
openapi: 3.1.0
x-provenance:
  generated: '2026-08-01'
  method: derived
  source: https://kallyope.com/wp-json/
  note: >-
    Derived by API Evangelist from the live, anonymous WordPress REST API route index
    published at https://kallyope.com/wp-json/ on 2026-08-01, and from an observed
    HTTP GET of every path below. Kallyope, Inc. does not publish an OpenAPI description;
    this document describes only routes, query parameters and response shapes that were
    actually observed on the wire or declared verbatim in the route index. Query
    parameters are copied from the `args` block the route index publishes for each
    endpoint. Only the anonymously readable GET surface is described — the route index
    also registers POST/PUT/PATCH/DELETE on these collections plus 13 further plugin
    namespaces (ithemes-security, akismet, redirection, yoast, liquidweb/harbor, cptui,
    duplicate-post, regenerate-thumbnails, wp-site-health, wp-block-editor, wp-abilities,
    oembed), all of which require an authenticated WordPress session or application
    password and were not exercised. Nothing here is invented — where a shape was not
    observable it is left unconstrained rather than guessed.
info:
  title: Kallyope Content REST API (derived)
  version: '2'
  summary: >-
    Anonymous read-only REST surface behind kallyope.com, exposing Kallyope's company
    news, site pages, media library and its first-party library of scientific documents
    (posters, presentations, publications and video) as JSON.
  description: |
    Kallyope, Inc. runs kallyope.com on WordPress (hosted on Pantheon, fronted by Fastly)
    and exposes the WordPress REST API publicly at `https://kallyope.com/wp-json`. The
    route index registers **326 routes across 14 namespaces**; the publicly readable
    portion is the core `wp/v2` namespace, which Kallyope has extended with **first-party
    content models** registered through Custom Post Type UI:

    | Model | Kind | REST base | Observed items |
    |---|---|---|---|
    | `document` | custom post type | `/wp/v2/document` | 8 |
    | `program` | custom taxonomy | `/wp/v2/program` | 1 (`elismetrep`) |
    | `event` | custom taxonomy | `/wp/v2/event` | 2 congresses |
    | `content-type` | custom taxonomy | `/wp/v2/content-type` | 5 |
    | `document-type` | custom taxonomy | `/wp/v2/document-type` | 0 |

    A `document` is a piece of scientific communication — the AHS 2026 elismetrep poster
    and MOA presentation, for example — carrying `title`, `content`, `excerpt`,
    `featured_media` and term references into `program`, `event`, `content-type` and
    `document-type`. Alongside those sit the core `posts` (company news, 6 items),
    `pages` (9), `media` (215), `categories` (8), `users` (2), `search`, `types` and
    `taxonomies` collections.

    These endpoints require **no authentication** and returned real JSON payloads when
    probed on 2026-08-01. This is a content and marketing API, not a Klarity discovery
    platform API, a research-data API or a clinical API — Kallyope publishes no developer
    portal, no API reference, no SDKs, no CLI and no public GitHub organization, and the
    surface exists as a byproduct of running WordPress rather than as a designed public
    contract. Responses are standard WordPress REST records, so field names follow
    WordPress internals (`id`, `slug`, `title.rendered`, `content.rendered`, `_links`,
    plus Yoast SEO's `yoast_head` / `yoast_head_json`).

    Collections page with `page` / `per_page` (max 100) and report `X-WP-Total` and
    `X-WP-TotalPages`, with RFC 8288 `Link` rel="next"/"prev". Errors are the WordPress
    `{code, message, data.status}` envelope — not RFC 9457 problem+json.
  contact:
    name: Kallyope, Inc.
    url: https://kallyope.com/contact/
  x-derived-by:
    organization: API Evangelist
    url: https://apievangelist.com
servers:
- url: https://kallyope.com/wp-json
  description: Production WordPress REST API root for kallyope.com
tags:
- name: Documents
  description: Kallyope's first-party library of scientific posters, presentations, publications and video.
- name: Taxonomies
  description: The first-party program / event / content-type / document-type classifications applied to documents.
- name: News
  description: Company news and press-release posts.
- name: Pages
  description: Site pages (about, pipeline, platform, partnering, careers, contact).
- name: Media
  description: The uploaded media library backing documents and pages.
- name: Discovery
  description: Site-wide search and the registered post-type / taxonomy indexes.
paths:
  /:
    get:
      operationId: getApiIndex
      tags: [Discovery]
      summary: Get the REST API root index
      description: >-
        Returns the WordPress REST API discovery document — site name, URL, the list of
        registered namespaces, every registered route with its methods and declared args,
        and the `authentication` block advertising application-password authorization.
      responses:
        '200':
          description: API root index
          content:
            application/json:
              schema:
                type: object
                properties:
                  name: {type: string}
                  description: {type: string}
                  url: {type: string, format: uri}
                  namespaces: {type: array, items: {type: string}}
                  authentication: {type: object}
                  routes: {type: object}
  /wp/v2/document:
    get:
      operationId: listDocuments
      tags: [Documents]
      summary: List documents
      description: >-
        List Kallyope's scientific documents — congress posters, presentations,
        publications and video. Filterable by the first-party program, event,
        content-type and document-type taxonomies.
      parameters:
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: page, in: query, description: Current page of the collection., schema: {type: integer, default: 1}}
      - {name: per_page, in: query, description: Maximum number of items to be returned in result set., schema: {type: integer, minimum: 1, maximum: 100, default: 10}}
      - {name: search, in: query, description: Limit results to those matching a string., schema: {type: string}}
      - {name: after, in: query, description: Limit response to posts published after a given ISO8601 compliant date., schema: {type: string}}
      - {name: before, in: query, description: Limit response to posts published before a given ISO8601 compliant date., schema: {type: string}}
      - {name: modified_after, in: query, description: Limit response to posts modified after a given ISO8601 compliant date., schema: {type: string}}
      - {name: modified_before, in: query, description: Limit response to posts modified before a given ISO8601 compliant date., schema: {type: string}}
      - {name: exclude, in: query, description: Ensure result set excludes specific IDs., schema: {type: array, items: {type: integer}}}
      - {name: include, in: query, description: Limit result set to specific IDs., schema: {type: array, items: {type: integer}}}
      - {name: offset, in: query, description: Offset the result set by a specific number of items., schema: {type: integer}}
      - {name: order, in: query, description: Order sort attribute ascending or descending., schema: {type: string, enum: [asc, desc]}}
      - {name: orderby, in: query, description: Sort collection by post attribute., schema: {type: string}}
      - {name: slug, in: query, description: Limit result set to posts with one or more specific slugs., schema: {type: array, items: {type: string}}}
      - {name: status, in: query, description: Limit result set to posts assigned one or more statuses., schema: {type: array, items: {type: string}}}
      - {name: tax_relation, in: query, description: Limit result set based on relationship between multiple taxonomies., schema: {type: string, enum: [AND, OR]}}
      - {name: program, in: query, description: Limit result set to items with specific terms assigned in the program taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: program_exclude, in: query, description: Limit result set to items except those with specific terms assigned in the program taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: event, in: query, description: Limit result set to items with specific terms assigned in the event taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: event_exclude, in: query, description: Limit result set to items except those with specific terms assigned in the event taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: content-type, in: query, description: Limit result set to items with specific terms assigned in the content-type taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: content-type_exclude, in: query, description: Limit result set to items except those with specific terms assigned in the content-type taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: document-type, in: query, description: Limit result set to items with specific terms assigned in the document-type taxonomy., schema: {type: array, items: {type: integer}}}
      responses:
        '200':
          description: A page of documents
          headers:
            X-WP-Total: {description: Total number of items in the collection., schema: {type: integer}}
            X-WP-TotalPages: {description: Total number of pages available., schema: {type: integer}}
            Link: {description: RFC 8288 pagination links (rel="next" / rel="prev")., schema: {type: string}}
            Cache-Control: {description: 'Observed: public, max-age=86400.', schema: {type: string}}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Document'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/document/{id}:
    get:
      operationId: getDocument
      tags: [Documents]
      summary: Get a document by ID
      parameters:
      - {name: id, in: path, required: true, description: Unique identifier for the post., schema: {type: integer}}
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: excerpt_length, in: query, description: Override the default excerpt length., schema: {type: integer}}
      - {name: password, in: query, description: The password for the post if it is password protected., schema: {type: string}}
      responses:
        '200':
          description: A single document
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Document'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/program:
    get:
      operationId: listPrograms
      tags: [Taxonomies]
      summary: List program terms
      description: >-
        List the first-party `program` taxonomy — Kallyope's named drug programs.
        Observed on 2026-08-01: one term, `elismetrep` (7 associated documents).
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSearch'}
      - {$ref: '#/components/parameters/TermSlug'}
      - {$ref: '#/components/parameters/TermHideEmpty'}
      - {$ref: '#/components/parameters/TermPost'}
      - {$ref: '#/components/parameters/TermParent'}
      responses:
        '200':
          description: A page of program terms
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Term'}}
  /wp/v2/event:
    get:
      operationId: listEvents
      tags: [Taxonomies]
      summary: List event terms
      description: >-
        List the first-party `event` taxonomy — the scientific congresses a document was
        presented at. Observed on 2026-08-01: `academy-of-neurology-annual-meeting` and
        `america-headache-society-annual-meeting`.
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSearch'}
      - {$ref: '#/components/parameters/TermSlug'}
      - {$ref: '#/components/parameters/TermHideEmpty'}
      - {$ref: '#/components/parameters/TermPost'}
      responses:
        '200':
          description: A page of event terms
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Term'}}
  /wp/v2/content-type:
    get:
      operationId: listContentTypes
      tags: [Taxonomies]
      summary: List content-type terms
      description: >-
        List the first-party `content-type` taxonomy — the form a document takes.
        Observed on 2026-08-01: `presentation`, `poster`, `publication`, `video`,
        `terms-conditions`.
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSearch'}
      - {$ref: '#/components/parameters/TermSlug'}
      - {$ref: '#/components/parameters/TermHideEmpty'}
      - {$ref: '#/components/parameters/TermPost'}
      responses:
        '200':
          description: A page of content-type terms
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Term'}}
  /wp/v2/document-type:
    get:
      operationId: listDocumentTypes
      tags: [Taxonomies]
      summary: List document-type terms
      description: >-
        List the first-party `document-type` taxonomy. Registered and publicly readable,
        but observed empty (0 terms) on 2026-08-01.
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSlug'}
      - {$ref: '#/components/parameters/TermHideEmpty'}
      responses:
        '200':
          description: A page of document-type terms
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Term'}}
  /wp/v2/posts:
    get:
      operationId: listPosts
      tags: [News]
      summary: List company news posts
      description: >-
        List Kallyope's news and press-release posts. Observed on 2026-08-01: 6 items.
      parameters:
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: page, in: query, description: Current page of the collection., schema: {type: integer, default: 1}}
      - {name: per_page, in: query, description: Maximum number of items to be returned in result set., schema: {type: integer, minimum: 1, maximum: 100, default: 10}}
      - {name: search, in: query, description: Limit results to those matching a string., schema: {type: string}}
      - {name: after, in: query, description: Limit response to posts published after a given ISO8601 compliant date., schema: {type: string}}
      - {name: before, in: query, description: Limit response to posts published before a given ISO8601 compliant date., schema: {type: string}}
      - {name: slug, in: query, description: Limit result set to posts with one or more specific slugs., schema: {type: array, items: {type: string}}}
      - {name: categories, in: query, description: Limit result set to items with specific terms assigned in the categories taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: categories_exclude, in: query, description: Limit result set to items except those with specific terms assigned in the categories taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: tags, in: query, description: Limit result set to items with specific terms assigned in the tags taxonomy., schema: {type: array, items: {type: integer}}}
      - {name: order, in: query, description: Order sort attribute ascending or descending., schema: {type: string, enum: [asc, desc]}}
      - {name: orderby, in: query, description: Sort collection by post attribute., schema: {type: string}}
      responses:
        '200':
          description: A page of posts
          headers:
            X-WP-Total: {description: Total number of items in the collection., schema: {type: integer}}
            X-WP-TotalPages: {description: Total number of pages available., schema: {type: integer}}
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Post'}}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/posts/{id}:
    get:
      operationId: getPost
      tags: [News]
      summary: Get a news post by ID
      parameters:
      - {name: id, in: path, required: true, description: Unique identifier for the post., schema: {type: integer}}
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      responses:
        '200':
          description: A single post
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Post'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/pages:
    get:
      operationId: listPages
      tags: [Pages]
      summary: List site pages
      description: >-
        List the site's pages — home, about, pipeline, platform, partnering, careers,
        news, contact. Observed on 2026-08-01: 9 items.
      parameters:
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: page, in: query, description: Current page of the collection., schema: {type: integer, default: 1}}
      - {name: per_page, in: query, description: Maximum number of items to be returned in result set., schema: {type: integer, minimum: 1, maximum: 100, default: 10}}
      - {name: search, in: query, description: Limit results to those matching a string., schema: {type: string}}
      - {name: slug, in: query, description: Limit result set to posts with one or more specific slugs., schema: {type: array, items: {type: string}}}
      - {name: parent, in: query, description: Limit result set to items with particular parent IDs., schema: {type: array, items: {type: integer}}}
      responses:
        '200':
          description: A page of pages
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Post'}}
  /wp/v2/pages/{id}:
    get:
      operationId: getPage
      tags: [Pages]
      summary: Get a site page by ID
      parameters:
      - {name: id, in: path, required: true, description: Unique identifier for the post., schema: {type: integer}}
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      responses:
        '200':
          description: A single page
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Post'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/media:
    get:
      operationId: listMedia
      tags: [Media]
      summary: List media library items
      description: >-
        List uploaded media — the PDFs, splash images and logos referenced by documents
        and pages. Observed on 2026-08-01: X-WP-Total 215.
      parameters:
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: page, in: query, description: Current page of the collection., schema: {type: integer, default: 1}}
      - {name: per_page, in: query, description: Maximum number of items to be returned in result set., schema: {type: integer, minimum: 1, maximum: 100, default: 10}}
      - {name: search, in: query, description: Limit results to those matching a string., schema: {type: string}}
      - {name: media_type, in: query, description: Limit result set to attachments of a particular media type., schema: {type: string}}
      - {name: mime_type, in: query, description: Limit result set to attachments of a particular MIME type., schema: {type: string}}
      responses:
        '200':
          description: A page of media items
          content:
            application/json:
              schema: {type: array, items: {type: object}}
  /wp/v2/media/{id}:
    get:
      operationId: getMediaItem
      tags: [Media]
      summary: Get a media item by ID
      parameters:
      - {name: id, in: path, required: true, description: Unique identifier for the attachment., schema: {type: integer}}
      responses:
        '200':
          description: A single media item
          content:
            application/json:
              schema: {type: object}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/categories:
    get:
      operationId: listCategories
      tags: [Taxonomies]
      summary: List category terms
      description: 'Core WordPress category taxonomy. Observed on 2026-08-01: 8 terms.'
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSearch'}
      - {$ref: '#/components/parameters/TermSlug'}
      - {$ref: '#/components/parameters/TermHideEmpty'}
      responses:
        '200':
          description: A page of category terms
          content:
            application/json:
              schema: {type: array, items: {$ref: '#/components/schemas/Term'}}
  /wp/v2/search:
    get:
      operationId: search
      tags: [Discovery]
      summary: Search across all public content
      description: >-
        Site-wide search returning lightweight `{id, title, url, type, subtype}` records
        across posts, pages and documents. Observed on 2026-08-01: 23 searchable items.
      parameters:
      - {name: context, in: query, description: 'Scope under which the request is made; determines fields present in response.', schema: {type: string}}
      - {name: page, in: query, description: Current page of the collection., schema: {type: integer, default: 1}}
      - {name: per_page, in: query, description: Maximum number of items to be returned in result set., schema: {type: integer, minimum: 1, maximum: 100, default: 10}}
      - {name: search, in: query, description: Limit results to those matching a string., schema: {type: string}}
      - {name: type, in: query, description: Limit results to items of an object type., schema: {type: string}}
      - {name: subtype, in: query, description: Limit results to items of one or more object subtypes., schema: {type: array, items: {type: string}}}
      - {name: exclude, in: query, description: Ensure result set excludes specific IDs., schema: {type: array, items: {type: integer}}}
      - {name: include, in: query, description: Limit result set to specific IDs., schema: {type: array, items: {type: integer}}}
      responses:
        '200':
          description: A page of search results
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id: {type: integer}
                    title: {type: string}
                    url: {type: string, format: uri}
                    type: {type: string}
                    subtype: {type: string}
  /wp/v2/types:
    get:
      operationId: listTypes
      tags: [Discovery]
      summary: List registered post types
      description: >-
        Returns every registered post type with its `rest_base`, `rest_namespace`,
        `taxonomies` and hierarchy flag — the machine-readable index of the content
        models this API exposes, including Kallyope's first-party `document` type.
      responses:
        '200':
          description: Map of post type name to post type descriptor
          content:
            application/json:
              schema: {type: object}
  /wp/v2/taxonomies:
    get:
      operationId: listTaxonomies
      tags: [Discovery]
      summary: List registered taxonomies
      description: >-
        Returns every registered taxonomy with its `rest_base`, the post types it applies
        to, and hierarchy flag — including Kallyope's first-party `program`, `event`,
        `content-type` and `document-type` taxonomies.
      responses:
        '200':
          description: Map of taxonomy name to taxonomy descriptor
          content:
            application/json:
              schema: {type: object}
  /wp/v2/users:
    get:
      operationId: listUsers
      tags: [Discovery]
      summary: List public authors
      description: >-
        Publicly readable author list (authors of published posts only). Observed on
        2026-08-01: 2 users.
      parameters:
      - {$ref: '#/components/parameters/TermPage'}
      - {$ref: '#/components/parameters/TermPerPage'}
      - {$ref: '#/components/parameters/TermSearch'}
      responses:
        '200':
          description: A page of users
          content:
            application/json:
              schema: {type: array, items: {type: object}}
components:
  parameters:
    TermPage:
      name: page
      in: query
      description: Current page of the collection.
      schema: {type: integer, default: 1}
    TermPerPage:
      name: per_page
      in: query
      description: Maximum number of items to be returned in result set.
      schema: {type: integer, minimum: 1, maximum: 100, default: 10}
    TermSearch:
      name: search
      in: query
      description: Limit results to those matching a string.
      schema: {type: string}
    TermSlug:
      name: slug
      in: query
      description: Limit result set to terms with one or more specific slugs.
      schema: {type: array, items: {type: string}}
    TermHideEmpty:
      name: hide_empty
      in: query
      description: Whether to hide terms not assigned to any posts.
      schema: {type: boolean}
    TermPost:
      name: post
      in: query
      description: Limit result set to terms assigned to a specific post.
      schema: {type: integer}
    TermParent:
      name: parent
      in: query
      description: Limit result set to terms assigned to a specific parent.
      schema: {type: integer}
  responses:
    InvalidParam:
      description: >-
        A query parameter failed validation. WordPress error envelope with
        `code: rest_invalid_param` and per-parameter detail under `data.params`.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            code: rest_invalid_param
            message: 'Invalid parameter(s): per_page'
            data:
              status: 400
              params:
                per_page: per_page must be between 1 (inclusive) and 100 (inclusive)
    InvalidPostId:
      description: No record exists with that identifier.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            code: rest_post_invalid_id
            message: Invalid post ID.
            data:
              status: 404
  schemas:
    Rendered:
      type: object
      description: WordPress rendered-content wrapper.
      properties:
        rendered: {type: string}
        protected: {type: boolean}
    Document:
      type: object
      description: >-
        A Kallyope scientific document — congress poster, presentation, publication or
        video. Custom post type `document`.
      properties:
        id: {type: integer}
        date: {type: string}
        date_gmt: {type: string}
        modified: {type: string}
        modified_gmt: {type: string}
        guid: {$ref: '#/components/schemas/Rendered'}
        slug: {type: string}
        status: {type: string}
        type: {type: string, const: document}
        link: {type: string, format: uri}
        title: {$ref: '#/components/schemas/Rendered'}
        content: {$ref: '#/components/schemas/Rendered'}
        excerpt: {$ref: '#/components/schemas/Rendered'}
        featured_media: {type: integer, description: Attachment ID of the splash image.}
        template: {type: string}
        meta: {type: object}
        document-type: {type: array, items: {type: integer}, description: Term IDs in the document-type taxonomy.}
        program: {type: array, items: {type: integer}, description: Term IDs in the program taxonomy.}
        event: {type: array, items: {type: integer}, description: Term IDs in the event taxonomy.}
        content-type: {type: array, items: {type: integer}, description: Term IDs in the content-type taxonomy.}
        class_list: {type: array, items: {type: string}}
        acf: {description: Advanced Custom Fields payload; observed empty.}
        yoast_head: {type: string, description: Yoast SEO rendered head markup, including a schema.org JSON-LD graph.}
        yoast_head_json: {type: object, description: Yoast SEO head as structured JSON.}
        _links: {type: object, description: HAL-style link relations (self, collection, about, wp:featuredmedia, wp:term, curies).}
    Post:
      type: object
      description: A core WordPress post or page record.
      properties:
        id: {type: integer}
        date: {type: string}
        modified: {type: string}
        slug: {type: string}
        status: {type: string}
        type: {type: string}
        link: {type: string, format: uri}
        title: {$ref: '#/components/schemas/Rendered'}
        content: {$ref: '#/components/schemas/Rendered'}
        excerpt: {$ref: '#/components/schemas/Rendered'}
        author: {type: integer}
        featured_media: {type: integer}
        categories: {type: array, items: {type: integer}}
        tags: {type: array, items: {type: integer}}
        yoast_head_json: {type: object}
        _links: {type: object}
    Term:
      type: object
      description: A taxonomy term (program, event, content-type, document-type, category).
      properties:
        id: {type: integer}
        count: {type: integer, description: Number of documents assigned this term.}
        description: {type: string}
        link: {type: string, format: uri}
        name: {type: string}
        slug: {type: string}
        taxonomy: {type: string}
        parent: {type: integer}
        meta: {type: object}
        yoast_head_json: {type: object}
        _links: {type: object}
    Error:
      type: object
      description: >-
        The WordPress REST error envelope. Not RFC 9457 problem+json — served as
        application/json with the HTTP status mirrored into `data.status`.
      required: [code, message, data]
      properties:
        code: {type: string, description: 'Machine-readable error code, e.g. rest_no_route.'}
        message: {type: string, description: Human-readable message.}
        data:
          type: object
          properties:
            status: {type: integer}
            params: {type: object}
            details: {type: object}