Skip to content
Visit Workers on GitHub
Set theme to dark (⇧+D)


The Request interface represents an HTTP request, and is part of the Fetch API.


The most common way you will encounter a Request object is as a property of an incoming FetchEvent.

addEventListener("fetch", event => {
let request = event.request // Request object
// ...

You may also want to construct a Request yourself when you need to modify a request object, because a FetchEvent’s request property is immutable.

addEventListener("fetch", event => {
const request = event.request
const url = ""
const modifiedRequest = new Request(url, {
body: request.body,
headers: request.headers,
method: request.method,
redirect: request.redirect
// ...

The global fetch method itself invokes the Request constructor. The RequestInit and RequestInitCfProperties types defined below also describe the valid parameters that can be passed to fetch.


let request = new Request(input [, init])


  • input string | Request

    • Either a string that contains a URL, or an existing Request object.
  • init RequestInit optional

    • Optional options object that contains settings to apply to the Request.


  • cf RequestInitCfProperties optional

    • Cloudflare-specific properties that can be set on the Request that control how Cloudflare’s edge handles the request.
  • method string optional

    • The HTTP request method. The default is GET.
  • headers Headers optional

  • body string | ReadableStream | FormData | URLSearchParams optional

    • The request body, if any.
  • redirect string optional

    • The redirect mode to use: follow, error, or manual. The default for a new Request object is follow. Note, however, that the incoming Request property of a FetchEvent will have redirect mode manual.


An object containing Cloudflare-specific properties that can be set on the Request object. For example:

// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })

Invalid or incorrectly-named keys in the cf object will be silently ignored. Consider using TypeScript and @cloudflare/workers-types to ensure proper use of the cf object.

  • apps boolean optional

  • cacheEverything boolean optional

  • cacheKey string optional

    • A request’s cache key is what determines if two requests are “the same” for caching purposes. If a request has the same cache key as some previous request, then we can serve the same cached response for both.
  • cacheTtl number optional

  • cacheTtlByStatus { [key: string]: number } optional

    • This option is a version of the cacheTtl feature which chooses a TTL based on the response’s status code. If the response to this request has a status code that matches, Cloudflare will cache for the instructed time, and override cache instructives sent by the origin. For example: { "200-299": 86400, 404: 1, "500-599": 0 }. The value can be any integer, including zero and negative integers. A value of 0 indicates that the cache asset expires immediately. Any negative value instructs Cloudflare not to cache at all.
  • minify { javascript?: boolean; css?: boolean; html?: boolean; } optional

  • mirage boolean optional

  • polish string optional

  • resolveOverride string optional

    • Directs the request to an alternate origin server by overriding the DNS lookup. The value of resolveOverride specifies an alternate hostname which will be used when determining the origin IP address, instead of using the hostname specified in the URL. The Host header of the request will still match what is in the URL. Thus, resolveOverride allows a request to be sent to a different server than the URL / Host header specifies. However, resolveOverride will only take effect if both the URL host and the host specified by resolveOverride are within your zone. If either specifies a host from a different zone / domain, then the option will be ignored for security reasons. If you need to direct a request to a host outside your zone (while keeping the Host header pointing within your zone), first create a CNAME record within your zone pointing to the outside host, and then set resolveOverride to point at the CNAME record. Note that, for security reasons, it is not possible to set the Host header to specify a host outside of your zone unless the request is actually being sent to that host.
  • scrapeShield boolean optional


All properties of an incoming Request object (i.e. event.request) are read only. To modify a request, you must create a new Request object and pass the options to modify to its constructor.

  • body ReadableStream read-only

    • Stream of the body contents.
  • bodyUsed Boolean read-only

    • Declares whether the body has been used in a response yet.
  • cf IncomingRequestCfProperties read-only

    • An object containing properties about the incoming request provided by Cloudflare’s edge network.
  • headers Headers read-only

  • method string read-only

    • Contains the request’s method, e.g. GET, POST, etc.
  • redirect string read-only

    • Contains the mode for how redirects are handled. It may be one of follow, error, or manual.
  • url string read-only

    • Contains the URL of the request.


In addition to the properties on the standard Request object, the object on an inbound Request contains information about the request provided by Cloudflare’s edge.

All plans have access to:

  • asn string

    • ASN of the incoming request, e.g. 395747.
  • asOrganization string

    • The organisation which owns the ASN of the incoming request, e.g. Google Cloud.
  • botManagement Object | null

  • colo string

  • country string | null

    • Country of the incoming request. The two-letter country code in the request. This is the same value as that provided in the CF-IPCountry header, e.g. "US".
  • isEUCountry string | null

    • If the country of the incoming request is in the EU, this will return "1". Otherwise, this property will be omitted.
  • httpProtocol string

    • HTTP Protocol, e.g. "HTTP/2".
  • requestPriority string | null

    • The browser-requested prioritization information in the request object, e.g. "weight=192;exclusive=0;group=3;group-weight=127".
  • tlsCipher string

    • The cipher for the connection to Cloudflare, e.g. "AEAD-AES128-GCM-SHA256".
  • tlsClientAuth Object | null

    • Only set when using Cloudflare Access or API Shield (mTLS). Object with the following properties: certFingerprintSHA1, certFingerprintSHA256, certIssuerDN, certIssuerDNLegacy, certIssuerDNRFC2253, certIssuerSKI, certIssuerSerial, certNotAfter, certNotBefore, certPresented, certRevoked, certSKI, certSerial, certSubjectDN, certSubjectDNLegacy, certSubjectDNRFC2253, certVerified.
  • tlsVersion string

    • The TLS version of the connection to Cloudflare, e.g. TLSv1.3.
  • city string | null

    • City of the incoming request, e.g. "Austin".
  • continent string | null

    • Continent of the incoming request, e.g. "NA".
  • latitude string | null

    • Latitude of the incoming request, e.g. "30.27130".
  • longitude string | null

    • Longitude of the incoming request, e.g. "-97.74260".
  • postalCode string | null

    • Postal code of the incoming request, e.g. "78701".
  • metroCode string | null

    • Metro code (DMA) of the incoming request, e.g. "635".
  • region string | null

  • regionCode string | null

  • timezone string

    • Timezone of the incoming request, e.g. "America/Chicago".


Instance methods

These methods are only available on an instance of a Request object or through its prototype.

  • clone() Promise<Request>

    • Creates a copy of the Request object.
  • arrayBuffer() Promise<ArrayBuffer>

  • formData() Promise<FormData>

  • json() Promise<Object>

    • Returns a promise that resolves with a JSON representation of the request body.
  • text() Promise<string>

    • Returns a promise that resolves with a string (text) representation of the request body.

The request context

The Request context is the context of the "fetch" event callback. It is important to note that due to how workers are executed, asynchronous tasks (e.g. fetch) can only be run inside the request context.

The request context is available inside of the FetchEvent handler:

addEventListener("fetch", event => {
// Request context available here

When passing a promise to fetch event .respondWith()

If you pass a Response promise to the fetch event .respondWith() method, the request context is active during any asynchronous tasks which run before the Response promise has settled. You can pass the event to an async handler, for example:

addEventListener("fetch", event => {
// No request context available here
async function eventHandler(event){
// Request context available here
return new Response("Hello, Workers!")

Errors when attempting to access an inactive Request context

Any attempt to use APIs such as fetch() or access the Request context during script startup will throw an exception:

const promise = fetch("") // Error
async function eventHandler(event){..}

This code snippet will throw during script startup, and the "fetch" event listener will never be registered.

See also