ReCode Therapeutics Media API

The media library — images, PDFs, posters and decks attached to the site.

OpenAPI Specification

recode-therapeutics-media-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: ReCode Therapeutics Content Media API
  version: 1.0.0
  summary: The anonymously readable WordPress REST content API behind recodetx.com.
  description: 'ReCode Therapeutics runs no developer program and markets no product API. The only machine-readable contract reachable from the public internet without credentials is the WordPress REST API registered at https://recodetx.com/wp-json/, which the site publishes as a consequence of running WordPress on WP Engine behind Cloudflare.


    This document is DERIVED by the API Evangelist enrichment pipeline from the route index the site itself publishes at https://recodetx.com/wp-json/ (376 routes across 16 namespaces) and was verified against live anonymous responses on 2026-08-05. **Only operations that actually returned data without credentials are modelled here.** Everything write-side (POST/PUT/PATCH/ DELETE on every collection), and the administrative namespaces the site also registers (`aioseo/v1`, `elementor/v1`, `elementor-pro/v1`, `elementor-ai/v1`, `redirection/v1`, `wpe_sign_on_plugin/v1`, `wp-site-health/v1`, `wp-block-editor/v1`, `wp-abilities/v1`), return 401 `rest_forbidden` anonymously and are deliberately omitted rather than documented as capabilities.


    What the surface actually yields: 82 press releases and publications, 18 corporate pages, a 305-item media library, two site-specific custom post types registered into `wp/v2` (`events`, 50 items — conference and investor appearances; and `values`, 6 items — the company''s stated values), the category and tag taxonomies, the registered type/status/taxonomy metadata, cross-content search, and the oEmbed 1.0 provider endpoint. Unlike many corporate WordPress installs, `content.rendered` IS populated on posts and pages here (5.7 KB on the most recent press release, 53 KB on the home page), so the API returns real prose and not just identity metadata.


    Note on `/wp/v2/users`: the site leaves author enumeration open, and the collection returns 200 with 5 author records anonymously. The operation is documented here because it is genuinely part of the observed surface, but API Evangelist deliberately packages no agent skill and no MCP tool against it, and records no individual from it. See `x-personal-data` on that operation.'
  contact:
    name: ReCode Therapeutics
    url: https://recodetx.com/
  license:
    name: Not stated
    url: https://recodetx.com/terms-conditions/
  x-derived-from: https://recodetx.com/wp-json/
  x-verified: '2026-08-05'
  x-upstream-contract: https://developer.wordpress.org/rest-api/
servers:
- url: https://recodetx.com/wp-json
  description: Production WordPress REST API for recodetx.com (WP Engine, fronted by Cloudflare).
tags:
- name: media
  description: The media library — images, PDFs, posters and decks attached to the site.
paths:
  /wp/v2/media:
    get:
      operationId: listMedia
      tags:
      - media
      summary: List media library items
      description: 305 attachments at verification — logos, leadership headshots, conference posters and PDF decks. `source_url` is the direct file URL; `media_details.sizes` carries the generated image renditions.
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/order'
      - $ref: '#/components/parameters/fields'
      - name: media_type
        in: query
        description: Limit to a media type.
        schema:
          type: string
          enum:
          - image
          - video
          - text
          - application
          - audio
          - file
      - name: mime_type
        in: query
        description: Limit to a MIME type, e.g. `application/pdf`.
        schema:
          type: string
      responses:
        '200':
          description: A page of media items.
          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/MediaItem'
  /wp/v2/media/{id}:
    get:
      operationId: getMediaItem
      tags:
      - media
      summary: Get a single media item
      parameters:
      - $ref: '#/components/parameters/id'
      responses:
        '200':
          description: The media item.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaItem'
        '404':
          $ref: '#/components/responses/InvalidPostId'
components:
  schemas:
    RenderedText:
      type: object
      description: WordPress's rendered-text envelope.
      properties:
        rendered:
          type: string
          description: HTML as rendered by the site's filters.
        protected:
          type: boolean
      required:
      - rendered
    Links:
      type: object
      description: HAL-style link relations. `self`, `collection`, `about`, `author`, `replies`, `wp:featuredmedia`, `wp:attachment`, `wp:term`, and `curies` mapping the `wp:` prefix.
      additionalProperties: true
    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: A machine-readable WordPress error slug, e.g. `rest_forbidden`.
        message:
          type: string
        data:
          type: object
          properties:
            status:
              type: integer
            params:
              type: object
            details:
              type: object
      required:
      - code
      - message
    MediaItem:
      type: object
      description: A media-library attachment.
      properties:
        id:
          type: integer
        date:
          type: string
          format: date-time
        slug:
          type: string
        type:
          type: string
          enum:
          - attachment
        link:
          type: string
          format: uri
        title:
          $ref: '#/components/schemas/RenderedText'
        caption:
          $ref: '#/components/schemas/RenderedText'
        description:
          $ref: '#/components/schemas/RenderedText'
        alt_text:
          type: string
        media_type:
          type: string
          enum:
          - image
          - file
        mime_type:
          type: string
        filename:
          type: string
        filesize:
          type: integer
        source_url:
          type: string
          format: uri
          description: Direct URL to the stored file.
        media_details:
          type: object
          description: Dimensions plus the generated `sizes` renditions for images.
        post:
          type: integer
          nullable: true
          description: ID of the post or page this attachment is attached to.
        author:
          type: integer
        _links:
          $ref: '#/components/schemas/Links'
      required:
      - id
      - type
      - source_url
      - mime_type
  headers:
    LinkPagination:
      description: RFC 8288 Link header carrying `rel="next"` and `rel="prev"` page URLs.
      schema:
        type: string
    XWPTotal:
      description: Total number of items in the unpaged collection.
      schema:
        type: integer
    XWPTotalPages:
      description: Total number of pages available at the current per_page.
      schema:
        type: integer
  parameters:
    page:
      name: page
      in: query
      description: 1-based page of the collection to return.
      schema:
        type: integer
        minimum: 1
        default: 1
    id:
      name: id
      in: path
      required: true
      description: The object's unique numeric identifier.
      schema:
        type: integer
    perPage:
      name: per_page
      in: query
      description: Items per page. Maximum 100 — a request for 101 is rejected with 400 `rest_invalid_param` (verified 2026-08-05).
      schema:
        type: integer
        minimum: 1
        maximum: 100
        default: 10
    search:
      name: search
      in: query
      description: Limit results to those matching a string.
      schema:
        type: string
    order:
      name: order
      in: query
      schema:
        type: string
        enum:
        - asc
        - desc
        default: desc
    fields:
      name: _fields
      in: query
      description: Comma-separated sparse-fieldset projection, e.g. `_fields=id,slug,title`. Applies to every collection and item operation.
      schema:
        type: string
  responses:
    InvalidPostId:
      description: No object exists with that ID in this collection.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            code: rest_post_invalid_id
            message: Invalid post ID.
            data:
              status: 404