Arbor Biotechnologies Content API (WordPress REST)

Read-only, anonymously accessible WordPress REST API served by the Arbor Biotechnologies corporate site at https://arbor.bio/wp-json. It exposes the company's press releases and announcements (59 posts, 2018-2026), the 11 static site pages covering the pipeline, platform, leadership and clinical program, 11 categories, the media library, cross-content search, oEmbed and Yoast SEO / schema.org metadata. This is an incidental content management surface, not a first-party API product: Arbor publishes no developer documentation, issues no keys, offers no SDKs or support channel for it, and every write, user, settings, plugin, theme and site-health route returns 401 to anonymous callers while comments return 403.

Documentation

Specifications

Other Resources

OpenAPI Specification

arbor-biotechnologies-content-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Arbor Biotechnologies Content API (WordPress REST)
  version: '1.0.0'
  summary: Read-only, anonymously accessible content API served by the Arbor Biotechnologies corporate site.
  description: >-
    Arbor Biotechnologies publishes no product or developer API. This document was DERIVED by
    API Evangelist from the live WordPress REST route index at https://arbor.bio/wp-json
    (18 namespaces, 341 declared routes) on 2026-07-31, and reduced to only those operations
    that were individually probed WITHOUT credentials and observed returning HTTP 200.


    It is an incidental content-management surface, not a supported API product: Arbor issues
    no keys, publishes no developer documentation, offers no support channel for it, and its
    terms of use do not mention API access. Every write, administrative and site-configuration
    route declared in the route index is excluded here because anonymous callers receive 401
    (`rest_forbidden`, `rest_cannot_view_plugins`, `rest_cannot_view_themes`,
    `rest_user_cannot_view`) or 403 (`rest_comment_disabled`).


    Observed collection sizes on 2026-07-31: 59 posts (press releases, 2018-2026), 11 pages,
    11 categories, 0 tags, 394 media items reported by X-WP-Total of which 4 are returned to
    anonymous callers, 60 searchable objects, 1 contact form.
  contact:
    name: Arbor Biotechnologies
    url: https://arbor.bio/get-in-touch/
  license:
    name: Proprietary — see Arbor Biotechnologies Terms of Use
    url: https://arbor.bio/terms-of-use/
  x-derived-by: API Evangelist enrichment pipeline
  x-derived-from: https://arbor.bio/wp-json
  x-derived-on: '2026-07-31'
  x-provider-published: false
  x-api-posture: incidental-cms-surface
servers:
- url: https://arbor.bio/wp-json
  description: Production WordPress REST API on the Arbor Biotechnologies corporate site.
externalDocs:
  description: WordPress REST API handbook — the upstream reference for these routes and parameters.
  url: https://developer.wordpress.org/rest-api/reference/
tags:
- name: posts
  description: Press releases and company announcements.
- name: pages
  description: Static site pages — pipeline, what we do, who we are, clinical trial, policies.
- name: media
  description: The media library.
- name: taxonomies
  description: Categories and tags applied to posts, plus taxonomy metadata.
- name: metadata
  description: Registered post types, taxonomies and statuses.
- name: search
  description: Cross-content search.
- name: forms
  description: Contact Form 7 form definitions.
- name: embed
  description: oEmbed and SEO head metadata.
paths:
  /wp/v2/posts:
    get:
      operationId: listPosts
      summary: List press releases
      description: >-
        List published posts — Arbor's press releases and company announcements. 59 items
        observed on 2026-07-31, spanning 2018 to 2026. Paginated; total count and page count
        are returned in the X-WP-Total and X-WP-TotalPages headers.
      tags: [posts]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/after'
      - $ref: '#/components/parameters/before'
      - $ref: '#/components/parameters/order'
      - $ref: '#/components/parameters/orderbyPost'
      - $ref: '#/components/parameters/slug'
      - $ref: '#/components/parameters/fields'
      - $ref: '#/components/parameters/embed'
      - name: categories
        in: query
        description: Limit to posts assigned to these category ids.
        schema: {type: array, items: {type: integer}}
        style: form
        explode: false
      responses:
        '200':
          description: A page of posts.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
            X-WP-TotalPages: {$ref: '#/components/headers/XWPTotalPages'}
            Link: {$ref: '#/components/headers/Link'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Post'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/posts/{id}:
    get:
      operationId: getPost
      summary: Get a press release
      description: Retrieve a single published post by its integer id.
      tags: [posts]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      - $ref: '#/components/parameters/embed'
      responses:
        '200':
          description: The post.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Post'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/pages:
    get:
      operationId: listPages
      summary: List site pages
      description: >-
        List published pages. 11 observed on 2026-07-31 — clinical-trial, pipeline,
        what-we-do, who-we-are, inside-arbor, stay-updated, get-in-touch, site-map,
        privacy-policy, terms-of-use and the home page.
      tags: [pages]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/order'
      - $ref: '#/components/parameters/slug'
      - $ref: '#/components/parameters/fields'
      - $ref: '#/components/parameters/embed'
      - name: parent
        in: query
        description: Limit to children of these page ids.
        schema: {type: array, items: {type: integer}}
        style: form
        explode: false
      responses:
        '200':
          description: A page of pages.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
            X-WP-TotalPages: {$ref: '#/components/headers/XWPTotalPages'}
            Link: {$ref: '#/components/headers/Link'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Page'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/pages/{id}:
    get:
      operationId: getPage
      summary: Get a site page
      description: Retrieve a single published page by its integer id.
      tags: [pages]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      - $ref: '#/components/parameters/embed'
      responses:
        '200':
          description: The page.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Page'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/media:
    get:
      operationId: listMedia
      summary: List media items
      description: >-
        List media library items. X-WP-Total reported 394 on 2026-07-31, but anonymous
        callers were returned only 4 items — the site restricts most of the library to
        authenticated users, so the header count and the visible body disagree by design.
      tags: [media]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $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]}
      responses:
        '200':
          description: A page of media items.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
            X-WP-TotalPages: {$ref: '#/components/headers/XWPTotalPages'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Media'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/media/{id}:
    get:
      operationId: getMedia
      summary: Get a media item
      description: Retrieve a single media item by its integer id.
      tags: [media]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: The media item.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Media'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /wp/v2/categories:
    get:
      operationId: listCategories
      summary: List categories
      description: >-
        List post categories. 11 observed on 2026-07-31 — a `press-release` category with 57
        posts plus per-year archive categories 2018 through 2026.
      tags: [taxonomies]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/slug'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A page of categories.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
            X-WP-TotalPages: {$ref: '#/components/headers/XWPTotalPages'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Term'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/categories/{id}:
    get:
      operationId: getCategory
      summary: Get a category
      tags: [taxonomies]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: The category.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Term'}
        '404': {$ref: '#/components/responses/InvalidTermId'}
  /wp/v2/tags:
    get:
      operationId: listTags
      summary: List tags
      description: >-
        List post tags. The `post_tag` taxonomy is registered and the route is public, but the
        collection was empty (X-WP-Total 0) on 2026-07-31 — this site classifies with
        categories only.
      tags: [taxonomies]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/search'
      - $ref: '#/components/parameters/slug'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A page of tags. Empty on this site.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/Term'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/tags/{id}:
    get:
      operationId: getTag
      summary: Get a tag
      description: >-
        Declared public in the live route index. Not exercised against real data because the
        tag collection is empty on this site.
      tags: [taxonomies]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: The tag.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Term'}
        '404': {$ref: '#/components/responses/InvalidTermId'}
  /wp/v2/types:
    get:
      operationId: listTypes
      summary: List registered post types
      description: >-
        The registered post types and their REST base paths. 15 observed, of which only
        `post`, `page`, `attachment` and `wpcf7_contact_form` are anonymously readable.
      tags: [metadata]
      responses:
        '200':
          description: A map of post type name to definition.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {$ref: '#/components/schemas/PostType'}
  /wp/v2/types/{type}:
    get:
      operationId: getType
      summary: Get one registered post type
      tags: [metadata]
      parameters:
      - name: type
        in: path
        required: true
        description: The post type slug, e.g. `post` or `page`.
        schema: {type: string}
      responses:
        '200':
          description: The post type definition.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/PostType'}
        '404': {$ref: '#/components/responses/NotFound'}
  /wp/v2/taxonomies:
    get:
      operationId: listTaxonomies
      summary: List registered taxonomies
      description: The registered taxonomies and the post types they apply to.
      tags: [metadata]
      responses:
        '200':
          description: A map of taxonomy name to definition.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {$ref: '#/components/schemas/Taxonomy'}
  /wp/v2/taxonomies/{taxonomy}:
    get:
      operationId: getTaxonomy
      summary: Get one registered taxonomy
      tags: [metadata]
      parameters:
      - name: taxonomy
        in: path
        required: true
        description: The taxonomy slug, e.g. `category` or `post_tag`.
        schema: {type: string}
      responses:
        '200':
          description: The taxonomy definition.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Taxonomy'}
        '404': {$ref: '#/components/responses/NotFound'}
  /wp/v2/statuses:
    get:
      operationId: listStatuses
      summary: List registered post statuses
      tags: [metadata]
      responses:
        '200':
          description: A map of status name to definition. Only `publish` is exposed anonymously.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {$ref: '#/components/schemas/Status'}
  /wp/v2/statuses/{status}:
    get:
      operationId: getStatus
      summary: Get one registered post status
      tags: [metadata]
      parameters:
      - name: status
        in: path
        required: true
        description: The status slug, e.g. `publish`.
        schema: {type: string}
      responses:
        '200':
          description: The status definition.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Status'}
        '404': {$ref: '#/components/responses/NotFound'}
  /wp/v2/search:
    get:
      operationId: searchContent
      summary: Search across all public content
      description: >-
        Cross-content-type search returning lightweight hits (id, title, url, type, subtype)
        with an embeddable `_links.self` pointing at the full object. 60 objects were
        searchable on 2026-07-31. This is the cheapest way to find a press release by keyword
        before fetching it in full.
      tags: [search]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - name: search
        in: query
        description: The search term.
        schema: {type: string}
      - name: type
        in: query
        description: Limit results to an object type.
        schema: {type: string, enum: [post, term, 'post-format']}
      - name: subtype
        in: query
        description: Limit results to a subtype, e.g. `post` or `page`.
        schema: {type: string}
      - $ref: '#/components/parameters/embed'
      responses:
        '200':
          description: A page of search hits.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
            X-WP-TotalPages: {$ref: '#/components/headers/XWPTotalPages'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/SearchResult'}
        '400': {$ref: '#/components/responses/InvalidParam'}
  /wp/v2/wpcf7_contact_form:
    get:
      operationId: listContactForms
      summary: List contact form definitions
      description: >-
        Contact Form 7 form objects. 1 form observed on 2026-07-31, backing the
        /get-in-touch/ page. Read-only metadata; this route does not submit a form.
      tags: [forms]
      parameters:
      - $ref: '#/components/parameters/page'
      - $ref: '#/components/parameters/perPage'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: A page of contact form objects.
          headers:
            X-WP-Total: {$ref: '#/components/headers/XWPTotal'}
          content:
            application/json:
              schema:
                type: array
                items: {$ref: '#/components/schemas/ContactForm'}
  /wp/v2/wpcf7_contact_form/{id}:
    get:
      operationId: getContactForm
      summary: Get a contact form definition
      tags: [forms]
      parameters:
      - $ref: '#/components/parameters/idPath'
      - $ref: '#/components/parameters/fields'
      responses:
        '200':
          description: The contact form object.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/ContactForm'}
        '404': {$ref: '#/components/responses/InvalidPostId'}
  /oembed/1.0/embed:
    get:
      operationId: getOembed
      summary: Get oEmbed data for an Arbor URL
      description: >-
        oEmbed 1.0 discovery for any arbor.bio URL — returns provider name, title, author,
        thumbnail and an embeddable HTML blockquote.
      tags: [embed]
      parameters:
      - name: url
        in: query
        required: true
        description: The arbor.bio URL to describe.
        schema: {type: string, format: uri}
      - name: format
        in: query
        description: Response format.
        schema: {type: string, enum: [json, xml], default: json}
      - name: maxwidth
        in: query
        schema: {type: integer, default: 600}
      responses:
        '200':
          description: The oEmbed document.
          content:
            application/json:
              schema: {$ref: '#/components/schemas/Oembed'}
        '404': {$ref: '#/components/responses/NotFound'}
  /yoast/v1/get_head:
    get:
      operationId: getYoastHead
      summary: Get SEO head metadata for a URL
      description: >-
        Yoast SEO plugin route returning the rendered `<head>` SEO block (Open Graph, Twitter
        card, schema.org JSON-LD) for any arbor.bio URL. Useful for extracting structured
        Organization / Article metadata without scraping the page.
      tags: [embed]
      parameters:
      - name: url
        in: query
        required: true
        description: The arbor.bio URL to describe.
        schema: {type: string, format: uri}
      responses:
        '200':
          description: An object with an `html` string containing the SEO head block.
          content:
            application/json:
              schema:
                type: object
                properties:
                  html: {type: string}
                  json: {type: object}
        '404': {$ref: '#/components/responses/NotFound'}
components:
  parameters:
    page:
      name: page
      in: query
      description: 1-based page number.
      schema: {type: integer, minimum: 1, default: 1}
    perPage:
      name: per_page
      in: query
      description: Items per page. The server rejects values outside 1-100 with HTTP 400.
      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}
    slug:
      name: slug
      in: query
      description: Limit results to one or more slugs.
      schema: {type: array, items: {type: string}}
      style: form
      explode: false
    after:
      name: after
      in: query
      description: Limit to items published after an ISO 8601 date.
      schema: {type: string, format: date-time}
    before:
      name: before
      in: query
      description: Limit to items published before an ISO 8601 date.
      schema: {type: string, format: date-time}
    order:
      name: order
      in: query
      schema: {type: string, enum: [asc, desc], default: desc}
    orderbyPost:
      name: orderby
      in: query
      schema:
        type: string
        enum: [author, date, id, include, modified, parent, relevance, slug, title]
        default: date
    fields:
      name: _fields
      in: query
      description: >-
        Comma-separated allowlist of response fields. Strongly recommended — a full post
        object carries rendered HTML content plus a `yoast_head` block and is large.
      schema: {type: string}
      example: id,date,slug,link,title
    embed:
      name: _embed
      in: query
      description: >-
        Inline linked resources (author, featured media, terms) under `_embedded`, resolving
        relationships in one round trip.
      schema: {type: boolean}
    idPath:
      name: id
      in: path
      required: true
      description: Integer object id.
      schema: {type: integer}
  headers:
    XWPTotal:
      description: Total number of items in the collection, before pagination.
      schema: {type: integer}
    XWPTotalPages:
      description: Total number of pages available at the current per_page.
      schema: {type: integer}
    Link:
      description: RFC 8288 pagination links (rel=next, rel=prev).
      schema: {type: string}
  responses:
    InvalidParam:
      description: A query parameter failed validation.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            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)
    InvalidPostId:
      description: No object exists with that id, or it is not publicly readable.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            code: rest_post_invalid_id
            message: Invalid post ID.
            data: {status: 404}
    InvalidTermId:
      description: No term exists with that id.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            code: rest_term_invalid
            message: Term does not exist.
            data: {status: 404}
    NotFound:
      description: No route or resource matched.
      content:
        application/json:
          schema: {$ref: '#/components/schemas/Error'}
          example:
            code: rest_no_route
            message: 'No route was found matching the URL and request method.'
            data: {status: 404}
  schemas:
    RenderedText:
      type: object
      description: WordPress renders text fields into an object with a `rendered` HTML string.
      properties:
        rendered: {type: string}
    Post:
      type: object
      description: A published press release or company announcement.
      properties:
        id: {type: integer}
        date: {type: string, format: date-time, description: Publication date in site local time.}
        date_gmt: {type: string, format: date-time}
        modified: {type: string, format: date-time}
        modified_gmt: {type: string, format: date-time}
        guid: {$ref: '#/components/schemas/RenderedText'}
        slug: {type: string}
        status: {type: string, enum: [publish]}
        type: {type: string, const: post}
        link: {type: string, format: uri}
        title: {$ref: '#/components/schemas/RenderedText'}
        content: {$ref: '#/components/schemas/RenderedText'}
        excerpt: {$ref: '#/components/schemas/RenderedText'}
        author: {type: integer, description: Author user id. The users collection itself is 401 to anonymous callers.}
        featured_media: {type: integer, description: Media id, 0 when none.}
        categories: {type: array, items: {type: integer}}
        tags: {type: array, items: {type: integer}}
        sticky: {type: boolean}
        format: {type: string}
        template: {type: string}
        comment_status: {type: string}
        ping_status: {type: string}
        meta: {type: object}
        acf: {description: Advanced Custom Fields payload. Present but empty on this site., type: [object, array]}
        class_list: {type: array, items: {type: string}}
        yoast_head: {type: string, description: Rendered SEO head block.}
        yoast_head_json: {type: object, description: Structured SEO metadata including schema.org graph.}
        _links: {$ref: '#/components/schemas/Links'}
    Page:
      type: object
      description: A static site page.
      properties:
        id: {type: integer}
        date: {type: string, format: date-time}
        modified: {type: string, format: date-time}
        slug: {type: string}
        status: {type: string, enum: [publish]}
        type: {type: string, const: page}
        link: {type: string, format: uri}
        title: {$ref: '#/components/schemas/RenderedText'}
        content: {$ref: '#/components/schemas/RenderedText'}
        excerpt: {$ref: '#/components/schemas/RenderedText'}
        author: {type: integer}
        featured_media: {type: integer}
        parent: {type: integer, description: Parent page id, 0 for top level. All 11 pages are top level on this site.}
        menu_order: {type: integer}
        template: {type: string}
        meta: {type: object}
        acf: {type: [object, array]}
        yoast_head: {type: string}
        yoast_head_json: {type: object}
        _links: {$ref: '#/components/schemas/Links'}
    Media:
      type: object
      description: A media library item.
      properties:
        id: {type: integer}
        date: {type: string, format: date-time}
        slug: {type: string}
        type: {type: string, const: attachment}
        link: {type: string, format: uri}
        title: {$ref: '#/components/schemas/RenderedText'}
        author: {type: integer}
        media_type: {type: string, enum: [image, file]}
        mime_type: {type: string}
        source_url: {type: string, format: uri, description: Direct URL to the original file.}
        alt_text: {type: string}
        caption: {$ref: '#/components/schemas/RenderedText'}
        media_details: {type: object, description: Width, height and the generated size variants.}
        post: {type: [integer, 'null'], description: The object this file was uploaded to.}
        _links: {$ref: '#/components/schemas/Links'}
    Term:
      type: object
      description: A taxonomy term — a category or tag.
      properties:
        id: {type: integer}
        count: {type: integer, description: Number of posts assigned to this term.}
        description: {type: string}
        link: {type: string, format: uri}
        name: {type: string}
        slug: {type: string}
        taxonomy: {type: string, enum: [category, post_tag]}
        parent: {type: integer, description: Parent term id. Categories are hierarchical; tags are not.}
        meta: {type: object}
        _links: {$ref: '#/components/schemas/Links'}
    PostType:
      type: object
      properties:
        name: {type: string}
        slug: {type: string}
        description: {type: string}
        hierarchical: {type: boolean}
        has_archive: {type: [boolean, string]}
        rest_base: {type: string}
        rest_namespace: {type: string}
        taxonomies: {type: array, items: {type: string}}
        _links: {$ref: '#/components/schemas/Links'}
    Taxonomy:
      type: object
      properties:
        name: {type: string}
        slug: {type: string}
        description: {type: string}
        types: {type: array, items: {type: string}}
        hierarchical: {type: boolean}
        rest_base: {type: string}
        rest_namespace: {type: string}
        _links: {$ref: '#/components/schemas/Links'}
    Status:
      type: object
      properties:
        name: {type: string}
        slug: {type: string}
        public: {type: boolean}
        queryable: {type: boolean}
        date_floating: {type: boolean}
        _links: {$ref: '#/components/schemas/Links'}
    ContactForm:
      type: object
      description: A Contact Form 7 form definition exposed as a custom post type.
      properties:
        id: {type: integer}
        date: {type: string, format: date-time}
        slug: {type: string}
        status: {type: string}
        type: {type: string, const: wpcf7_contact_form}
        title: {$ref: '#/components/schemas/RenderedText'}
        _links: {$ref: '#/components/schemas/Links'}
    SearchResult:
      type: object
      description: A lightweight search hit. Use `_links.self` (or `_embed`) to fetch the full object.
      properties:
        id: {type: integer}
        title: {type: string, description: Plain string here, not a rendered object.}
        url: {type: string, format: uri}
        type: {type: string}
        subtype: {type: string}
        _links: {$ref: '#/components/schemas/Links'}
    Oembed:
      type: object
      properties:
        version: {type: string, const: '1.0'}
        provider_name: {type: string}
        provider_url: {type: string, format: uri}
        title: {type: string}
        type: {type: string}
        width: {type: integer}
        height: {type: integer}
        html: {type: string}
        thumbnail_url: {type: string, format: uri}
    Links:
      type: object
      description: >-
        HAL-style relation map (self, collection, about, author, wp:featuredmedia,
        wp:attachment, wp:term, replies). Appending `_embed` inlines these under `_embedded`.
      additionalProperties:
        type: array
        items:
          type: object
          properties:
            href: {type: string, format: uri}
            embeddable: {type: boolean}
            templated: {type: boolean}
    Error:
      type: object
      description: >-
        The WordPress REST error envelope. This is NOT RFC 9457 Problem Details — the media
        type is application/json, there is no `type` URI, and the HTTP status is repeated
        inside `data.status`.
      required: [code, message, data]
      properties:
        code: {type: string, description: Machine-readable error code, e.g. rest_post_invalid_id.}
        message: {type: string, description: Human-readable message.}
        data:
          type: object
          properties:
            status: {type: integer}
            params: {type: object}
            details: {type: object}
  securitySchemes:
    applicationPassword:
      type: http
      scheme: basic
      description: >-
        WordPress application passwords (HTTP Basic per RFC 7617), advertised by the site's
        own route index. Required only for the write and administrative routes, none of which
        appear in this document. Arbor Biotechnologies issues no public credentials, so this
        scheme is declared by the platform but unreachable for third parties.
security: []