rq.request object provides access to all details of the API request in your Requestly scripts. Read these properties in both pre-request and post-response scripts. In a pre-request script you can also modify the request that is sent: headers, query parameters, the URL, the method, and the body are all writable (in a post-response script the request has already been sent, so writes have no effect on the wire).
Properties and Methods
rq.request.method
The HTTP method of the request (e.g. GET, POST, PUT, OPTIONS, DELETE, PATCH, HEAD). Writable from a pre-request script: the value is uppercased on write (rq.request.method = 'post' sends POST), and it must be one of the methods above. Anything else is dropped with a console warning instead of being sent.
Example:
rq.request.headers
An object that holds the request headers. Read them with rq.request.headers.get(name), rq.request.headers.has(name), or rq.request.headers.all(), which returns a plain { name: value } object. JSON.stringify(rq.request.headers) returns {} because the object exposes only methods (which JSON.stringify omits), so use .all() when you want to serialize the headers.
Example:
rq.request.headers.add(header)
Adds a header. If a header with the same name already exists, this adds a second one (it does not replace the existing header).
Parameters:
header(object or string):{ key, value }, or a raw"Key: value"string (parsed at the first:, both sides trimmed). These are the same inputs Postman’sHeaderaccepts. A header added withdisabled: trueis readable on the request but is not sent.
rq.request.headers.upsert(header)
Adds a header, or replaces it if a header with the same name already exists. Header names are matched case-insensitively.
Parameters:
header(object):{ key, value }- the header name and value.
rq.request.headers.remove(name)
Removes every header with the given name (case-insensitive).
Parameters:
name(string): The header name to remove.
rq.request.headers.clear()
Removes all request headers.
Parameters: none. Any argument passed is ignored. clear() always removes every header, so to remove a single header use remove(name) instead.
Example:
The same operations are available directly on
rq.request, with Postman’s exact signatures, including Postman’s case-sensitivity split, which differs from the headers.* methods above:rq.request.addHeader(header)- same inputs asheaders.add(object or"Key: value"string).rq.request.removeHeader(toRemove, options?)- a header name string or a{ key }object. Matches case-sensitively by default; pass{ ignoreCase: true }for a case-insensitive match. (headers.remove(name)is always case-insensitive.)rq.request.upsertHeader(header)- requires a truthykey(returns silently otherwise) and matches case-sensitively: a differently-cased key adds a second header instead of replacing. (headers.upsertmatches case-insensitively.)
rq.request.body
The request body, as Postman’s RequestBody object: { mode, raw, urlencoded, formdata, graphql, options, disabled }. It is undefined when the request has no body. It still reads as a string wherever JavaScript coerces: `${rq.request.body}`, String(rq.request.body), and JSON.parse(rq.request.body) all see the raw text. But it is an object, so string methods need rq.request.body.toString() first (the same one-line edit rq.request.url needed).
Writable from a pre-request script. Whatever your script writes is sent exactly as written, byte for byte, with no variable resolution applied to it. That is what makes signing flows correct:
mode: 'file' is not supported: a script cannot choose local files to upload; the call is refused with a console warning and the body is left unchanged. On a body-less request rq.request.body is undefined, but assignment still works and creates the body.
Example (reading):
rq.request.url
The request URL as a Url object, the same shape as Postman’s pm.request.url. It converts to a string wherever one is expected ("Sending to " + rq.request.url, `${rq.request.url}`, new URL(String(rq.request.url))), and exposes the URL’s parts:
Example:
rq.request.url.query is a list of query parameters with the same API as Postman’s:
- Read:
get(name),has(name),one(name),count(),idx(i),indexOf(...),all(),each(fn),map(fn),filter(fn),find(fn),reduce(fn, initial),toString().toObject()returns{ name: value }; a repeated name becomes an array of values. - Change:
add(param),insert(param, before),insertAfter(param, after),prepend(param),append(param),upsert(param),remove(name | fn),clear(),populate(list),repopulate(list),assimilate(list, prune). A param is{ key, value }or a"key=value"string.rq.request.url.addQueryParams(...)andremoveQueryParams(...)do the same in bulk.
rq.request.url.variables is the list of the request’s path variables (:id in the URL) with the same list API, plus replace("{{id}}"), substitute(object), syncFromObject(object), syncToObject().
You can also edit the URL parts directly: rq.request.url.path.push("v2"), rq.request.url.host = ["api", "example", "com"], rq.request.url.port = "8443", or rq.request.url.update("https://...") to replace the whole URL.
In a pre-request script every one of these changes applies to the request that is sent, as in Postman. In a post-response script the request has already been sent.
JSON.stringify(rq.request.url) returns the URL’s parts, the same shape Postman uses: { protocol, host: [...], port, path: [...], hash, query: [{ key, value }], variable: [...] }. Use rq.request.url.toString() when you want the URL as a string.
rq.request.url is an object, not a string, exactly as in Postman. typeof rq.request.url is "object", a strict comparison such as rq.request.url === "https://..." is false, and string methods like .split() or .includes() are not available on it. Call rq.request.url.toString() first: rq.request.url.toString().split("?"), rq.expect(rq.request.url.toString()).to.equal(...). Scripts written before this change that called a string method directly on rq.request.url need that one edit.rq.request.queryParams
A read-only object mapping each query parameter name to its value ({ name: value }). Iterate it with Object.entries().
Example:

