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}