Skip to main content
The APIRequestContext class provides methods to make HTTP API requests independently of browser pages. It’s useful for API testing, authentication setup, and backend operations.

Creation

const request = await playwright.request.newContext({
  baseURL: 'https://api.example.com',
  extraHTTPHeaders: {
    'Authorization': 'Bearer token'
  }
});

Methods

fetch

Makes an HTTP request.
const response = await request.fetch('https://api.example.com/users');
const response = await request.fetch('https://api.example.com/users', {
  method: 'POST',
  data: { name: 'John' }
});
url
string
required
Request URL. Can be relative if baseURL was set.
options.method
string
HTTP method. Defaults to ‘GET’.
options.params
Object | URLSearchParams | string
Query parameters to append to URL.
options.headers
Object
Request headers.
options.data
string | Buffer | object
Request body. Objects will be serialized to JSON.
options.form
Object | FormData
Form-encoded data. Sets content-type to application/x-www-form-urlencoded.
options.multipart
Object | FormData
Multipart form data. Sets content-type to multipart/form-data.
options.timeout
number
Request timeout in milliseconds.
options.failOnStatusCode
boolean
Whether to throw on non-2xx status codes. Defaults to false.
options.ignoreHTTPSErrors
boolean
Whether to ignore HTTPS errors. Defaults to false.
options.maxRedirects
number
Maximum number of redirects to follow. Defaults to 20.
options.maxRetries
number
Maximum number of retries. Defaults to 0.
Returns: Promise<APIResponse>

get

Makes a GET request.
const response = await request.get('https://api.example.com/users');
const response = await request.get('users', {
  params: { page: 1, limit: 10 }
});
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>

post

Makes a POST request.
const response = await request.post('https://api.example.com/users', {
  data: { name: 'John', email: '[email protected]' }
});
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>

put

Makes a PUT request.
const response = await request.put('https://api.example.com/users/1', {
  data: { name: 'John Doe' }
});
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>

patch

Makes a PATCH request.
const response = await request.patch('https://api.example.com/users/1', {
  data: { email: '[email protected]' }
});
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>

delete

Makes a DELETE request.
const response = await request.delete('https://api.example.com/users/1');
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>
Makes a HEAD request.
const response = await request.head('https://api.example.com/users');
url
string
required
Request URL
options
Object
Same options as fetch() except method
Returns: Promise<APIResponse>

storageState

Returns storage state for this context.
const state = await request.storageState();
await request.storageState({ path: 'storage.json' });
options.path
string
File path to save storage state to.
options.indexedDB
boolean
Whether to include IndexedDB data. Defaults to false.
Returns: Promise<Object>

dispose

Disposes the request context and closes all resources.
await request.dispose();
await request.dispose({ reason: 'Test completed' });
options.reason
string
Optional reason for disposal.

Example Usage

Create Context with Authentication

const request = await playwright.request.newContext({
  baseURL: 'https://api.example.com',
  extraHTTPHeaders: {
    'Authorization': 'Bearer token123'
  }
});

Make API Request

const response = await request.get('/users');
const users = await response.json();
console.log(users);

POST with JSON Data

const response = await request.post('/users', {
  data: {
    name: 'John Doe',
    email: '[email protected]'
  }
});

if (response.ok()) {
  const user = await response.json();
  console.log('Created user:', user);
}

Upload File

const response = await request.post('/upload', {
  multipart: {
    file: {
      name: 'image.png',
      mimeType: 'image/png',
      buffer: fs.readFileSync('image.png')
    }
  }
});

Handle Query Parameters

const response = await request.get('/search', {
  params: {
    q: 'playwright',
    page: 1,
    limit: 20
  }
});

Setup Authentication Before Tests

const request = await playwright.request.newContext();

const response = await request.post('https://api.example.com/login', {
  data: {
    username: 'user',
    password: 'pass'
  }
});

const token = (await response.json()).token;

// Use token in browser context
const context = await browser.newContext({
  extraHTTPHeaders: {
    'Authorization': `Bearer ${token}`
  }
});

Save and Restore Storage State

// Save storage state
const request = await playwright.request.newContext();
await request.post('/login', { data: credentials });
await request.storageState({ path: 'auth.json' });

// Restore storage state
const request2 = await playwright.request.newContext({
  storageState: 'auth.json'
});

Build docs developers (and LLMs) love