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}