openapi: 3.2.0
info:
title: Bluejay Therapeutics Content Media API
version: '1.0'
x-generated: '2026-08-07'
x-method: derived
x-source: https://bluejaytx.com/wp-json/
description: 'The anonymously readable WordPress REST API behind bluejaytx.com, the corporate site of Bluejay Therapeutics — a Redwood City, California clinical-stage biopharmaceutical company developing brelovitug (BJT-778) and a hepatitis B/D portfolio, acquired by Mirum Pharmaceuticals on 26 January 2026.
This is not a developer product Bluejay Therapeutics markets. It is the site''s own WordPress content surface, registered at /wp-json/ and verified to return data without credentials on 2026-08-07. This document is DERIVED by the API Evangelist enrichment pipeline from the route index the site itself publishes at https://bluejaytx.com/wp-json/ — 372 routes across 17 namespaces (oembed/1.0, wpe/cache-plugin/v1, wpe_sign_on_plugin/v1, aioseo/v1, code-snippets/v1, contact-form-7/v1, jupiterx-license, elementor/v1, monsterinsights/v1, elementor/v1/documents, elementor-ai/v1, elementor-pro/v1, omapp/v1, wp/v2, wp-site-health/v1, wp-block-editor/v1, wp-abilities/v1). Only the 26 operations that were individually called and returned data anonymously are modelled here; every other route returned 401, 403 or 404 and is deliberately absent.
WHAT A CONSUMER MUST KNOW. First, the human web site no longer exists. Following the acquisition the page tree was collapsed to a SINGLE page (id 606, "New home page", served at the site root) carrying a two-sentence acquisition notice that redirects readers to mirumpharma.com; /about/, /science/, /pipeline/, /news/, /contact/ and /privacy-policy/ all return 404. The machine-readable surface, however, survived the teardown intact: the REST API still serves all 35 press releases and publication notices from 2021-08-12 through 2025-12-08 with FULL `content.rendered` bodies (up to ~15 KB of press-release prose each), plus the 99-item media library. For this company the API is now a strictly richer record of the corporate history than the web site it belongs to.
Second, the content is Elementor-authored, so `content.rendered` on newer posts is wrapped in `div[data-elementor-type]` scaffolding around the prose; older posts render as clean `wp-block-*` markup. Third, the `pages` collection holds exactly one item and the `portfolio`, `portfolio_category`, `portfolio_tag`, `blocks` and `navigation` collections are registered but return empty arrays — they are modelled here because they answer 200 anonymously, not because they carry data.
OMITTED ON PURPOSE. `/wp/v2/users` returns 200 anonymously with five named individuals (site administrator plus outside investor-relations and communications agency staff). Under the API Evangelist enrichment PII guardrail that collection is documented as an exposure but is NOT modelled as an operation here, and no agent skill or MCP tool is emitted for it. The exposure itself is recorded in conventions/bluejay-therapeutics-conventions.yml. The site also registers the WordPress Abilities API (`wp-abilities/v1`), an agent-facing capability registry, but every endpoint under it returns 401 rest_forbidden anonymously, so no agent surface is claimed.'
contact:
name: API Evangelist
email: kin@apievangelist.com
url: https://apievangelist.com
x-upstream-contract: https://developer.wordpress.org/rest-api/
servers:
- url: https://bluejaytx.com/wp-json
description: Production WordPress REST API for bluejaytx.com (WP Engine, nginx)
tags:
- name: media
description: The site media library.
paths:
/wp/v2/media:
get:
operationId: listMedia
tags:
- media
summary: List media library items
description: Returns the 99-item media library — press-release PDFs, poster and presentation decks, logos, Elementor screenshots and site imagery. Each item carries `source_url` and, for images, the generated size variants under `media_details.sizes`.
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/Exclude'
- $ref: '#/components/parameters/Include'
- $ref: '#/components/parameters/Offset'
- $ref: '#/components/parameters/Order'
- $ref: '#/components/parameters/OrderByPost'
- $ref: '#/components/parameters/SlugFilter'
- $ref: '#/components/parameters/Fields'
- name: media_type
in: query
description: Limit to a media type.
schema:
type: string
enum:
- image
- video
- text
- application
- audio
- name: mime_type
in: query
description: Limit to a specific MIME type, e.g. `application/pdf`.
schema:
type: string
responses:
'200':
description: A page of media items.
headers:
X-WP-Total:
schema:
type: integer
X-WP-TotalPages:
schema:
type: integer
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/MediaItem'
/wp/v2/media/{id}:
get:
operationId: getMediaItem
tags:
- media
summary: Get a single media item
parameters:
- $ref: '#/components/parameters/IdPath'
- $ref: '#/components/parameters/Context'
responses:
'200':
description: The media item.
content:
application/json:
schema:
$ref: '#/components/schemas/MediaItem'
'404':
$ref: '#/components/responses/NotFound'
components:
schemas:
RenderedText:
type: object
properties:
rendered:
type: string
protected:
type: boolean
HalLinks:
type: object
description: HAL-style hypermedia block. Carries `self`, `collection`, `about`, `author`, `wp:featuredmedia`, `wp:attachment`, `wp:term`, `curies` and — on collection responses — `next`/`prev` page links. This is how the API is meant to be traversed.
additionalProperties: true
MediaItem:
type: object
properties:
id:
type: integer
date:
type: string
format: date-time
slug:
type: string
type:
type: string
description: Always `attachment`.
link:
type: string
format: uri
title:
$ref: '#/components/schemas/RenderedText'
author:
type: integer
caption:
$ref: '#/components/schemas/RenderedText'
alt_text:
type: string
media_type:
type: string
enum:
- image
- file
mime_type:
type: string
source_url:
type: string
format: uri
description: Direct URL to the original uploaded file — the fetchable asset.
post:
type: integer
description: Id of the post this file was uploaded to
if any.: null
media_details:
type: object
description: Width/height/filesize plus generated `sizes` variants for images.
_links:
$ref: '#/components/schemas/HalLinks'
Error:
type: object
description: The WordPress REST error envelope. NOT RFC 9457 — the media type is application/json, not application/problem+json, and the field names are WordPress-specific.
properties:
code:
type: string
description: Machine-readable error slug, e.g. `rest_post_invalid_id`, `rest_forbidden`.
message:
type: string
description: Human-readable message.
data:
type: object
properties:
status:
type: integer
description: The HTTP status code, repeated inside the body.
params:
type: object
description: Present on validation errors; maps parameter name to the failure reason.
required:
- code
- message
parameters:
Search:
name: search
in: query
description: Limit results to those matching a string.
schema:
type: string
Fields:
name: _fields
in: query
description: Comma-separated list of fields to return, e.g. `id,slug,title,link`. Not declared in the route index but honoured globally by the WordPress REST controller; strongly recommended because full post bodies run to ~15 KB each.
schema:
type: string
Include:
name: include
in: query
description: Limit result set to specific ids.
schema:
type: array
items:
type: integer
Before:
name: before
in: query
description: Limit to items published before a given ISO 8601 compliant date.
schema:
type: string
format: date-time
Order:
name: order
in: query
description: Order sort attribute ascending or descending.
schema:
type: string
enum:
- asc
- desc
Exclude:
name: exclude
in: query
description: Ensure result set excludes specific ids.
schema:
type: array
items:
type: integer
Offset:
name: offset
in: query
description: Offset the result set by a specific number of items.
schema:
type: integer
minimum: 0
OrderByPost:
name: orderby
in: query
description: Sort collection by object attribute.
schema:
type: string
enum:
- author
- date
- id
- include
- modified
- parent
- relevance
- slug
default: date
PerPage:
name: per_page
in: query
description: Maximum number of items to be returned in the result set.
schema:
type: integer
default: 10
minimum: 1
maximum: 100
Context:
name: context
in: query
description: Scope under which the request is made; determines which fields are present in the response. `edit` requires authentication.
schema:
type: string
enum:
- view
- embed
- edit
default: view
Page:
name: page
in: query
description: Current page of the collection.
schema:
type: integer
default: 1
minimum: 1
After:
name: after
in: query
description: Limit to items published after a given ISO 8601 compliant date.
schema:
type: string
format: date-time
SlugFilter:
name: slug
in: query
description: Limit result set to items with one or more specific slugs.
schema:
type: array
items:
type: string
IdPath:
name: id
in: path
required: true
description: Unique identifier for the object.
schema:
type: integer
responses:
NotFound:
description: No object matched the identifier.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'