Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.1.0
info:
title: VICE WordPress REST API
version: wp/v2
summary: The live WordPress REST API served by VICE (vice.com) at https://www.vice.com/wp-json/.
description: |-
Derived mechanically and verbatim from the route-discovery document the VICE (vice.com) web server publishes at https://www.vice.com/wp-json/ (fetched 2026-09-04, HTTP 200). Every path, method, parameter name, type, default, enum and required flag in this document was read from that live response; nothing was invented.
The provider advertises this surface itself: every page on the site carries `<link rel="https://api.w.org/" href="https://www.vice.com/wp-json/" />` in its head, and `https://www.vice.com/robots.txt` disallows nothing.
This is the content-management and syndication API of a publishing property, not a commercial developer product. It is included because it is a real, live, self-describing HTTP contract on the brand's own host that serves the public editorial archive anonymously.
Only the WordPress core namespaces are represented (`wp/v2`, `wp-abilities/v1`, `oembed/1.0`, and the root index). Third-party and operator plugin namespaces advertised by the same discovery document — `akismet/v1`, `apple-news/v1`, `block-visibility/v1`, `byline-manager/v1`, `cron-control/v1`, `duplicate-post/v1`, `elasticpress/v1`, `jetpack-boost/v1`, `jetpack/v4`, `jetpack/v4/explat`, `jetpack/v4/import`, `jetpack/v4/stats-app`, `my-jetpack/v1`, `post-smtp/v1`, `post-smtp/v2`, `psd/v1`, `savage-api-helper/v1`, `savage-platform/v1`, `savage-platform/v1/blocks`, `savage/v1`, `two-factor/1.0`, `vip/v1`, `vt/v1`, `wp-block-editor/v1`, `wp-curate/v1`, `wp-parsely/v1`, `wp-site-health/v1`, `wpcom/v2`, `wpcom/v3`, `yoast/v1` — are intentionally excluded as vendor plugin internals; all of them were observed returning HTTP 401 anonymously.
contact:
name: VICE Media security / responsible disclosure
email: infosec@vice.com
url: https://www.vice.com/en/vice-responsible-disclosure-policy/
termsOfService: https://www.vice.com/en/terms/
x-derived-from: https://www.vice.com/wp-json/
x-derived-on: '2026-09-04'
x-apievangelist-method: derived
servers:
- url: https://www.vice.com
description: Production
tags:
- name: oembed/1.0
description: oEmbed 1.0 provider endpoints — discovery and proxy for embeddable representations of VICE articles
and videos.
- name: root
description: REST API index / namespace and route discovery.
- name: wp-abilities/v1
description: WordPress Abilities API — the registry of named abilities an agent can discover and run. Read and
run are capability-gated (observed HTTP 401 anonymously).
- name: wp/v2
description: WordPress core content API — posts, pages, media, custom post types (sections, profiles, products),
taxonomies (categories, tags, bylines, brands, platform languages), search, types, statuses and settings.
components:
securitySchemes:
applicationPassword:
type: http
scheme: basic
description: WordPress Application Passwords (HTTP Basic). The live discovery document declares this as the
site's authentication method, with the authorization endpoint at https://www.vice.com/wp-admin/authorize-application.php.
wpNonce:
type: apiKey
in: header
name: X-WP-Nonce
description: WordPress cookie-authentication nonce. Advertised by the live server in its Access-Control-Allow-Headers
response header (Authorization, X-WP-Nonce, Content-Disposition, Content-MD5, Content-Type).
schemas:
WPError:
type: object
description: The WordPress REST error envelope, observed live on this host. It is NOT RFC 9457 application/problem+json.
properties:
code:
type: string
description: Machine-readable error code, e.g. rest_forbidden.
message:
type: string
description: Human-readable message.
data:
type: object
properties:
status:
type: integer
description: HTTP status repeated in the body.
required:
- code
- message
paths:
/:
get:
operationId: get_root
summary: GET /
description: '`GET` on the WordPress REST route `/` in namespace `root`, as declared by the live route-discovery
document at https://www.vice.com/wp-json/.'
tags:
- root
parameters:
- name: context
in: query
required: false
schema:
default: view
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/batch/v1:
post:
operationId: post_batch_v1
summary: POST /batch/v1
description: '`POST` on the WordPress REST route `/batch/v1` in namespace `root`, as declared by the live
route-discovery document at https://www.vice.com/wp-json/.'
tags:
- root
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
validation:
type: string
enum:
- require-all-validate
- normal
default: normal
requests:
type: array
items:
type: object
required:
- requests
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/oembed/1.0:
get:
operationId: get_oembed_1_0
summary: GET /oembed/1.0
description: '`GET` on the WordPress REST route `/oembed/1.0` in namespace `oembed/1.0`, as declared by the
live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- oembed/1.0
parameters:
- name: namespace
in: query
required: false
schema:
default: oembed/1.0
- name: context
in: query
required: false
schema:
default: view
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/oembed/1.0/embed:
get:
operationId: get_oembed_1_0_embed
summary: GET /oembed/1.0/embed
description: '`GET` on the WordPress REST route `/oembed/1.0/embed` in namespace `oembed/1.0`, as declared
by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- oembed/1.0
parameters:
- name: url
in: query
required: true
schema:
type: string
format: uri
description: The URL of the resource for which to fetch oEmbed data.
- name: format
in: query
required: false
schema:
default: json
- name: maxwidth
in: query
required: false
schema:
default: 600
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/oembed/1.0/proxy:
get:
operationId: get_oembed_1_0_proxy
summary: GET /oembed/1.0/proxy
description: '`GET` on the WordPress REST route `/oembed/1.0/proxy` in namespace `oembed/1.0`, as declared
by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- oembed/1.0
parameters:
- name: url
in: query
required: true
schema:
type: string
format: uri
description: The URL of the resource for which to fetch oEmbed data.
- name: format
in: query
required: false
schema:
type: string
enum:
- json
- xml
default: json
description: The oEmbed format to use.
- name: maxwidth
in: query
required: false
schema:
type: integer
default: 600
description: The maximum width of the embed frame in pixels.
- name: maxheight
in: query
required: false
schema:
type: integer
description: The maximum height of the embed frame in pixels.
- name: discover
in: query
required: false
schema:
type: boolean
default: true
description: Whether to perform an oEmbed discovery request for unsanctioned providers.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1:
get:
operationId: get_wp_abilities_v1
summary: GET /wp-abilities/v1
description: '`GET` on the WordPress REST route `/wp-abilities/v1` in namespace `wp-abilities/v1`, as declared
by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
parameters:
- name: namespace
in: query
required: false
schema:
default: wp-abilities/v1
- name: context
in: query
required: false
schema:
default: view
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1/abilities:
get:
operationId: get_wp_abilities_v1_abilities
summary: GET /wp-abilities/v1/abilities
description: '`GET` on the WordPress REST route `/wp-abilities/v1/abilities` in namespace `wp-abilities/v1`,
as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
parameters:
- name: context
in: query
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
description: Scope under which the request is made; determines fields present in response.
- name: page
in: query
required: false
schema:
type: integer
default: 1
minimum: 1
description: Current page of the collection.
- name: per_page
in: query
required: false
schema:
type: integer
default: 50
minimum: 1
maximum: 100
description: Maximum number of items to be returned in result set.
- name: category
in: query
required: false
schema:
type: string
description: Limit results to abilities in specific ability category.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1/abilities/{name}:
parameters:
- name: name
in: path
required: true
description: Path segment matched by the WordPress route pattern `[a-zA-Z0-9\-\/]+`.
schema:
type: string
pattern: '[a-zA-Z0-9\-\/]+'
get:
operationId: get_wp_abilities_v1_abilities_by_name
summary: GET /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)
description: '`GET` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+)` in
namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1/abilities/{name}/run:
parameters:
- name: name
in: path
required: true
description: Path segment matched by the WordPress route pattern `[a-zA-Z0-9\-\/]+?`.
schema:
type: string
pattern: '[a-zA-Z0-9\-\/]+?'
get:
operationId: get_wp_abilities_v1_abilities_by_name_run
summary: GET /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run
description: '`GET` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
parameters:
- name: input
in: query
required: false
schema:
type:
- integer
- number
- boolean
- string
- array
- object
- 'null'
default: null
description: Input parameters for the ability execution.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
post:
operationId: post_wp_abilities_v1_abilities_by_name_run
summary: POST /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run
description: '`POST` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
input:
type:
- integer
- number
- boolean
- string
- array
- object
- 'null'
default: null
description: Input parameters for the ability execution.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
put:
operationId: put_wp_abilities_v1_abilities_by_name_run
summary: PUT /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run
description: '`PUT` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
input:
type:
- integer
- number
- boolean
- string
- array
- object
- 'null'
default: null
description: Input parameters for the ability execution.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
patch:
operationId: patch_wp_abilities_v1_abilities_by_name_run
summary: PATCH /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run
description: '`PATCH` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
input:
type:
- integer
- number
- boolean
- string
- array
- object
- 'null'
default: null
description: Input parameters for the ability execution.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
delete:
operationId: delete_wp_abilities_v1_abilities_by_name_run
summary: DELETE /wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run
description: '`DELETE` on the WordPress REST route `/wp-abilities/v1/abilities/(?P<name>[a-zA-Z0-9\-\/]+?)/run`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
parameters:
- name: input
in: query
required: false
schema:
type:
- integer
- number
- boolean
- string
- array
- object
- 'null'
default: null
description: Input parameters for the ability execution.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1/categories:
get:
operationId: get_wp_abilities_v1_categories
summary: GET /wp-abilities/v1/categories
description: '`GET` on the WordPress REST route `/wp-abilities/v1/categories` in namespace `wp-abilities/v1`,
as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
parameters:
- name: context
in: query
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
description: Scope under which the request is made; determines fields present in response.
- name: page
in: query
required: false
schema:
type: integer
default: 1
minimum: 1
description: Current page of the collection.
- name: per_page
in: query
required: false
schema:
type: integer
default: 50
minimum: 1
maximum: 100
description: Maximum number of items to be returned in result set.
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp-abilities/v1/categories/{slug}:
parameters:
- name: slug
in: path
required: true
description: Path segment matched by the WordPress route pattern `[a-z0-9]+(?:-[a-z0-9]+)*`.
schema:
type: string
pattern: '[a-z0-9]+(?:-[a-z0-9]+)*'
get:
operationId: get_wp_abilities_v1_categories_by_slug
summary: GET /wp-abilities/v1/categories/(?P<slug>[a-z0-9]+(?:-[a-z0-9]+)*)
description: '`GET` on the WordPress REST route `/wp-abilities/v1/categories/(?P<slug>[a-z0-9]+(?:-[a-z0-9]+)*)`
in namespace `wp-abilities/v1`, as declared by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp-abilities/v1
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp/v2:
get:
operationId: get_wp_v2
summary: GET /wp/v2
description: '`GET` on the WordPress REST route `/wp/v2` in namespace `wp/v2`, as declared by the live route-discovery
document at https://www.vice.com/wp-json/.'
tags:
- wp/v2
parameters:
- name: namespace
in: query
required: false
schema:
default: wp/v2
- name: context
in: query
required: false
schema:
default: view
responses:
'200':
description: Success. WordPress returns the requested resource or collection as JSON.
content:
application/json:
schema: {}
'401':
description: Not authenticated or not permitted. WordPress returns its standard error envelope, e.g. `{"code":"rest_forbidden","message":"Sorry,
you are not allowed to do that.","data":{"status":401}}`.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
'404':
description: No route or resource matched.
content:
application/json:
schema:
$ref: '#/components/schemas/WPError'
/wp/v2/activity-log-events:
get:
operationId: get_wp_v2_activity_log_events
summary: GET /wp/v2/activity-log-events
description: '`GET` on the WordPress REST route `/wp/v2/activity-log-events` in namespace `wp/v2`, as declared
by the live route-discovery document at https://www.vice.com/wp-json/.'
tags:
- wp/v2
parameters:
- name: context
in: query
required: false
schema:
type: string
enum:
- view
- embed
- edit
default: view
description: Scope under which the request is made; determines fields present in response.
- name: page
in: query
required: false
schema:
type: integer
default: 1
minimum: 1
description: Current page of the collection.
- name: per_page
in: query
required: false
schema:
type: integer
default: 10
minimum: 1
maximum: 100
description: Maximum number of items to be returned in result set.
- name: search
in: query
required: false
schema:
type: string
description: Limit results to those matching a string.
- name: after
in: query
required: false
schema:
type: string
format: date-time
description: Limit response to posts published after a given ISO8601 compliant date.
- name: modified_after
in: query
required: false
schema:
type: string
format: date-time
description: Limit response to posts modified after a given ISO8601 compliant date.
- name: before
in: query
required: false
schema:
type: string
format: date-time
description: Limit response to posts published before a given ISO8601 compliant date.
- name: modified_before
in: query
required: false
schema:
type: string
format: date-time
description: Limit response to posts modified before a given ISO8601 compliant date.
- name: exclude
in: query
required: false
schema:
type: array
default: []
items:
type: integer
description: Ensure result set excludes specific IDs.
- name: include
in: query
required: false
schema:
type: array
default: []
items:
type: integer
description: Limit result set to specific IDs.
- name: search_semantics
in: query
required: false
schema:
type: string
enum:
- exact
description: How to interpret the search input.
- name: offset
in: query
required: false
schema:
type: integer
description: Offset the result set by a specific number of items.
- name: order
in: query
required: false
schema:
type: string
# --- truncated at 32 KB (1025 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/vice-media/refs/heads/main/openapi/_ae-authored/vice-media-wp-rest-openapi.yml