Metalenz Discovery API

The self-describing surface of the metalenz.com WordPress REST API — the route index, the per-namespace indexes, the registered content types and taxonomies, the publication statuses, the public author records and the comment surface. This is what makes the rest of the API machine-readable in the absence of any published documentation. Verified live at 212 routes across 13 namespaces.

Operations 11

GET / Get the API route index #
GET /{namespace} Get a namespace route index #
GET /wp/v2/types List content types #
GET /wp/v2/types/{type} Get a content type #
GET /wp/v2/taxonomies List taxonomies #
GET /wp/v2/taxonomies/{taxonomy} Get a taxonomy #
GET /wp/v2/statuses List publication statuses #
GET /wp/v2/statuses/{status} Get a publication status #
GET /wp/v2/users List public authors #
GET /wp/v2/users/{id} Get a public author #
GET /wp/v2/comments List comments #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/metalenz-discovery-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

metalenz-discovery-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Metalenz Discovery API
  version: wp/v2
  description: The self-describing surface of the metalenz.com WordPress REST API — the route index (212 routes across 13 namespaces at capture), the per-namespace indexes, the registered content types and taxonomies, the publication statuses, the public author records and the comment surface. This is what makes the rest of the API machine-readable in the absence of any published documentation.
  contact:
    name: Metalenz
    url: https://metalenz.com/contact-us/
  x-derived-from: https://metalenz.com/wp-json/ route index + per-route HTTP OPTIONS schema documents
  x-derived-on: '2026-08-25'
  x-api-evangelist-note: Third-party profile. Metalenz is a fabless metasurface-optics (meta-optics) semiconductor company and publishes no developer program, no developer portal and no API documentation; this documents the anonymously readable WordPress REST content API behind metalenz.com. Every path, parameter, enum and property here was read from the server's own published route index and OPTIONS schema documents on 2026-08-25 — nothing is invented.
servers:
- url: https://metalenz.com/wp-json
  description: Metalenz WordPress REST API
tags:
- name: Discovery
  description: Route index, content types, taxonomies, statuses, authors and comments.
paths:
  /:
    get:
      operationId: getRouteIndex
      summary: Get the API route index
      tags:
      - Discovery
      description: 'Retrieve the self-describing WordPress REST root document for metalenz.com: site name and description, home URL, the supported authentication schemes, the 13 registered namespaces and all 212 routes with their methods and arguments. This is the document that makes the rest of the surface machine-readable in the absence of any published documentation.'
      parameters:
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      - name: namespace
        in: query
        schema:
          type: string
        description: Limit the index to a single registered namespace, e.g. wp/v2.
      - name: _fields
        in: query
        schema:
          type: string
        description: Comma-separated list of top-level fields to return.
      responses:
        '200':
          description: The REST API root index
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouteIndex'
  /{namespace}:
    get:
      operationId: getNamespaceIndex
      summary: Get a namespace route index
      tags:
      - Discovery
      description: 'Retrieve the route index for a single registered namespace. Thirteen namespaces are registered on metalenz.com and every namespace index answers anonymously: `wp/v2`, `oembed/1.0`, `wp-site-health/v1`, `wp-block-editor/v1`, `akismet/v1`, `leadin/v1` (HubSpot), `redirection/v1`, `rankmath/v1` (plus `rankmath/v1/ca`, `rankmath/v1/an`, `rankmath/v1/in`), `webp-converter/v1` and `gravityforms/v2`. The operations inside the plugin namespaces are administrative and answer 401 `rest_forbidden` without credentials.'
      parameters:
      - name: namespace
        in: path
        required: true
        schema:
          type: string
        description: The registered namespace, e.g. wp/v2 or oembed/1.0.
      responses:
        '200':
          description: A namespace route index
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RouteIndex'
        '404':
          description: No route was found matching the URL and request method — rest_no_route.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/types:
    get:
      operationId: listTypes
      summary: List content types
      tags:
      - Discovery
      description: List the registered post types that are visible in the REST API (12 at capture). On metalenz.com the core `post` type is relabelled "Press Releases".
      parameters:
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: List content types
          headers:
            X-WP-Total:
              description: Total number of records matching the query.
              schema:
                type: integer
            X-WP-TotalPages:
              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
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Type'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required or insufficient permission — rest_forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/types/{type}:
    get:
      operationId: getType
      summary: Get a content type
      tags:
      - Discovery
      description: Retrieve the registration record for a single post type.
      parameters:
      - name: type
        in: path
        required: true
        schema:
          type: string
        description: An alphanumeric identifier for the post type.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: Get a content type
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Type'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No post type exists with that name — rest_type_invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/taxonomies:
    get:
      operationId: listTaxonomies
      summary: List taxonomies
      tags:
      - Discovery
      description: List the registered taxonomies visible in the REST API — `category`, `post_tag`, `nav_menu` and `wp_pattern_category` at capture.
      parameters:
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      - name: type
        in: query
        schema:
          type: string
        description: Limit results to taxonomies associated with a specific post type.
      responses:
        '200':
          description: List taxonomies
          headers:
            X-WP-Total:
              description: Total number of records matching the query.
              schema:
                type: integer
            X-WP-TotalPages:
              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
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Taxonomy'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required or insufficient permission — rest_forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/taxonomies/{taxonomy}:
    get:
      operationId: getTaxonomy
      summary: Get a taxonomy
      tags:
      - Discovery
      description: Retrieve the registration record for a single taxonomy.
      parameters:
      - name: taxonomy
        in: path
        required: true
        schema:
          type: string
        description: An alphanumeric identifier for the taxonomy.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: Get a taxonomy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Taxonomy'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No taxonomy exists with that name — rest_taxonomy_invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/statuses:
    get:
      operationId: listStatuses
      summary: List publication statuses
      tags:
      - Discovery
      description: List the publication statuses exposed to anonymous callers — `publish` and the `acf-disabled` status registered by Advanced Custom Fields.
      parameters:
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: List publication statuses
          headers:
            X-WP-Total:
              description: Total number of records matching the query.
              schema:
                type: integer
            X-WP-TotalPages:
              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
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Status'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required or insufficient permission — rest_forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/statuses/{status}:
    get:
      operationId: getStatus
      summary: Get a publication status
      tags:
      - Discovery
      description: Retrieve a single publication status record.
      parameters:
      - name: status
        in: path
        required: true
        schema:
          type: string
        description: An alphanumeric identifier for the status.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: Get a publication status
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Status'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No status exists with that name — rest_status_invalid.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/users:
    get:
      operationId: listAuthors
      summary: List public authors
      tags:
      - Discovery
      description: List the WordPress accounts that have authored at least one published post (3 at capture). The anonymous `view` context returns display name, slug, description, site URL, avatar URLs and the author archive link; email address, registration date, role and capability fields are `edit`-context only and are withheld without credentials. Personal data — treat as such.
      parameters:
      - name: capabilities
        in: query
        schema:
          type: array
          items:
            type: string
        description: Limit result set to users matching at least one specific capability provided. Accepts csv list or single capability.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      - name: exclude
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Ensure result set excludes specific IDs.
      - name: has_published_posts
        in: query
        schema:
          type:
          - boolean
          - array
          items:
            type: string
            enum:
              post: post
              page: page
              attachment: attachment
              nav_menu_item: nav_menu_item
              wp_block: wp_block
              wp_template: wp_template
              wp_template_part: wp_template_part
              wp_global_styles: wp_global_styles
              wp_navigation: wp_navigation
              wp_font_family: wp_font_family
              wp_font_face: wp_font_face
              rm_content_editor: rm_content_editor
        description: Limit result set to users who have published posts.
      - name: include
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Limit result set to specific IDs.
      - name: offset
        in: query
        schema:
          type: integer
        description: Offset the result set by a specific number of items.
      - name: order
        in: query
        schema:
          type: string
          enum:
          - asc
          - desc
          default: asc
        description: Order sort attribute ascending or descending.
      - name: orderby
        in: query
        schema:
          type: string
          enum:
          - id
          - include
          - name
          - registered_date
          - slug
          - include_slugs
          - email
          - url
          default: name
        description: Sort collection by user attribute.
      - name: page
        in: query
        schema:
          type: integer
          minimum: 1
          default: 1
        description: Current page of the collection.
      - name: per_page
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 10
        description: Maximum number of items to be returned in result set.
      - name: roles
        in: query
        schema:
          type: array
          items:
            type: string
        description: Limit result set to users matching at least one specific role provided. Accepts csv list or single role.
      - name: search
        in: query
        schema:
          type: string
        description: Limit results to those matching a string.
      - name: search_columns
        in: query
        schema:
          type: array
          items:
            enum:
            - email
            - name
            - id
            - username
            - slug
            type: string
          default: []
        description: Array of column names to be searched.
      - name: slug
        in: query
        schema:
          type: array
          items:
            type: string
        description: Limit result set to users with one or more specific slugs.
      - name: who
        in: query
        schema:
          type: string
          enum:
          - authors
        description: Limit result set to users who are considered authors.
      responses:
        '200':
          description: List public authors
          headers:
            X-WP-Total:
              description: Total number of records matching the query.
              schema:
                type: integer
            X-WP-TotalPages:
              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
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required or insufficient permission — rest_forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/users/{id}:
    get:
      operationId: getAuthor
      summary: Get a public author
      tags:
      - Discovery
      description: Retrieve a single public author record by numeric user ID.
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: integer
        description: Unique identifier for the user.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      responses:
        '200':
          description: Get a public author
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/User'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: No user exists with that ID — rest_user_invalid_id.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /wp/v2/comments:
    get:
      operationId: listComments
      summary: List comments
      tags:
      - Discovery
      description: 'List approved comments. Comments are switched off across metalenz.com: the collection answered X-WP-Total 0 at capture.'
      parameters:
      - name: after
        in: query
        schema:
          type: string
          format: date-time
        description: Limit response to comments published after a given ISO8601 compliant date.
      - name: author
        in: query
        schema:
          type: array
          items:
            type: integer
        description: Limit result set to comments assigned to specific user IDs. Requires authorization.
      - name: author_email
        in: query
        schema:
          type: string
          format: email
        description: Limit result set to that from a specific author email. Requires authorization.
      - name: author_exclude
        in: query
        schema:
          type: array
          items:
            type: integer
        description: Ensure result set excludes comments assigned to specific user IDs. Requires authorization.
      - name: before
        in: query
        schema:
          type: string
          format: date-time
        description: Limit response to comments published before a given ISO8601 compliant date.
      - name: context
        in: query
        schema:
          type: string
          enum:
          - view
          - embed
          - edit
          default: view
        description: Scope under which the request is made; determines fields present in response.
      - name: exclude
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Ensure result set excludes specific IDs.
      - name: include
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Limit result set to specific IDs.
      - name: offset
        in: query
        schema:
          type: integer
        description: Offset the result set by a specific number of items.
      - name: order
        in: query
        schema:
          type: string
          enum:
          - asc
          - desc
          default: desc
        description: Order sort attribute ascending or descending.
      - name: orderby
        in: query
        schema:
          type: string
          enum:
          - date
          - date_gmt
          - id
          - include
          - post
          - parent
          - type
          default: date_gmt
        description: Sort collection by comment attribute.
      - name: page
        in: query
        schema:
          type: integer
          minimum: 1
          default: 1
        description: Current page of the collection.
      - name: parent
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Limit result set to comments of specific parent IDs.
      - name: parent_exclude
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Ensure result set excludes specific parent IDs.
      - name: password
        in: query
        schema:
          type: string
        description: The password for the post if it is password protected.
      - name: per_page
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 10
        description: Maximum number of items to be returned in result set.
      - name: post
        in: query
        schema:
          type: array
          items:
            type: integer
          default: []
        description: Limit result set to comments assigned to specific post IDs.
      - name: search
        in: query
        schema:
          type: string
        description: Limit results to those matching a string.
      - name: status
        in: query
        schema:
          type: string
          default: approve
        description: Limit result set to comments assigned a specific status. Requires authorization.
      - name: type
        in: query
        schema:
          type: string
          default: comment
        description: Limit result set to comments assigned a specific type. Requires authorization.
      responses:
        '200':
          description: List comments
          headers:
            X-WP-Total:
              description: Total number of records matching the query.
              schema:
                type: integer
            X-WP-TotalPages:
              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
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Comment'
        '400':
          description: Invalid parameter(s) — rest_invalid_param.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Authentication required or insufficient permission — rest_forbidden.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Type:
      title: type
      type: object
      properties:
        capabilities:
          description: All capabilities used by the post type.
          type: object
          readOnly: true
        description:
          description: A human-readable description of the post type.
          type: string
          readOnly: true
        hierarchical:
          description: Whether or not the post type should have children.
          type: boolean
          readOnly: true
        viewable:
          description: Whether or not the post type can be viewed.
          type: boolean
          readOnly: true
        labels:
          description: Human-readable labels for the post type for various contexts.
          type: object
          readOnly: true
        name:
          description: The title for the post type.
          type: string
          readOnly: true
        slug:
          description: An alphanumeric identifier for the post type.
          type: string
          readOnly: true
        supports:
          description: All features, supported by the post type.
          type: object
          readOnly: true
        has_archive:
          description: If the value is a string, the value will be used as the archive slug. If the value is false the post type has no archive.
          type:
          - string
          - boolean
          readOnly: true
        taxonomies:
          description: Taxonomies associated with post type.
          type: array
          items:
            type: string
          readOnly: true
        rest_base:
          description: REST base route for the post type.
          type: string
          readOnly: true
        rest_namespace:
          description: REST route's namespace for the post type.
          type: string
          readOnly: true
        visibility:
          description: The visibility settings for the post type.
          type: object
          readOnly: true
          properties:
            show_ui:
              description: Whether to generate a default UI for managing this post type.
              type: boolean
            show_in_nav_menus:
              description: Whether to make the post type available for selection in navigation menus.
              type: boolean
        icon:
          description: The icon for the post type.
          type:
          - string
          - 'null'
          readOnly: true
        template:
          type:
          - array
          description: The block template associated with the post type.
          readOnly: true
        template_lock:
          type:
          - string
          - boolean
          enum:
          - all
          - insert
          - contentOnly
          - false
          description: The template_lock associated with the post type, or false if none.
          readOnly: true
    Status:
      title: status
      type: object
      properties:
        name:
          description: The title for the status.
          type: string
          readOnly: true
        private:
          description: Whether posts with this status should be private.
          type: boolean
          readOnly: true
        protected:
          description: Whether posts with this status should be protected.
          type: boolean
          readOnly: true
        public:
          description: Whether posts of this status should be shown in the front end of the site.
          type: boolean
          readOnly: true
        queryable:
          description: Whether posts with this status should be publicly-queryable.
          type: boolean
          readOnly: true
        show_in_list:
          description: Whether to include posts in the edit listing for their post type.
          type: boolean
          readOnly: true
        slug:
          description: An alphanumeric identifier for the status.
          type: string
          readOnly: true
        date_floating:
          description: Whether posts of this status may have floating published dates.
          type: boolean
          readOnly: true
    Error:
      type: object
      description: The WordPress REST API error envelope returned on every 4xx/5xx.
      properties:
        code:
          type: string
          description: Machine-readable error code, e.g. rest_post_invalid_id.
        message:
          type: string
          description: Human-readable error message.
        data:
          type: object
          properties:
            status:
              type: integer
              description: The HTTP status code.
            params:
              type: object
              description: Per-parameter validation messages (rest_invalid_param only).
            details:
              type: object
              description: Per-parameter validation detail (rest_invalid_param only).
      required:
      - code
      - message
    Comment:
      title: comment
      type: object
      properties:
        id:
          description: Unique identifier for the comment.
          type: integer
          readOnly: true
        author:
          description: The ID of the user object, if author was a user.
          type: integer
        author_email:
          description: Email address for the comment author.
          type: string
          format: email
        author_ip:
          description: IP address for the comment author.
          type: string
          format: ip
        author_name:
          description: Display name for the comment author.
          type: string
        author_url:
          description: URL for the comment author.
          type: string
          format: uri
        author_user_agent:
          description: User agent for the comment author.
          type: string
        content:
          description: The content for the comment.
          type: object
          properties:
            raw:
              description: Content for the comment, as it exists in the database.
              type: string
            rendered:
              description: HTML content for the comment, transformed for display.
              type: string
              readOnly: true
        date:
          description: The date the comment was published, in the site's timezone.
          type: string
          format: date-time
        date_gmt:
          description: The date the comment was published, as GMT.
          type: string
          format: date-time
        link:
          description: URL to the comment.
          type: string
          format: uri
          readOnly: true
        parent:
          description: The ID for the parent of the comment.
          type: integer
          default: 0
        post:
          description: The ID of the associated post object.
          type: integer
          default: 0
        status:
          description: State of the comment.
          type: string
        type:
          description: Type of the comment.
          type: string
          readOnly: true
        author_avatar_urls:
          description: Avatar URLs for the comment author.
          type: object
          readOnly: true
          pr

# --- truncated at 32 KB (39 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/metalenz/refs/heads/main/openapi/metalenz-discovery-api-openapi.yml