Index: src/wp-includes/rest-api/class-wp-rest-request.php
===================================================================
--- src/wp-includes/rest-api/class-wp-rest-request.php	(revision 39412)
+++ src/wp-includes/rest-api/class-wp-rest-request.php	(working copy)
@@ -828,8 +828,14 @@
 					continue;
 				}
 
-				$sanitized_value = call_user_func( $attributes['args'][ $key ]['sanitize_callback'], $value, $this, $key );
+				$args = array( $value, $this, $key );
 
+				if ( ! empty( $attributes['args'][ $key ][ 'sanitize_callback_args' ] ) && is_numeric( $attributes['args'][ $key ][ 'sanitize_callback_args' ] ) ) {
+					$args = array_slice( $args, 0, $attributes['args'][ $key ][ 'sanitize_callback_args' ] );
+				}
+
+				$sanitized_value = call_user_func_array( $attributes[ 'args' ][ $key ][ 'sanitize_callback' ], $args );
+
 				if ( is_wp_error( $sanitized_value ) ) {
 					$invalid_params[ $key ] = $sanitized_value->get_error_message();
 				} else {
@@ -893,8 +899,15 @@
 			$param = $this->get_param( $key );
 
 			if ( null !== $param && ! empty( $arg['validate_callback'] ) ) {
-				$valid_check = call_user_func( $arg['validate_callback'], $param, $this, $key );
 
+				$args = array( $param, $this, $key );
+
+				if ( ! empty( $arg[ 'validate_callback_args' ] ) && is_numeric( $arg[ 'validate_callback_args' ] ) ) {
+					$args = array_slice( $args, 0, $arg[ 'validate_callback_args' ] );
+				}
+
+				$valid_check = call_user_func_array( $arg[ 'validate_callback' ], $args );
+
 				if ( false === $valid_check ) {
 					$invalid_params[ $key ] = __( 'Invalid parameter.' );
 				}
Index: tests/phpunit/tests/rest-api/rest-request.php
===================================================================
--- tests/phpunit/tests/rest-api/rest-request.php	(revision 39412)
+++ tests/phpunit/tests/rest-api/rest-request.php	(working copy)
@@ -342,6 +342,43 @@
 		$this->assertEquals( 'rest_invalid_param', $valid->get_error_code() );
 	}
 
+	public function test_sanitize_callback_args_number() {
+		$this->request->set_url_params( array(
+			'someinteger' => 'aaa',
+		) );
+
+		$this->request->set_attributes( array(
+			'args' => array(
+				'someinteger' => array(
+					'sanitize_callback'      => 'is_numeric',
+					'sanitize_callback_args' => 1,
+				),
+			)
+		) );
+
+		$valid = $this->request->sanitize_params();
+		$this->assertTrue( $valid );
+		$this->assertEquals( false, $this->request->get_param( 'someinteger' ), 'Should return false instead of NULL when run through is_numeric' );
+	}
+
+	public function test_validate_callback_args_number() {
+		$this->request->set_url_params( array(
+			'someinteger' => 'aaa',
+		) );
+
+		$this->request->set_attributes( array(
+			'args' => array(
+				'someinteger' => array(
+					'validate_callback'      => 'is_numeric',
+					'validate_callback_args' => 1,
+				),
+			)
+		) );
+
+		$valid = $this->request->has_valid_params();
+		$this->assertWPError( $valid, 'Should call is_numeric with one argument and fail validation' );
+	}
+
 	public function test_has_valid_params_required_flag() {
 		$this->request->set_attributes( array(
 			'args' => array(
