openapi: 3.2.0 info: title: Juvenescence Content API (WordPress REST API) Search 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: Search description: Cross-content search over posts, pages and taxonomy terms paths: /wp/v2/search: get: operationId: searchContent tags: - Search summary: Search across content description: Cross-content search over posts, pages, the portfolio type and taxonomy terms. A search for `aging` returned 46 hits at derivation. Set `type=term` to search taxonomy terms instead of posts, and `subtype` to narrow to one post type or taxonomy. This is the single best entry point for an agent that needs to find Juvenescence material without walking every collection. security: - {} responses: '200': description: A page of search results. 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/SearchResult' '400': $ref: '#/components/responses/BadRequest' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' parameters: - $ref: '#/components/parameters/contextEmbed' - $ref: '#/components/parameters/page' - $ref: '#/components/parameters/per_page' - $ref: '#/components/parameters/search' - $ref: '#/components/parameters/exclude' - $ref: '#/components/parameters/include' - name: type in: query description: Limit results to items of an object type. schema: type: string default: post enum: - post - term - post-format - name: subtype in: query description: Limit results to items of one or more object subtypes, e.g. `post`, `page`, `portfolio`, `category`, `post_tag`. schema: type: array items: type: string default: - any components: parameters: contextEmbed: name: contextEmbed in: query description: Scope under which the request is made; determines fields present in response. schema: type: string default: view enum: - view - embed exclude: name: exclude in: query description: Ensure result set excludes specific IDs. schema: type: array items: type: integer include: name: include in: query description: Limit result set to specific IDs. schema: type: array items: type: integer page: name: page in: query description: Current page of the collection. schema: type: integer default: 1 minimum: 1 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 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 SearchResult: type: object description: A cross-content search hit. properties: id: type: integer description: Unique identifier for the object. title: type: string description: The title for the object. url: type: string format: uri description: URL to the object. type: type: string description: Object type. examples: - post - term subtype: type: string description: Object subtype. examples: - post - page - portfolio - category - post_tag _links: $ref: '#/components/schemas/Links' 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