openapi: 3.2.0 info: title: Juvenescence Content API (WordPress REST API) Pages API version: wp/v2 description: Anonymously readable content API for juvlabs.com, the corporate site of Juvenescence Limited, derived from the WordPress REST route index the site publishes at https://juvlabs.com/wp-json/. It exposes Juvenescence's news stream (57 posts across Press Releases, In the News, Juv on the Road, Publications and Videos), the 35 corporate, science, pipeline and leadership-biography pages, a 466-item media library, the category and tag taxonomies, cross-content search, and the site's registered `portfolio` custom post type (registered and publicly queryable, but empty at the time of derivation). Juvenescence runs no developer program and publishes no hand-authored specification; this document is a faithful derivation of the routes, parameters, defaults and enums the site itself advertises, restricted to the read operations verified to return HTTP 200 without credentials on 2026-08-23. Write operations are registered on the same routes but are authenticated administrative endpoints, not a public API offering, and are deliberately not modelled here. The routes that require credentials on this install (`/wp/v2/users`, `/wp/v2/settings`, `/wp/v2/plugins`, `/wp/v2/themes`, `/wp/v2/block-types`, `/wp/v2/menu-locations` and the whole `wp-abilities/v1` namespace) are likewise excluded, and are recorded in the repository's authentication and conformance artifacts instead. contact: name: Juvenescence Limited url: https://juvlabs.com/contact-us/ termsOfService: https://juvlabs.com/terms-of-service/ x-derived-from: https://juvlabs.com/wp-json/ x-derived-on: '2026-08-23' x-api-evangelist-note: Derived by the API Evangelist enrichment pipeline from the provider-published WordPress REST route index at https://juvlabs.com/wp-json/ and https://juvlabs.com/wp-json/wp/v2; not authored or endorsed by Juvenescence Limited. Every operation was verified to return HTTP 200 without credentials on 2026-08-23. servers: - url: https://juvlabs.com/wp-json description: Production security: - {} tags: - name: Pages description: Corporate, science, pipeline and leadership-biography pages paths: /wp/v2/pages: get: operationId: listPages tags: - Pages summary: List pages description: 'Lists the site''s 35 published pages: the corporate and science set (`our-approach`, `science`, `our-pipeline`, `our-team`, `contact-us`, `solutions`, `news`), the leadership biographies (Jim Mellon, Dr Gregory Bailey, Dr Declan Doogan, Dr Richard Marshall CBE, Eileen Jennings-Brown, Professor Eric Verdin, Professor Lynne Cox, Professor Hugh Montgomery and others), and the policy pages (`terms-of-service`, `privacy-notice`, `cookie-notice`, `refund-policy`, `unsolicited-idea-submission-policy`).' security: - {} responses: '200': description: A page of pages. headers: X-WP-Total: description: Total number of items in the unpaginated collection. schema: type: integer X-WP-TotalPages: description: Total number of pages available at the current `per_page`. schema: type: integer Link: description: RFC 8288 pagination links carrying `rel="next"` and `rel="prev"`. schema: type: string content: application/json: schema: type: array items: $ref: '#/components/schemas/Page' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' parameters: - $ref: '#/components/parameters/context' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/per_page' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/after' - $ref: '#/components/parameters/before' - $ref: '#/components/parameters/modified_after' - $ref: '#/components/parameters/modified_before' - $ref: '#/components/parameters/author' - $ref: '#/components/parameters/author_exclude' - $ref: '#/components/parameters/exclude' - $ref: '#/components/parameters/include' - $ref: '#/components/parameters/menu_order' - $ref: '#/components/parameters/search_semantics' - $ref: '#/components/parameters/offset' - $ref: '#/components/parameters/order' - $ref: '#/components/parameters/pageOrderby' - $ref: '#/components/parameters/parentFilter' - $ref: '#/components/parameters/parent_exclude' - $ref: '#/components/parameters/search_columns' - $ref: '#/components/parameters/slugFilter' - $ref: '#/components/parameters/statusFilter' /wp/v2/pages/{id}: get: operationId: getPage tags: - Pages summary: Get a page description: 'Retrieves a single page by ID, including its rendered content. Useful IDs at derivation: 3809 (Our Pipeline), 4139 (Our Team), 4524 (Science), 5786 (Our Approach), 4275 (Contact Us), 920 (Terms Of Service), 879 (Privacy Notice).' security: - {} responses: '200': description: The requested page. content: application/json: schema: $ref: '#/components/schemas/Page' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' parameters: - $ref: '#/components/parameters/id' - $ref: '#/components/parameters/context' - $ref: '#/components/parameters/password' components: parameters: after: name: after in: query description: Limit response to posts published after a given ISO8601 compliant date. schema: type: string format: date-time author: name: author in: query description: Limit result set to posts assigned to specific authors. schema: type: array items: type: integer author_exclude: name: author_exclude in: query description: Ensure result set excludes posts assigned to specific authors. schema: type: array items: type: integer before: name: before in: query description: Limit response to posts published before a given ISO8601 compliant date. schema: type: string format: date-time context: name: context in: query description: Scope under which the request is made; determines fields present in response. schema: type: string default: view enum: - view - embed - edit exclude: name: exclude in: query description: Ensure result set excludes specific IDs. schema: type: array items: type: integer id: name: id in: path description: Unique identifier for the resource. schema: type: integer required: true include: name: include in: query description: Limit result set to specific IDs. schema: type: array items: type: integer menu_order: name: menu_order in: query description: Limit result set to posts with a specific menu_order value. schema: type: integer modified_after: name: modified_after in: query description: Limit response to posts modified after a given ISO8601 compliant date. schema: type: string format: date-time modified_before: name: modified_before in: query description: Limit response to posts modified before a given ISO8601 compliant date. schema: type: string format: date-time offset: name: offset in: query description: Offset the result set by a specific number of items. schema: type: integer order: name: order in: query description: Order sort attribute ascending or descending. schema: type: string default: desc enum: - asc - desc page: name: page in: query description: Current page of the collection. schema: type: integer default: 1 minimum: 1 pageOrderby: name: pageOrderby in: query description: Sort collection by post attribute. schema: type: string default: date enum: - author - date - id - include - modified - parent - relevance - slug - include_slugs - title - menu_order parentFilter: name: parentFilter in: query description: Limit result set to items with particular parent IDs. schema: type: array items: type: integer parent_exclude: name: parent_exclude in: query description: Limit result set to all items except those of a particular parent ID. schema: type: array items: type: integer password: name: password in: query description: The password for the post if it is password protected. schema: type: string per_page: name: per_page in: query description: Maximum number of items to be returned in result set. schema: type: integer default: 10 minimum: 1 maximum: 100 search: name: search in: query description: Limit results to those matching a string. schema: type: string search_columns: name: search_columns in: query description: Array of column names to be searched. schema: type: array items: type: string search_semantics: name: search_semantics in: query description: How to interpret the search input. schema: type: string enum: - exact slugFilter: name: slugFilter in: query description: Limit result set to items with one or more specific slugs. schema: type: array items: type: string statusFilter: name: statusFilter in: query description: Limit result set to posts assigned one or more statuses. Only `publish` is readable without credentials on this install. schema: type: array items: type: string default: - publish schemas: Error: type: object description: The WordPress REST error envelope. This API does NOT use RFC 9457 application/problem+json; errors are returned as application/json with this shape. required: - code - message - data properties: code: type: string description: A machine-readable error code. examples: - rest_post_invalid_id - rest_invalid_param - rest_no_route - rest_forbidden message: type: string description: A human-readable error message. data: type: object description: Error detail. Always carries the HTTP status; validation errors also carry `params` and `details` keyed by the offending parameter. properties: status: type: integer description: The HTTP status code. params: type: object additionalProperties: type: string description: Per-parameter validation messages. details: type: object additionalProperties: true description: Per-parameter structured validation detail. additionalProperties: true Links: type: object description: HAL-style `_links` relations WordPress attaches to every resource — `self`, `collection`, `about`, `author`, `replies`, `wp:featuredmedia`, `wp:term` and `curies`. additionalProperties: true Page: type: object description: A Juvenescence corporate, science, pipeline or leadership-biography page. properties: id: type: integer description: Unique identifier for the page. date: type: string format: date-time description: The date the page was published, in the site's timezone. date_gmt: type: string format: date-time description: The date the page was published, as GMT. modified: type: string format: date-time description: The date the page was last modified, in the site's timezone. slug: type: string description: An alphanumeric identifier for the page. examples: - our-pipeline - our-team - science - our-approach - contact-us status: type: string description: A named status for the page. type: type: string description: Type of post. examples: - page link: type: string format: uri description: URL to the page on juvlabs.com. title: $ref: '#/components/schemas/Rendered' content: $ref: '#/components/schemas/Rendered' excerpt: $ref: '#/components/schemas/Rendered' author: type: integer description: The ID for the author of the page. featured_media: type: integer description: The ID of the featured media for the page. parent: type: integer description: The ID for the parent of the page. menu_order: type: integer description: The order of the page in relation to other pages. template: type: string description: The theme file to use to display the page. _links: $ref: '#/components/schemas/Links' Rendered: type: object description: A WordPress rendered-content object. properties: rendered: type: string description: HTML for the field, transformed for display. responses: BadRequest: description: Invalid parameter. Returned with code `rest_invalid_param` and a per-parameter `data.params` map, e.g. `per_page must be between 1 (inclusive) and 100 (inclusive)`. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalidParam: value: 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) NotFound: description: No such resource, or no route matching the URL and method. content: application/json: schema: $ref: '#/components/schemas/Error' examples: invalidId: value: code: rest_post_invalid_id message: Invalid post ID. data: status: 404 noRoute: value: code: rest_no_route message: No route was found matching the URL and request method. data: status: 404 Unauthorized: description: The requested context or route requires credentials. Returned with code `rest_forbidden` when `context=edit` is requested anonymously. content: application/json: schema: $ref: '#/components/schemas/Error' examples: forbidden: value: code: rest_forbidden message: Sorry, you are not allowed to do that. data: status: 401