VaynerMedia WordPress Content API

vaynermedia.com is a self-hosted WordPress site on WP Engine, and it leaves the WordPress REST API open for anonymous reads at https://vaynermedia.com/wp-json/. The site's own route index registers 365 routes across 17 namespaces; the portion that is actually callable without credentials is the wp/v2 content surface — posts (267), pages (51), media (1,693), categories, tags, comments, cross-type search (342 indexed records), the type/status/taxonomy registries, and two custom post types the agency registered itself: case_study (its published client case studies) and salient_g_sections. Popup Maker's popups and themes are also public. Writes, templates, menu-items, settings and users are gated (401/403). This is not a developer product and VaynerMedia does not document, version, rate-limit or support it — it is the content surface of the agency's marketing site, and the only callable API the company exposes. The OpenAPI in this repo was derived by API Evangelist from the provider's own /wp-json/ route index; VaynerMedia publishes no OpenAPI, and the only human reference is WordPress core's.

Documentation

Specifications

Other Resources

OpenAPI Specification

vaynermedia-wordpress-content-openapi.json Raw ↑
{
  "openapi": "3.1.0",
  "info": {
    "title": "VaynerMedia WordPress Content API",
    "version": "wp/v2",
    "summary": "Public read surface of the WordPress REST API served at vaynermedia.com/wp-json/.",
    "description": "VaynerMedia runs vaynermedia.com on self-hosted WordPress (WP Engine) and leaves the WordPress REST API open for anonymous reads. This document describes the portion of that API that is actually callable without credentials: the wp/v2 content collections, the site's two custom post types (case_study, salient_g_sections), the Popup Maker types, and the registry endpoints.\n\nIt was DERIVED from the provider's own machine-readable route index at https://vaynermedia.com/wp-json/ (365 registered routes) on 2026-08-12 \u2014 every path, parameter, type, default and enum below is copied from that document. VaynerMedia does not publish an OpenAPI itself, and this is not a product API: it is the content surface of the agency's marketing site. Write methods (POST/PUT/PATCH/DELETE) are registered but reject anonymous callers, and are deliberately excluded. Routes that returned 401/403 anonymously (templates, template-parts, menu-items, settings, navigation revisions, users) are excluded for the same reason.",
    "contact": {
      "name": "VaynerMedia",
      "url": "https://vaynermedia.com/connect/"
    },
    "x-derived-from": "https://vaynermedia.com/wp-json/",
    "x-derived-on": "2026-08-12",
    "x-upstream-documentation": "https://developer.wordpress.org/rest-api/"
  },
  "servers": [
    {
      "url": "https://vaynermedia.com/wp-json",
      "description": "Production WordPress REST API for vaynermedia.com"
    }
  ],
  "tags": [
    {
      "name": "Posts",
      "description": "Blog posts and articles published on vaynermedia.com."
    },
    {
      "name": "Pages",
      "description": "Static pages on vaynermedia.com."
    },
    {
      "name": "Media",
      "description": "Media library attachments (images, video, documents)."
    },
    {
      "name": "Categories",
      "description": "Post categories taxonomy."
    },
    {
      "name": "Tags",
      "description": "Post tags taxonomy."
    },
    {
      "name": "Comments",
      "description": "Approved comments."
    },
    {
      "name": "Search",
      "description": "Cross-content-type search index."
    },
    {
      "name": "Types",
      "description": "Registered post types."
    },
    {
      "name": "Statuses",
      "description": "Registered post statuses."
    },
    {
      "name": "Taxonomies",
      "description": "Registered taxonomies."
    },
    {
      "name": "CaseStudies",
      "description": "VaynerMedia client case studies (custom post type)."
    },
    {
      "name": "Popups",
      "description": "Popup Maker themes."
    },
    {
      "name": "Blocks",
      "description": "Salient theme global sections (custom post type)."
    }
  ],
  "paths": {
    "/wp/v2/posts": {
      "get": {
        "operationId": "list_posts",
        "summary": "List posts",
        "description": "Blog posts and articles published on vaynermedia.com. Read-only for anonymous callers; the collection also accepts POST for authenticated editors, which is not documented here.",
        "tags": [
          "Posts"
        ],
        "parameters": [
          {
            "name": "after",
            "in": "query",
            "description": "Limit response to posts published after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "author",
            "in": "query",
            "description": "Limit result set to posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "author_exclude",
            "in": "query",
            "description": "Ensure result set excludes posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "before",
            "in": "query",
            "description": "Limit response to posts published before a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "categories",
            "in": "query",
            "description": "Limit result set to items with specific terms assigned in the categories taxonomy.",
            "schema": {
              "type": [
                "object",
                "array"
              ]
            }
          },
          {
            "name": "categories_exclude",
            "in": "query",
            "description": "Limit result set to items except those with specific terms assigned in the categories taxonomy.",
            "schema": {
              "type": [
                "object",
                "array"
              ]
            }
          },
          {
            "name": "context",
            "in": "query",
            "description": "Scope under which the request is made; determines fields present in response.",
            "schema": {
              "type": "string",
              "enum": [
                "view",
                "embed",
                "edit"
              ],
              "default": "view"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "description": "Ensure result set excludes specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "format",
            "in": "query",
            "description": "Limit result set to items assigned one or more given formats.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "standard",
                  "aside",
                  "chat",
                  "gallery",
                  "link",
                  "image",
                  "quote",
                  "status",
                  "video",
                  "audio"
                ]
              }
            }
          },
          {
            "name": "ignore_sticky",
            "in": "query",
            "description": "Whether to ignore sticky posts or not.",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "include",
            "in": "query",
            "description": "Limit result set to specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "modified_after",
            "in": "query",
            "description": "Limit response to posts modified after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "modified_before",
            "in": "query",
            "description": "Limit response to posts modified before a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Offset the result set by a specific number of items.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "order",
            "in": "query",
            "description": "Order sort attribute ascending or descending.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "orderby",
            "in": "query",
            "description": "Sort collection by post attribute.",
            "schema": {
              "type": "string",
              "enum": [
                "author",
                "date",
                "id",
                "include",
                "modified",
                "parent",
                "relevance",
                "slug",
                "include_slugs",
                "title"
              ],
              "default": "date"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Current page of the collection.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "description": "Maximum number of items to be returned in result set.",
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "search",
            "in": "query",
            "description": "Limit results to those matching a string.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search_columns",
            "in": "query",
            "description": "Array of column names to be searched.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "string",
                "enum": [
                  "post_title",
                  "post_content",
                  "post_excerpt"
                ]
              }
            }
          },
          {
            "name": "search_semantics",
            "in": "query",
            "description": "How to interpret the search input.",
            "schema": {
              "type": "string",
              "enum": [
                "exact"
              ]
            }
          },
          {
            "name": "slug",
            "in": "query",
            "description": "Limit result set to posts with one or more specific slugs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Limit result set to posts assigned one or more statuses.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": "publish",
              "items": {
                "type": "string",
                "enum": [
                  "publish",
                  "future",
                  "draft",
                  "pending",
                  "private",
                  "trash",
                  "auto-draft",
                  "inherit",
                  "request-pending",
                  "request-confirmed",
                  "request-failed",
                  "request-completed",
                  "email_sent",
                  "email_failed",
                  "email_scheduled",
                  "any"
                ]
              }
            }
          },
          {
            "name": "sticky",
            "in": "query",
            "description": "Limit result set to items that are sticky.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "tags",
            "in": "query",
            "description": "Limit result set to items with specific terms assigned in the tags taxonomy.",
            "schema": {
              "type": [
                "object",
                "array"
              ]
            }
          },
          {
            "name": "tags_exclude",
            "in": "query",
            "description": "Limit result set to items except those with specific terms assigned in the tags taxonomy.",
            "schema": {
              "type": [
                "object",
                "array"
              ]
            }
          },
          {
            "name": "tax_relation",
            "in": "query",
            "description": "Limit result set based on relationship between multiple taxonomies.",
            "schema": {
              "type": "string",
              "enum": [
                "AND",
                "OR"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of posts.",
            "headers": {
              "X-WP-Total": {
                "description": "Total number of matching records.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-WP-TotalPages": {
                "description": "Total number of pages available.",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 pagination links (rel=next / rel=prev).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/wp/v2/posts/{id}": {
      "get": {
        "operationId": "get_posts",
        "summary": "Retrieve a post",
        "description": "Retrieve a single post by id.",
        "tags": [
          "Posts"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Unique identifier for the post.",
            "schema": {
              "type": "integer"
            },
            "required": true
          },
          {
            "name": "context",
            "in": "query",
            "description": "Scope under which the request is made; determines fields present in response.",
            "schema": {
              "type": "string",
              "enum": [
                "view",
                "embed",
                "edit"
              ],
              "default": "view"
            }
          },
          {
            "name": "excerpt_length",
            "in": "query",
            "description": "Override the default excerpt length.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "password",
            "in": "query",
            "description": "The password for the post if it is password protected.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The requested record.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/wp/v2/pages": {
      "get": {
        "operationId": "list_pages",
        "summary": "List pages",
        "description": "Static pages on vaynermedia.com. Read-only for anonymous callers; the collection also accepts POST for authenticated editors, which is not documented here.",
        "tags": [
          "Pages"
        ],
        "parameters": [
          {
            "name": "after",
            "in": "query",
            "description": "Limit response to posts published after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "author",
            "in": "query",
            "description": "Limit result set to posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "author_exclude",
            "in": "query",
            "description": "Ensure result set excludes posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "before",
            "in": "query",
            "description": "Limit response to posts published before a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "context",
            "in": "query",
            "description": "Scope under which the request is made; determines fields present in response.",
            "schema": {
              "type": "string",
              "enum": [
                "view",
                "embed",
                "edit"
              ],
              "default": "view"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "description": "Ensure result set excludes specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "include",
            "in": "query",
            "description": "Limit result set to specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "menu_order",
            "in": "query",
            "description": "Limit result set to posts with a specific menu_order value.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "modified_after",
            "in": "query",
            "description": "Limit response to posts modified after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "modified_before",
            "in": "query",
            "description": "Limit response to posts modified before a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "Offset the result set by a specific number of items.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "order",
            "in": "query",
            "description": "Order sort attribute ascending or descending.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "orderby",
            "in": "query",
            "description": "Sort collection by post attribute.",
            "schema": {
              "type": "string",
              "enum": [
                "author",
                "date",
                "id",
                "include",
                "modified",
                "parent",
                "relevance",
                "slug",
                "include_slugs",
                "title",
                "menu_order"
              ],
              "default": "date"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Current page of the collection.",
            "schema": {
              "type": "integer",
              "default": 1,
              "minimum": 1
            }
          },
          {
            "name": "parent",
            "in": "query",
            "description": "Limit result set to items with particular parent IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "parent_exclude",
            "in": "query",
            "description": "Limit result set to all items except those of a particular parent ID.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "per_page",
            "in": "query",
            "description": "Maximum number of items to be returned in result set.",
            "schema": {
              "type": "integer",
              "default": 10,
              "minimum": 1,
              "maximum": 100
            }
          },
          {
            "name": "search",
            "in": "query",
            "description": "Limit results to those matching a string.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search_columns",
            "in": "query",
            "description": "Array of column names to be searched.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "string",
                "enum": [
                  "post_title",
                  "post_content",
                  "post_excerpt"
                ]
              }
            }
          },
          {
            "name": "search_semantics",
            "in": "query",
            "description": "How to interpret the search input.",
            "schema": {
              "type": "string",
              "enum": [
                "exact"
              ]
            }
          },
          {
            "name": "slug",
            "in": "query",
            "description": "Limit result set to posts with one or more specific slugs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "status",
            "in": "query",
            "description": "Limit result set to posts assigned one or more statuses.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": "publish",
              "items": {
                "type": "string",
                "enum": [
                  "publish",
                  "future",
                  "draft",
                  "pending",
                  "private",
                  "trash",
                  "auto-draft",
                  "inherit",
                  "request-pending",
                  "request-confirmed",
                  "request-failed",
                  "request-completed",
                  "email_sent",
                  "email_failed",
                  "email_scheduled",
                  "any"
                ]
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of pages.",
            "headers": {
              "X-WP-Total": {
                "description": "Total number of matching records.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-WP-TotalPages": {
                "description": "Total number of pages available.",
                "schema": {
                  "type": "integer"
                }
              },
              "Link": {
                "description": "RFC 8288 pagination links (rel=next / rel=prev).",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "type": "object"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Error"
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/wp/v2/pages/{id}": {
      "get": {
        "operationId": "get_pages",
        "summary": "Retrieve a page",
        "description": "Retrieve a single page by id.",
        "tags": [
          "Pages"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Unique identifier for the post.",
            "schema": {
              "type": "integer"
            },
            "required": true
          },
          {
            "name": "context",
            "in": "query",
            "description": "Scope under which the request is made; determines fields present in response.",
            "schema": {
              "type": "string",
              "enum": [
                "view",
                "embed",
                "edit"
              ],
              "default": "view"
            }
          },
          {
            "name": "excerpt_length",
            "in": "query",
            "description": "Override the default excerpt length.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "password",
            "in": "query",
            "description": "The password for the post if it is password protected.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The requested record.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Error"
          },
          "404": {
            "$ref": "#/components/responses/Error"
          }
        },
        "security": [
          {}
        ]
      }
    },
    "/wp/v2/media": {
      "get": {
        "operationId": "list_media",
        "summary": "List media",
        "description": "Media library attachments (images, video, documents). Read-only for anonymous callers; the collection also accepts POST for authenticated editors, which is not documented here.",
        "tags": [
          "Media"
        ],
        "parameters": [
          {
            "name": "after",
            "in": "query",
            "description": "Limit response to posts published after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "author",
            "in": "query",
            "description": "Limit result set to posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "author_exclude",
            "in": "query",
            "description": "Ensure result set excludes posts assigned to specific authors.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "before",
            "in": "query",
            "description": "Limit response to posts published before a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "context",
            "in": "query",
            "description": "Scope under which the request is made; determines fields present in response.",
            "schema": {
              "type": "string",
              "enum": [
                "view",
                "embed",
                "edit"
              ],
              "default": "view"
            }
          },
          {
            "name": "exclude",
            "in": "query",
            "description": "Ensure result set excludes specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "include",
            "in": "query",
            "description": "Limit result set to specific IDs.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "default": [],
              "items": {
                "type": "integer"
              }
            }
          },
          {
            "name": "media_type",
            "in": "query",
            "description": "Limit result set to attachments of a particular media type or media types.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "image",
                  "video",
                  "text",
                  "application",
                  "audio"
                ]
              }
            }
          },
          {
            "name": "mime_type",
            "in": "query",
            "description": "Limit result set to attachments of a particular MIME type or MIME types.",
            "style": "form",
            "explode": false,
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "modified_after",
            "in": "query",
            "description": "Limit response to posts modified after a given ISO8601 compliant date.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          

# --- truncated at 32 KB (133 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vaynermedia/refs/heads/main/openapi/vaynermedia-wordpress-content-openapi.json