openapi: 3.2.0
info:
title: Nacuity Pharmaceuticals Content Pages API
version: wp/v2
summary: Anonymously readable WordPress REST content API behind www.nacuity.com.
description: The read-only content surface Nacuity Pharmaceuticals exposes at https://www.nacuity.com/wp-json. Nacuity Pharmaceuticals is a clinical-stage biopharmaceutical company developing NPI-001 (N-acetylcysteine amide tablets) for retinitis pigmentosa and NPI-002 (an intravitreal implant) for the delay of cataract progression; it runs no developer program and markets no product API. This document is an API Evangelist derivation of the WordPress `wp/v2` route index the site publishes at /wp-json/, restricted to the operations that were verified to return data anonymously on 2026-08-04. Write operations, `/wp/v2/users`, `/wp/v2/settings`, `/wp/v2/menus`, `/wp/v2/themes`, `/wp/v2/plugins`, `/wp/v2/templates`, the `wp-abilities/v1` namespace, the `wordfence/v1` namespace, the `wp-site-health/v1` namespace and the authenticated half of `yoast/v1` and `exactmetrics/v1` all require authentication and are deliberately excluded — see x-api-evangelist-provenance.
contact:
name: Nacuity Pharmaceuticals
url: https://www.nacuity.com/contact/
x-api-evangelist-provenance: Derived by the API Evangelist enrichment pipeline from the live WordPress REST route index at https://www.nacuity.com/wp-json/ (211 routes across the namespaces oembed/1.0, sliderrevolution, wordfence/v1, yoast/v1, exactmetrics/v1, wp/v2, wp-site-health/v1, wp-block-editor/v1 and wp-abilities/v1) and verified against live anonymous responses on 2026-08-04. Every parameter below appears verbatim in the route index `args` for that endpoint, and every operation modelled here returned 200 without credentials. Nacuity Pharmaceuticals publishes no OpenAPI, no developer documentation and no API reference for this surface; the humanURL in apis.yml points at the upstream WordPress REST handbook that defines the wp/v2 contract. Nothing here was obtained with credentials.
servers:
- url: https://www.nacuity.com/wp-json
description: Production content API
tags:
- name: pages
description: Corporate, clinical-programme and press-release pages (29 published at harvest time). Nacuity authors its news items as pages, not as posts.
paths:
/wp/v2/pages:
get:
tags:
- pages
operationId: listPages
summary: List pages
description: 'Lists published pages. At harvest time this returned the 10 corporate pages: Home, About Nacuity Pharmaceuticals, Our Science, Disease State, Resources for patients and caregivers, News, Careers, Working with Grin Therapeutics (contact), Privacy Policy and Cookie Policy.'
parameters:
- $ref: '#/components/parameters/Context'
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PerPage'
- $ref: '#/components/parameters/Search'
- $ref: '#/components/parameters/After'
- $ref: '#/components/parameters/Before'
- $ref: '#/components/parameters/ModifiedAfter'
- $ref: '#/components/parameters/ModifiedBefore'
- $ref: '#/components/parameters/Exclude'
- $ref: '#/components/parameters/Include'
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Order'
- $ref: '#/components/parameters/Slug'
- name: author
in: query
schema:
type: array
items:
type: integer
- name: author_exclude
in: query
schema:
type: array
items:
type: integer
- name: menu_order
in: query
description: Limit result set to posts with a specific menu_order value.
schema:
type: integer
- name: parent
in: query
description: Limit result set to items with particular parent ids.
schema:
type: array
items:
type: integer
- 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
- name: orderby
in: query
schema:
type: string
enum:
- author
- date
- id
- include
- modified
- parent
- relevance
- slug
- include_slugs
- title
- menu_order
default: date
- $ref: '#/components/parameters/Status'
- $ref: '#/components/parameters/SearchColumns'
- $ref: '#/components/parameters/SearchSemantics'
responses:
'200':
description: A paginated list of pages.
headers:
X-WP-Total:
$ref: '#/components/headers/XWPTotal'
X-WP-TotalPages:
$ref: '#/components/headers/XWPTotalPages'
Link:
$ref: '#/components/headers/LinkPagination'
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Page'
examples:
corporate-pages:
summary: Fields-filtered page list observed 2026-08-04 (X-WP-Total 29)
value:
- id: 23
slug: about
link: https://www.nacuity.com/about/
title:
rendered: About Us
parent: 0
- id: 337
slug: our-science
link: https://www.nacuity.com/our-science/
title:
rendered: Our Science
parent: 0
- id: 630
slug: nacuity-pharmaceuticals-granted-u-s-fda-breakthrough-therapy-designation-for-npi-001-n-acetylcysteine-amide-tablets-for-the-treatment-of-retinitis-pigmentosa
link: https://www.nacuity.com/news/nacuity-pharmaceuticals-granted-u-s-fda-breakthrough-therapy-designation-for-npi-001-n-acetylcysteine-amide-tablets-for-the-treatment-of-retinitis-pigmentosa/
title:
rendered: Nacuity Pharmaceuticals Granted U.S. FDA Breakthrough Therapy Designation for NPI-001 (N-acetylcysteine amide) Tablets for the Treatment of Retinitis Pigmentosa
parent: 99
'400':
$ref: '#/components/responses/InvalidParam'
/wp/v2/pages/{id}:
get:
tags:
- pages
operationId: getPage
summary: Get a page
description: 'Returns one page. IMPORTANT: on this deployment `content.rendered` and `excerpt.rendered` are EMPTY STRINGS for all 29 published pages — the page bodies are authored in Slider Revolution / page-builder post meta that WordPress does not project into the REST content field, so the body text is only reachable by rendering the HTML page. What the API does return per page is the identity and navigation metadata (id, slug, title, link, date, modified, parent, menu_order, template, class_list) plus the Yoast `yoast_head` markup and `yoast_head_json` object, which carries the canonical URL, robots directives, Open Graph tags and the schema.org @graph (WebPage, BreadcrumbList, WebSite, Organization).'
parameters:
- $ref: '#/components/parameters/PathId'
- $ref: '#/components/parameters/Context'
responses:
'200':
description: A page
content:
application/json:
schema:
$ref: '#/components/schemas/Page'
'404':
$ref: '#/components/responses/NotFound'
components:
schemas:
Page:
type: object
description: A WordPress page. On www.nacuity.com `content.rendered` and `excerpt.rendered` are empty strings for every one of the 29 published pages — see getPage.
properties:
id:
type: integer
date:
type: string
format: date-time
date_gmt:
type: string
format: date-time
guid:
$ref: '#/components/schemas/RenderedText'
modified:
type: string
format: date-time
modified_gmt:
type: string
format: date-time
slug:
type: string
status:
type: string
type:
type: string
link:
type: string
format: uri
title:
$ref: '#/components/schemas/RenderedText'
content:
$ref: '#/components/schemas/RenderedText'
excerpt:
$ref: '#/components/schemas/RenderedText'
author:
type: integer
featured_media:
type: integer
parent:
type: integer
description: Parent page id — pages are hierarchical. On this deployment 14 of 29 pages hang off page 99 (News) and 2 off page 560 (Medical Information).
menu_order:
type: integer
template:
type: string
class_list:
type: array
items:
type: string
yoast_head:
type: string
description: Rendered Yoast SEO head markup for this page.
yoast_head_json:
type: object
description: Parsed Yoast SEO head data — title, canonical, robots, og_* and twitter_* tags, and the schema.org `schema.@graph` (WebPage, BreadcrumbList, WebSite, Organization). On this deployment this object is the only per-page descriptive text the API returns, because content.rendered and excerpt.rendered are empty.
_links:
type: object
Error:
type: object
description: The WordPress REST error envelope. Note this is NOT RFC 9457 application/problem+json — it is served as application/json with code/message/data.
required:
- code
- message
- data
properties:
code:
type: string
description: Machine-readable error slug
e.g. rest_post_invalid_id.: null
message:
type: string
description: Human-readable message.
data:
type: object
properties:
status:
type: integer
params:
type: object
additionalProperties:
type: string
details:
type: object
RenderedText:
type: object
properties:
rendered:
type: string
parameters:
SearchSemantics:
name: search_semantics
in: query
description: How to interpret the search input.
schema:
type: string
enum:
- exact
PathId:
name: id
in: path
required: true
description: Unique identifier for the object.
schema:
type: integer
Status:
name: status
in: query
description: Limit result set to posts assigned one or more statuses. Anonymous callers may only request `publish`.
schema:
type: array
items:
type: string
default:
- publish
Slug:
name: slug
in: query
description: Limit result set to posts with one or more specific slugs.
schema:
type: array
items:
type: string
PerPage:
name: per_page
in: query
description: Maximum number of items to be returned in result set. Values outside 1-100 return a 400 rest_invalid_param.
schema:
type: integer
minimum: 1
maximum: 100
default: 10
Context:
name: context
in: query
description: Scope under which the request is made; determines fields present in response. Anonymous callers may only use `view` and `embed`.
schema:
type: string
enum:
- view
- embed
- edit
default: view
Order:
name: order
in: query
description: Order sort attribute ascending or descending.
schema:
type: string
enum:
- asc
- desc
default: desc
Search:
name: search
in: query
description: Limit results to those matching a string.
schema:
type: string
Before:
name: before
in: query
description: Limit response to posts published before a given ISO8601 compliant date.
schema:
type: string
format: date-time
ModifiedAfter:
name: modified_after
in: query
description: Limit response to posts modified after 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
SearchColumns:
name: search_columns
in: query
description: Array of column names to be searched.
schema:
type: array
items:
type: string
Page:
name: page
in: query
description: Current page of the collection.
schema:
type: integer
minimum: 1
default: 1
Exclude:
name: exclude
in: query
description: Ensure result set excludes specific IDs.
schema:
type: array
items:
type: integer
ModifiedBefore:
name: modified_before
in: query
description: Limit response to posts modified before a given ISO8601 compliant date.
schema:
type: string
format: date-time
Include:
name: include
in: query
description: Limit result set to specific IDs.
schema:
type: array
items:
type: integer
After:
name: after
in: query
description: Limit response to posts published after a given ISO8601 compliant date.
schema:
type: string
format: date-time
headers:
XWPTotal:
description: Total number of matching records across all pages.
schema:
type: integer
XWPTotalPages:
description: Total number of result pages at the current per_page.
schema:
type: integer
LinkPagination:
description: RFC 8288 Link header carrying rel="next" / rel="prev" page links.
schema:
type: string
responses:
InvalidParam:
description: One or more query parameters failed validation.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
per-page-out-of-bounds:
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: The requested object does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
invalid-id:
value:
code: rest_post_invalid_id
message: Invalid post ID.
data:
status: 404