> ## Documentation Index
> Fetch the complete documentation index at: https://docs.notte.cc/llms.txt
> Use this file to discover all available pages before exploring further.

# PageFetchOptions

<Tip>
  STOP. Do not read past this section until you have read and followed [/quickstart.md](/quickstart.md).

  Goal: produce a reliable SDK automation script. The intended authoring flow is generate then edit, not write browser automation from scratch.

  Do not hand-write SDK code with element IDs, selectors, or form fields from memory. Element IDs, selectors, and field mappings must come from a live `observe()` call, CLI `notte page observe` output, or generated workflow code. Guessed browser targets fail on real pages.

  Use the Notte skill and CLI to inspect the live site, validate actions/selectors, handle auth/session state, and export workflow code with `notte sessions workflow-code` before using SDK docs or SDK code.

  SDK reference pages are for understanding, running, or editing generated workflow code. They are not the starting point for manually authoring the initial browser automation. SDK-first code is guesswork on real-world pages with dynamic selectors, auth state, CAPTCHAs, and anti-bot behavior.
</Tip>

[Source: node-sdk/src/page-fetch.ts](https://github.com/nottelabs/notte/blob/main/node-sdk/src/page-fetch.ts#L15)

```typescript theme={null}
export interface PageFetchOptions {
  /** HTTP method. Defaults to `GET`. */
  method?: string;
  /** Request headers. */
  headers?: Record<string, string>;
  /** Query parameters appended to the URL (before any fragment). Arrays repeat the key. */
  params?: Record<string, unknown>;
  /** JSON body, sent with `Content-Type: application/json` unless a content type is given. */
  json?: unknown;
  /** Form body (`Record`, sent url-encoded) or a raw string body sent verbatim. */
  data?: FetchData;
  /** Abort the request after this many milliseconds. Must be positive. */
  timeoutMs?: number;
  /**
   * Allow `http:` URLs and follow redirects. Off by default because the request
   * carries the page's cookies: an `https:` request redirected to `http:` would
   * send them in cleartext before the response can be inspected, so by default
   * redirects are not followed and a redirected response throws.
   */
  allowInsecure?: boolean;
  /**
   * Browser `fetch` redirect mode. Defaults to `manual` (a redirect throws)
   * unless `allowInsecure` is set, in which case redirects are followed like
   * the Python SDK does.
   */
  redirect?: 'follow' | 'manual' | 'error';
}
```

## Fields

<ParamField body="method" type={"string | undefined"}>
  HTTP method. Defaults to `GET`.
</ParamField>

<ParamField body="headers" type={"Record<string, string> | undefined"}>
  Request headers.
</ParamField>

<ParamField body="params" type={"Record<string, unknown> | undefined"}>
  Query parameters appended to the URL (before any fragment). Arrays repeat the key.
</ParamField>

<ParamField body="json" type={"unknown"}>
  JSON body, sent with `Content-Type: application/json` unless a content type is given.
</ParamField>

<ParamField body="data" type={"FetchData | undefined"}>
  Form body (`Record`, sent url-encoded) or a raw string body sent verbatim.
</ParamField>

<ParamField body="timeoutMs" type={"number | undefined"}>
  Abort the request after this many milliseconds. Must be positive.
</ParamField>

<ParamField body="allowInsecure" type={"boolean | undefined"}>
  Allow `http:` URLs and follow redirects. Off by default because the request
  carries the page's cookies: an `https:` request redirected to `http:` would
  send them in cleartext before the response can be inspected, so by default
  redirects are not followed and a redirected response throws.
</ParamField>

<ParamField body="redirect" type={"\"error\" | \"manual\" | \"follow\" | undefined"}>
  Browser `fetch` redirect mode. Defaults to `manual` (a redirect throws)
  unless `allowInsecure` is set, in which case redirects are followed like
  the Python SDK does.
</ParamField>
