Emulate Content REST API

Anonymous, read-only REST surface behind emulatebio.com. Emulate runs WordPress and exposes the WordPress REST API publicly, with six first-party custom namespaces registered alongside the core wp/v2 namespace: emulate-in-the-news/v2 (newsroom), emulate-posts/v2 (blog), emulate-jobs/v2 (careers), emulate-forms/v2 (gated content forms), emulate-resources/v2 (resource library with application, organ-models, product and resource_type taxonomies) and emulate-support/v2 (Organ-Chip protocols, user guides and data-analysis tooling). No authentication is required and no API keys, rate-limit headers or developer documentation are published for it. This is a content and marketing API, not an instrument or Organ-Chip data API.

OpenAPI Specification

emulate-content-api-openapi.yml Raw ↑
openapi: 3.1.0
x-provenance:
  generated: '2026-08-01'
  method: derived
  source: https://emulatebio.com/wp-json/
  note: >-
    Derived by API Evangelist from the live, anonymous WordPress REST API route index
    published at https://emulatebio.com/wp-json/ on 2026-08-01, and from an observed
    HTTP GET of every path below. Emulate, Inc. does not publish an OpenAPI description;
    this document describes only routes and response shapes that were actually observed
    on the wire. Paths, methods and response structures are recorded verbatim from
    those responses. Nothing here is invented — where a shape was not observable it is
    left unconstrained rather than guessed.
info:
  title: Emulate Content REST API (derived)
  version: '2'
  summary: >-
    Anonymous read-only REST surface behind emulatebio.com, exposing Emulate's news,
    blog posts, marketing forms, resource library and Organ-Chip support/protocol
    content as JSON.
  description: |
    Emulate, Inc. runs emulatebio.com on WordPress and exposes the WordPress REST API
    publicly at `https://emulatebio.com/wp-json/`. Alongside the stock `wp/v2` core
    namespace, Emulate has registered six **first-party custom namespaces** that back
    the site's own content sections:

    | Namespace | Surface |
    |---|---|
    | `emulate-in-the-news/v2` | Newsroom / press coverage index |
    | `emulate-posts/v2` | Blog posts |
    | `emulate-jobs/v2` | Careers / job listings |
    | `emulate-forms/v2` | Gated webinar / resource request forms |
    | `emulate-resources/v2` | Resource library (posters, app notes, webinars) with taxonomies |
    | `emulate-support/v2` | Support protocols, user guides and data-analysis tooling |

    These endpoints require **no authentication** and returned real JSON payloads when
    probed. This is a content/marketing API, not a laboratory-instrument or Organ-Chip
    data API — Emulate publishes no developer portal, no API reference and no SDKs, and
    the desktop analysis applications listed at https://emulatebio.com/products/software/
    are downloadable tools rather than API clients.

    Responses are raw WordPress `WP_Post` records (`ID`, `post_title`, `post_content`,
    `post_date`, `guid`, `post_type`, …) plus per-namespace extras, so field names follow
    WordPress internals rather than a designed public contract.
  contact:
    name: Emulate, Inc.
    url: https://emulatebio.com/contact/
  x-derived-by:
    organization: API Evangelist
    url: https://apievangelist.com
servers:
- url: https://emulatebio.com/wp-json
  description: Production WordPress REST API root for emulatebio.com
tags:
- name: News
  description: Press coverage and newsroom items.
- name: Posts
  description: Emulate blog posts.
- name: Jobs
  description: Careers / job listings.
- name: Forms
  description: Gated content request forms.
- name: Resources
  description: Resource library items and their taxonomies.
- name: Support
  description: Organ-Chip protocols, user guides and data-analysis content.
- name: Discovery
  description: WordPress REST API discovery documents.
paths:
  /:
    get:
      operationId: getApiIndex
      tags: [Discovery]
      summary: Get the WordPress REST API route index
      description: >-
        Returns the site index document listing every registered namespace and route,
        including the six first-party `emulate-*` namespaces.
      responses:
        '200':
          description: Route index document.
          content:
            application/json:
              schema:
                type: object
                properties:
                  name: {type: string}
                  description: {type: string}
                  url: {type: string, format: uri}
                  home: {type: string, format: uri}
                  namespaces:
                    type: array
                    items: {type: string}
                  routes: {type: object}
      x-evidence:
        url: https://emulatebio.com/wp-json/
        fetched: '2026-08-01'
        http_status: 200
  /emulate-in-the-news/v2/news:
    get:
      operationId: listNews
      tags: [News]
      summary: List newsroom / press coverage items
      description: >-
        Returns a two-element array: the first element carries `posts` (the newsroom
        items), the second carries the `news_category` taxonomy used to filter them.
      responses:
        '200':
          description: Newsroom collection plus its category taxonomy.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostsAndTaxonomies'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-in-the-news/v2/news
        fetched: '2026-08-01'
        http_status: 200
        observed_items: 114
  /emulate-posts/v2/posts:
    get:
      operationId: listPosts
      tags: [Posts]
      summary: List Emulate blog posts
      description: >-
        Returns a flat array of blog post records. Each record adds `media_url`,
        `landscape_url`, `img_id`, `link`, `display_date` and `cats` to the standard
        WordPress post fields.
      responses:
        '200':
          description: Blog post collection.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/BlogPost'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-posts/v2/posts
        fetched: '2026-08-01'
        http_status: 200
        observed_items: 62
  /emulate-jobs/v2/jobs:
    get:
      operationId: listJobs
      tags: [Jobs]
      summary: List job listings
      description: >-
        Careers listing endpoint. When probed anonymously with no arguments it answered
        HTTP 200 with an in-body error envelope (`{"status":404,"error":"Job not found"}`),
        so the selector this route expects is not publicly documented. The route index
        declares no arguments.
      responses:
        '200':
          description: >-
            Job listing collection, or an in-body error envelope when no listing matches.
          content:
            application/json:
              schema:
                oneOf:
                - type: array
                  items: {type: object}
                - $ref: '#/components/schemas/InBodyError'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-jobs/v2/jobs
        fetched: '2026-08-01'
        http_status: 200
        observed_body: '{"status":404,"error":"Job not found"}'
  /emulate-forms/v2/forms:
    get:
      operationId: listForms
      tags: [Forms]
      summary: List gated content request forms
      description: >-
        Returns the marketing forms that front gated assets (webinars, app notes),
        each with `form_title`, `form_type`, `form_id`, `form_submit`, `form_html`
        and `form_desc` alongside the WordPress post fields.
      responses:
        '200':
          description: Form collection.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Form'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-forms/v2/forms
        fetched: '2026-08-01'
        http_status: 200
        observed_items: 258
  /emulate-resources/v2/resources:
    get:
      operationId: listResources
      tags: [Resources]
      summary: List resource-library items with their taxonomies
      description: >-
        Returns a two-element array: the first element carries `posts` (resource-library
        items), the second carries the taxonomies used to facet them — `application`,
        `organ-models`, `product` and `resource_type`.
      responses:
        '200':
          description: Resource collection plus its four taxonomies.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostsAndTaxonomies'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-resources/v2/resources
        fetched: '2026-08-01'
        http_status: 200
        observed_items: 299
        observed_taxonomies: [application, organ-models, product, resource_type]
  /emulate-support/v2/support:
    get:
      operationId: listSupportContent
      tags: [Support]
      summary: List Organ-Chip support protocols and user guides
      description: >-
        Returns a two-element array: the first element carries `posts` (support
        protocols and user guides), the second carries the `models` and `protocols`
        taxonomies.
      responses:
        '200':
          description: Support collection plus its taxonomies.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PostsAndTaxonomies'
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-support/v2/support
        fetched: '2026-08-01'
        http_status: 200
        observed_items: 26
        observed_taxonomies: [models, protocols]
  /emulate-support/v2/data-analysis:
    get:
      operationId: listDataAnalysisTools
      tags: [Support]
      summary: List data-analysis tool entries
      description: >-
        Backs the data-analysis tooling listing under Support. When probed anonymously
        it answered HTTP 200 with an empty body, so no response shape is asserted here.
      responses:
        '200':
          description: >-
            Data-analysis tool collection. Observed as an empty body on an anonymous
            probe; the shape is not asserted.
      x-evidence:
        url: https://emulatebio.com/wp-json/emulate-support/v2/data-analysis
        fetched: '2026-08-01'
        http_status: 200
        observed_body_bytes: 0
components:
  schemas:
    WordPressPost:
      type: object
      description: >-
        A raw WordPress `WP_Post` record as returned by the Emulate namespaces. Field
        names are WordPress internals, not a designed public contract.
      properties:
        ID: {type: integer}
        post_author: {type: string}
        post_date: {type: string}
        post_date_gmt: {type: string}
        post_content: {type: string}
        post_title: {type: string}
        post_excerpt: {type: string}
        post_status: {type: string}
        comment_status: {type: string}
        ping_status: {type: string}
        post_password: {type: string}
        post_name: {type: string}
        post_modified: {type: string}
        post_modified_gmt: {type: string}
        post_parent: {type: integer}
        guid: {type: string}
        menu_order: {type: integer}
        post_type: {type: string}
        post_mime_type: {type: string}
        comment_count: {type: string}
        filter: {type: string}
    BlogPost:
      allOf:
      - $ref: '#/components/schemas/WordPressPost'
      - type: object
        properties:
          media_url: {type: string}
          landscape_url: {type: string}
          img_id: {type: [integer, string]}
          link: {type: string, format: uri}
          display_date: {type: string}
          cats: {}
    Form:
      allOf:
      - $ref: '#/components/schemas/WordPressPost'
      - type: object
        properties:
          form_title: {type: string}
          form_type: {type: string}
          form_id: {type: [integer, string]}
          form_submit: {type: string}
          form_html: {type: string}
          form_desc: {type: string}
    PostsAndTaxonomies:
      type: array
      description: >-
        Two-element envelope used by the news, resources and support routes. Element 0
        is `{ "posts": [...] }`; element 1 is an object of taxonomy name to term map.
      items:
        oneOf:
        - type: object
          properties:
            posts:
              type: array
              items:
                allOf:
                - $ref: '#/components/schemas/WordPressPost'
                - type: object
                  properties:
                    media_url: {type: string}
                    post_link: {type: string, format: uri}
        - type: object
          additionalProperties:
            type: object
    InBodyError:
      type: object
      description: >-
        Error envelope observed on `/emulate-jobs/v2/jobs`. Note the HTTP status stays
        200 and the real status is carried in the body — not RFC 9457 Problem Details.
      properties:
        status: {type: integer}
        error: {type: string}