Belharra Therapeutics Discovery API

Route, type, taxonomy, status and author discovery documents.

OpenAPI Specification

belharra-therapeutics-discovery-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Belharra Therapeutics Content Discovery API
  version: wp/v2
  summary: Anonymously readable WordPress REST content API behind belharratx.com.
  description: The read-only content surface Belharra Therapeutics exposes at https://belharratx.com/wp-json. Belharra Therapeutics is a privately held, next-generation chemoproteomics company in San Diego building small molecule therapeutics against undruggable targets with its Searchlight platform, incubated by Versant Ventures out of chemoproteomics research at The Scripps Research Institute and partnered with Genentech (January 2023) and Sanofi (June 2024). It runs no developer program and markets no product API. This document is an API Evangelist derivation of the WordPress `wp/v2` and `oembed/1.0` route index the site publishes at /wp-json/, restricted to the operations that were verified to return data anonymously on 2026-08-06. Write operations, `/wp/v2/settings`, `/wp/v2/menus`, `/wp/v2/menu-locations`, `/wp/v2/themes`, `/wp/v2/plugins`, `/wp/v2/block-types`, `/wp/v2/font-collections`, `/wp/v2/icons`, `/wp/v2/sidebars`, `/wp/v2/widget-types`, `/wp/v2/templates`, `/wp/v2/template-parts`, `/wp/v2/global-styles`, `/wp/v2/block-patterns/*`, `/wp/v2/pattern-directory/patterns`, the `wp-abilities/v1` capability registry, the `wp-site-health/v1`, `podcastplayer/v1`, `redirection/v1`, `contact-form-7/v1`, `duplicate-post/v1`, `wpe/cache-plugin/v1` and `wpe_sign_on_plugin/v1` namespaces, and the whole plugin-administration surface all require authentication or were denied anonymously, and are deliberately excluded — see x-api-evangelist-provenance.
  contact:
    name: Belharra Therapeutics
    url: https://belharratx.com/contact/
    email: info@belharratx.com
  x-api-evangelist-provenance: 'Derived by the API Evangelist enrichment pipeline from the live WordPress REST route index at https://belharratx.com/wp-json/ (198 routes across 11 namespaces) and verified against live anonymous responses on 2026-08-06. Every parameter below appears verbatim in the route index `args` for that endpoint, every schema property was read from a live anonymous response body, and every collection count in a description was read from the `X-WP-Total` response header on that date. Belharra Therapeutics 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. The deployment is served by WP Engine behind Cloudflare, and API responses carry `x-robots-tag: noindex` and `cache-control: max-age=600, must-revalidate`. Nothing here was obtained with credentials.'
servers:
- url: https://belharratx.com/wp-json
  description: Production content API
tags:
- name: discovery
  description: Route, type, taxonomy, status and author discovery documents.
paths:
  /:
    get:
      tags:
      - discovery
      operationId: getApiIndex
      summary: Get the REST API index
      description: Returns the site index — name, description, URL, home, the registered namespaces, the supported authentication methods (WordPress application passwords), the site logo and icon, and the full 198-entry route table.
      parameters:
      - $ref: '#/components/parameters/Context'
      - name: namespace
        in: query
        description: Restrict the response to a single namespace.
        schema:
          type: string
          examples:
          - wp/v2
      responses:
        '200':
          description: Site index
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiIndex'
  /wp/v2/users:
    get:
      tags:
      - discovery
      operationId: listAuthors
      summary: List content authors
      description: Lists the users who have published content. Anonymous callers receive the `embed`-level public author projection only — id, name, url, description, link, slug and avatar URLs. No email addresses, roles or capabilities are exposed anonymously. Three authors were listed at harvest time.
      parameters:
      - $ref: '#/components/parameters/Context'
      - $ref: '#/components/parameters/Page'
      - $ref: '#/components/parameters/PerPage'
      - $ref: '#/components/parameters/Search'
      - $ref: '#/components/parameters/SearchColumns'
      - $ref: '#/components/parameters/Exclude'
      - $ref: '#/components/parameters/Include'
      - $ref: '#/components/parameters/Offset'
      - $ref: '#/components/parameters/Order'
      - $ref: '#/components/parameters/Slug'
      - name: orderby
        in: query
        description: Sort collection by user attribute.
        schema:
          type: string
          enum:
          - id
          - include
          - name
          - registered_date
          - slug
          - include_slugs
          - email
          - url
          default: name
      - name: has_published_posts
        in: query
        description: Limit result set to users who have published posts.
        schema:
          type: array
          items:
            type: string
      responses:
        '200':
          description: A page of public author records
          headers:
            X-WP-Total:
              schema:
                type: integer
                examples:
                - 3
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Author'
        '400':
          $ref: '#/components/responses/InvalidParam'
  /wp/v2/types:
    get:
      tags:
      - discovery
      operationId: listPostTypes
      summary: List registered post types
      description: 'Returns the registered post types keyed by name. Fourteen are registered on this deployment: post, page, attachment, nav_menu_item, wp_block, wp_template, wp_template_part, wp_global_styles, wp_navigation, wp_font_family, wp_font_face, plus Belharra''s three custom types company-news, multimedia-file and press-release.'
      parameters:
      - $ref: '#/components/parameters/Context'
      responses:
        '200':
          description: Registered post types keyed by name
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/PostType'
  /wp/v2/taxonomies:
    get:
      tags:
      - discovery
      operationId: listTaxonomies
      summary: List registered taxonomies
      description: Returns the registered taxonomies keyed by name — category, post_tag, nav_menu and wp_pattern_category. Note that none of Belharra's three custom post types declares a taxonomy.
      parameters:
      - $ref: '#/components/parameters/Context'
      - name: type
        in: query
        description: Limit results to taxonomies associated with a specific post type.
        schema:
          type: string
          examples:
          - post
      responses:
        '200':
          description: Registered taxonomies keyed by name
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/Taxonomy'
  /wp/v2/statuses:
    get:
      tags:
      - discovery
      operationId: listPostStatuses
      summary: List registered post statuses
      description: Returns the post statuses visible anonymously. Two are exposed on this deployment — `publish` and `acf-disabled` (an Advanced Custom Fields status).
      parameters:
      - $ref: '#/components/parameters/Context'
      responses:
        '200':
          description: Registered post statuses keyed by slug
          content:
            application/json:
              schema:
                type: object
                additionalProperties:
                  $ref: '#/components/schemas/PostStatus'
components:
  parameters:
    PerPage:
      name: per_page
      in: query
      description: Maximum number of items to be returned in the result set.
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 10
    SearchColumns:
      name: search_columns
      in: query
      description: Array of column names to be searched.
      schema:
        type: array
        items:
          type: string
    Offset:
      name: offset
      in: query
      description: Offset the result set by a specific number of items.
      schema:
        type: integer
    Page:
      name: page
      in: query
      description: Current page of the collection.
      schema:
        type: integer
        minimum: 1
        default: 1
    Include:
      name: include
      in: query
      description: Limit result set to specific IDs.
      schema:
        type: array
        items:
          type: integer
    Slug:
      name: slug
      in: query
      description: Limit result set to items with one or more specific slugs.
      schema:
        type: array
        items:
          type: string
    Search:
      name: search
      in: query
      description: Limit results to those matching a string.
      schema:
        type: string
    Exclude:
      name: exclude
      in: query
      description: Ensure result set excludes specific IDs.
      schema:
        type: array
        items:
          type: integer
    Context:
      name: context
      in: query
      description: Scope under which the request is made; determines fields present in the response. Anonymous callers are limited to `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
  schemas:
    PostStatus:
      type: object
      description: A registered post status descriptor.
      properties:
        name:
          type: string
          examples:
          - Published
        slug:
          type: string
          enum:
          - publish
          - acf-disabled
        public:
          type: boolean
        queryable:
          type: boolean
        date_floating:
          type: boolean
        _links:
          $ref: '#/components/schemas/Links'
    Links:
      type: object
      description: HAL-style `_links` hypermedia block WordPress attaches to every resource.
      additionalProperties:
        type: array
        items:
          type: object
          properties:
            href:
              type: string
              format: uri
            embeddable:
              type: boolean
            templated:
              type: boolean
            name:
              type: string
            taxonomy:
              type: string
    Author:
      type: object
      description: The public author projection returned to anonymous callers. No email, roles or capabilities are exposed.
      properties:
        id:
          type: integer
        name:
          type: string
        url:
          type: string
        description:
          type: string
        link:
          type: string
          format: uri
        slug:
          type: string
        avatar_urls:
          type: object
          description: Gravatar URLs keyed by pixel size (24, 48, 96).
          additionalProperties:
            type: string
            format: uri
        meta:
          type: object
          additionalProperties: true
        acf:
          type: object
          additionalProperties: true
        _links:
          $ref: '#/components/schemas/Links'
      required:
      - id
      - name
      - slug
      - link
    Taxonomy:
      type: object
      description: A registered taxonomy descriptor.
      properties:
        name:
          type: string
          examples:
          - Categories
        slug:
          type: string
          examples:
          - category
        rest_base:
          type: string
          examples:
          - categories
        rest_namespace:
          type: string
          examples:
          - wp/v2
        description:
          type: string
        hierarchical:
          type: boolean
        types:
          type: array
          items:
            type: string
        _links:
          $ref: '#/components/schemas/Links'
    PostType:
      type: object
      description: A registered post type descriptor.
      properties:
        name:
          type: string
          examples:
          - Press Releases
        slug:
          type: string
          examples:
          - press-release
        rest_base:
          type: string
          examples:
          - press-release
        rest_namespace:
          type: string
          examples:
          - wp/v2
        description:
          type: string
        hierarchical:
          type: boolean
        has_archive:
          type:
          - boolean
          - string
        taxonomies:
          type: array
          items:
            type: string
        supports:
          type: object
          additionalProperties:
            type: boolean
        icon:
          type:
          - string
          - 'null'
        _links:
          $ref: '#/components/schemas/Links'
    Error:
      type: object
      description: The WordPress REST error envelope. This is NOT RFC 9457 problem+json — it is served as `application/json` with a `code` / `message` / `data.status` shape.
      properties:
        code:
          type: string
          examples:
          - rest_post_invalid_id
        message:
          type: string
          examples:
          - Invalid post ID.
        data:
          type: object
          properties:
            status:
              type: integer
              examples:
              - 404
            params:
              type: object
              additionalProperties:
                type: string
            details:
              type: object
              additionalProperties: true
      required:
      - code
      - message
      - data
    ApiIndex:
      type: object
      description: The REST API root index document.
      properties:
        name:
          type: string
          examples:
          - Belharra Therapeutics
        description:
          type: string
        url:
          type: string
          format: uri
        home:
          type: string
          format: uri
        gmt_offset:
          type:
          - integer
          - string
        timezone_string:
          type: string
        namespaces:
          type: array
          items:
            type: string
          description: The 11 registered namespaces at harvest time — oembed/1.0, wpe/cache-plugin/v1, wpe_sign_on_plugin/v1, contact-form-7/v1, redirection/v1, podcastplayer/v1, duplicate-post/v1, wp/v2, wp-site-health/v1, wp-block-editor/v1, wp-abilities/v1.
        authentication:
          type: object
          description: The supported authentication methods. This deployment advertises WordPress application passwords with an authorization endpoint at /wp-admin/authorize-application.php.
          additionalProperties: true
        routes:
          type: object
          description: The full route table keyed by route pattern.
          additionalProperties: true
        site_logo:
          type: integer
        site_icon:
          type: integer
        site_icon_url:
          type: string
        _links:
          $ref: '#/components/schemas/Links'
      required:
      - name
      - url
      - namespaces
      - routes
  responses:
    InvalidParam:
      description: One or more query parameters failed validation.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            perPageOutOfBounds:
              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)