Proxy HTTP requests using fetch()

In Bun, fetch supports sending requests through an HTTP or HTTPS proxy. Use it on corporate networks or when a request must come from a specific IP address.

proxy.ts
await fetch("https://example.com", {
  // The URL of the proxy server
  proxy: "https://username:password@proxy.example.com:8080",
});

The proxy option can be a URL string, a URL instance, or an object with url (a string or a URL) and optional headers. The URL can include the username and password if the proxy requires authentication. It can be http:// or https://.


Custom proxy headers#

To send custom headers to the proxy server (for proxy authentication tokens or custom routing), use the object format:

proxy-headers.ts
await fetch("https://example.com", {
  proxy: {
    url: "https://proxy.example.com:8080",
    headers: {
      "Proxy-Authorization": "Bearer my-token",
      "X-Proxy-Region": "us-east-1",
    },
  },
});

The headers property accepts a plain object or a Headers instance. Bun sends these headers directly to the proxy server in CONNECT requests (for HTTPS targets) or in the proxy request (for HTTP targets).

If you provide a Proxy-Authorization header, it overrides any credentials in the proxy URL.


Environment variables#

To use the same proxy for all requests, set the $HTTP_PROXY and $HTTPS_PROXY environment variables to the proxy URL. Bun uses $HTTP_PROXY only for requests to http:// URLs and $HTTPS_PROXY only for requests to https:// URLs, so set both to proxy every request.

terminal
HTTP_PROXY=https://username:password@proxy.example.com:8080 HTTPS_PROXY=https://username:password@proxy.example.com:8080 bun run index.ts