REST API Hooks
Actions and filters for the REST API.
Actions
rest_api_init
Fires when the REST API server is initialized. Register routes here.
do_action( 'rest_api_init', WP_REST_Server $server )
| Parameter | Type | Description |
|---|---|---|
$server |
WP_REST_Server | Server instance |
Example:
add_action( 'rest_api_init', function( $server ) {
register_rest_route( 'my-plugin/v1', '/items', array(
'methods' => 'GET',
'callback' => 'get_items',
'permission_callback' => '__return_true',
) );
} );
Authentication Filters
rest_authentication_errors
Filters REST API authentication. Return WP_Error to deny, true to allow, null to defer.
apply_filters( 'rest_authentication_errors', WP_Error|null|true $errors )
| Parameter | Type | Description |
|---|---|---|
$errors |
WP_Error|null|true | Current auth state |
Returns: WP_Error to reject, null to let other auth handle, true if authenticated.
Example:
add_filter( 'rest_authentication_errors', function( $result ) {
// Skip if another method authenticated
if ( true === $result || is_wp_error( $result ) ) {
return $result;
}
// Custom auth check
$token = $_SERVER['HTTP_X_API_KEY'] ?? '';
if ( $token === 'secret' ) {
return true;
}
return new WP_Error( 'invalid_key', 'Invalid API key', array( 'status' => 401 ) );
} );
Request Lifecycle Filters
rest_pre_dispatch
Filters before dispatching. Return non-null to short-circuit.
apply_filters( 'rest_pre_dispatch', mixed $result, WP_REST_Server $server, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$result |
mixed | Pre-dispatch result (null to continue) |
$server |
WP_REST_Server | Server instance |
$request |
WP_REST_Request | Request being dispatched |
Returns: Response to send, or null to continue normal dispatch.
Example:
add_filter( 'rest_pre_dispatch', function( $result, $server, $request ) {
// Rate limiting
if ( is_rate_limited( $request ) ) {
return new WP_Error( 'rate_limited', 'Too many requests', array( 'status' => 429 ) );
}
return $result;
}, 10, 3 );
rest_request_before_callbacks
Filters response before executing callbacks.
apply_filters( 'rest_request_before_callbacks', WP_REST_Response|WP_Error|mixed $response, array $handler, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$response |
mixed | Current response (null initially) |
$handler |
array | Matched route handler |
$request |
WP_REST_Request | Request object |
Returns: Response to use, or original to continue.
rest_dispatch_request
Filters before calling route callback. Return non-null to override.
apply_filters( 'rest_dispatch_request', mixed $dispatch_result, WP_REST_Request $request, string $route, array $handler )
| Parameter | Type | Description |
|---|---|---|
$dispatch_result |
mixed | Override result (null to call callback) |
$request |
WP_REST_Request | Request object |
$route |
string | Matched route |
$handler |
array | Route handler |
Returns: Response to use, or null to execute callback.
rest_request_after_callbacks
Filters response after executing callbacks.
apply_filters( 'rest_request_after_callbacks', WP_REST_Response|WP_Error|mixed $response, array $handler, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$response |
mixed | Response from callback |
$handler |
array | Matched route handler |
$request |
WP_REST_Request | Request object |
Returns: Modified response.
Example:
add_filter( 'rest_request_after_callbacks', function( $response, $handler, $request ) {
// Add timing header
if ( $response instanceof WP_REST_Response ) {
$response->header( 'X-Request-Time', microtime( true ) - $_SERVER['REQUEST_TIME_FLOAT'] );
}
return $response;
}, 10, 3 );
rest_post_dispatch
Filters final response before sending.
apply_filters( 'rest_post_dispatch', WP_HTTP_Response $result, WP_REST_Server $server, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$result |
WP_HTTP_Response | Response object |
$server |
WP_REST_Server | Server instance |
$request |
WP_REST_Request | Request object |
Returns: Modified response.
Example:
add_filter( 'rest_post_dispatch', function( $response, $server, $request ) {
// Modify all responses
$data = $response->get_data();
$data['api_version'] = '2.0';
$response->set_data( $data );
return $response;
}, 10, 3 );
Response Filters
rest_pre_serve_request
Filters whether to serve the request manually.
apply_filters( 'rest_pre_serve_request', bool $served, WP_HTTP_Response $result, WP_REST_Request $request, WP_REST_Server $server )
| Parameter | Type | Description |
|---|---|---|
$served |
bool | Whether already served |
$result |
WP_HTTP_Response | Response to send |
$request |
WP_REST_Request | Request object |
$server |
WP_REST_Server | Server instance |
Returns: true to skip default JSON output.
rest_pre_echo_response
Filters response data before JSON encoding.
apply_filters( 'rest_pre_echo_response', array $result, WP_REST_Server $server, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$result |
array | Response data array |
$server |
WP_REST_Server | Server instance |
$request |
WP_REST_Request | Request object |
Returns: Modified response data.
rest_envelope_response
Filters envelope format.
apply_filters( 'rest_envelope_response', array $envelope, WP_REST_Response $response )
| Parameter | Type | Description |
|---|---|---|
$envelope |
array | Envelope with body, status, headers |
$response |
WP_REST_Response | Original response |
Returns: Modified envelope.
URL Filters
rest_url_prefix
Filters the REST URL prefix.
apply_filters( 'rest_url_prefix', string $prefix )
| Parameter | Type | Description |
|---|---|---|
$prefix |
string | URL prefix (default wp-json) |
Returns: Modified prefix.
rest_url
Filters the REST URL.
apply_filters( 'rest_url', string $url, string $path, int $blog_id, string $scheme )
| Parameter | Type | Description |
|---|---|---|
$url |
string | Full REST URL |
$path |
string | REST path |
$blog_id |
int | Blog ID |
$scheme |
string | URL scheme |
Returns: Modified URL.
Route/Endpoint Filters
rest_endpoints
Filters available endpoints.
apply_filters( 'rest_endpoints', array $endpoints )
| Parameter | Type | Description |
|---|---|---|
$endpoints |
array | Map of route to handlers |
Returns: Modified endpoints.
rest_endpoints_description
Filters publicly-visible data for a single route.
apply_filters( 'rest_endpoints_description', array $data )
| Parameter | Type | Description |
|---|---|---|
$data |
array | Route data for index |
Returns: Modified route data.
rest_route_data
Filters publicly-visible route data.
apply_filters( 'rest_route_data', array[] $available, array $routes )
| Parameter | Type | Description |
|---|---|---|
$available |
array[] | Route data keyed by route |
$routes |
array | Internal route data |
Returns: Modified route data.
rest_index
Filters the REST API root index.
apply_filters( 'rest_index', WP_REST_Response $response, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$response |
WP_REST_Response | Index response |
$request |
WP_REST_Request | Request object |
Returns: Modified response.
rest_namespace_index
Filters namespace index data.
apply_filters( 'rest_namespace_index', WP_REST_Response $response, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$response |
WP_REST_Response | Namespace index |
$request |
WP_REST_Request | Request with namespace param |
Returns: Modified response.
CORS Filters
rest_exposed_cors_headers
Filters exposed CORS headers.
apply_filters( 'rest_exposed_cors_headers', string[] $expose_headers, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$expose_headers |
string[] | Headers to expose |
$request |
WP_REST_Request | Request object |
Default: ['X-WP-Total', 'X-WP-TotalPages', 'Link']
rest_allowed_cors_headers
Filters allowed CORS request headers.
apply_filters( 'rest_allowed_cors_headers', string[] $allow_headers, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$allow_headers |
string[] | Allowed headers |
$request |
WP_REST_Request | Request object |
Default: ['Authorization', 'X-WP-Nonce', 'Content-Disposition', 'Content-MD5', 'Content-Type']
JSON Filters
rest_json_encode_options
Filters JSON encoding options.
apply_filters( 'rest_json_encode_options', int $options, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$options |
int | json_encode() options |
$request |
WP_REST_Request | Request object |
Returns: Modified options (e.g., add JSON_PRETTY_PRINT).
rest_jsonp_enabled
Filters whether JSONP is enabled.
apply_filters( 'rest_jsonp_enabled', bool $enabled )
| Parameter | Type | Description |
|---|---|---|
$enabled |
bool | Whether JSONP enabled (default true) |
Route Lookup Filters
rest_route_for_post
Filters REST route for a post.
apply_filters( 'rest_route_for_post', string $route, WP_Post $post )
| Parameter | Type | Description |
|---|---|---|
$route |
string | REST route |
$post |
WP_Post | Post object |
rest_route_for_post_type_items
Filters REST route for post type collection.
apply_filters( 'rest_route_for_post_type_items', string $route, WP_Post_Type $post_type )
| Parameter | Type | Description |
|---|---|---|
$route |
string | REST route |
$post_type |
WP_Post_Type | Post type object |
rest_route_for_term
Filters REST route for a term.
apply_filters( 'rest_route_for_term', string $route, WP_Term $term )
| Parameter | Type | Description |
|---|---|---|
$route |
string | REST route |
$term |
WP_Term | Term object |
rest_route_for_taxonomy_items
Filters REST route for taxonomy collection.
apply_filters( 'rest_route_for_taxonomy_items', string $route, WP_Taxonomy $taxonomy )
| Parameter | Type | Description |
|---|---|---|
$route |
string | REST route |
$taxonomy |
WP_Taxonomy | Taxonomy object |
rest_queried_resource_route
Filters REST route for current query.
apply_filters( 'rest_queried_resource_route', string $route )
| Parameter | Type | Description |
|---|---|---|
$route |
string | REST route |
Miscellaneous Filters
rest_send_nocache_headers
Filters whether to send no-cache headers.
apply_filters( 'rest_send_nocache_headers', bool $send )
| Parameter | Type | Description |
|---|---|---|
$send |
bool | Whether to send (default: is_user_logged_in()) |
rest_avatar_sizes
Filters available avatar sizes.
apply_filters( 'rest_avatar_sizes', int[] $sizes )
| Parameter | Type | Description |
|---|---|---|
$sizes |
int[] | Avatar sizes (default [24, 48, 96]) |
rest_request_parameter_order
Filters parameter priority order.
apply_filters( 'rest_request_parameter_order', string[] $order, WP_REST_Request $request )
| Parameter | Type | Description |
|---|---|---|
$order |
string[] | Parameter sources in priority order |
$request |
WP_REST_Request | Request object |
rest_request_from_url
Filters request created from URL.
apply_filters( 'rest_request_from_url', WP_REST_Request|false $request, string $url )
| Parameter | Type | Description |
|---|---|---|
$request |
WP_REST_Request|false | Created request or false |
$url |
string | Source URL |
rest_response_link_curies
Filters additional CURIEs for responses.
apply_filters( 'rest_response_link_curies', array $additional )
| Parameter | Type | Description |
|---|---|---|
$additional |
array | Additional CURIE definitions |
rest_get_max_batch_size
Filters maximum batch request size.
apply_filters( 'rest_get_max_batch_size', int $max_size )
| Parameter | Type | Description |
|---|---|---|
$max_size |
int | Maximum requests (default 25) |
wp_is_rest_endpoint
Filters whether current request is REST endpoint.
apply_filters( 'wp_is_rest_endpoint', bool $is_rest_endpoint )
| Parameter | Type | Description |
|---|---|---|
$is_rest_endpoint |
bool | Whether REST endpoint |
wp_rest_server_class
Filters the REST server class name.
apply_filters( 'wp_rest_server_class', string $class_name )
| Parameter | Type | Description |
|---|---|---|
$class_name |
string | Server class (default WP_REST_Server) |
wp_rest_search_handlers
Filters search handlers for the search endpoint.
apply_filters( 'wp_rest_search_handlers', WP_REST_Search_Handler[] $handlers )
| Parameter | Type | Description |
|---|---|---|
$handlers |
WP_REST_Search_Handler[] | Search handlers |