Skip to content
Every plan

Request security: one isolated browser per request

Every API call gets its own incognito browser context — created for that request, destroyed when it finishes. No cookies, caches, or profiles are ever shared between requests, and every URL is screened against reserved IP ranges before and during rendering, so a request can never reach a private network.

URLs are untrusted input

A cloud browser is a security boundary

When you send a URL to a browser API, that page runs real JavaScript inside a real Chromium on someone else’s infrastructure. It can redirect, load subresources, open WebSockets — everything any web page can do. Which makes every request a set of questions worth asking about what that page can reach:

other tenantsinternal networkscloud metadataleftover state

Microlink’s answer is structural: the blast radius of a request is the request itself. Isolation and network screening are enforced inside the rendering engine on every request — not by policy, not by plan tier.

Every request, contained
isolation · every request
Other requests
separate browser contexts — nothing shared
Private networks
reserved IP ranges blocked at fetch and render
Your request
its own incognito browser, destroyed at the end
One request, one browser

Request isolation by construction

Isolation is not a setting you enable — it is how the engine allocates browsers. Every request gets a context that exists only for that request, and the engine tears it down the moment the request ends, whichever way it ends.

01 · allocation
One browser context per request
Each request is assigned its own browser context, keyed by its request identifier. The context is created when the request starts and is never handed to another request — there is no sharing model to configure and no sharing model to get wrong.
dedicated contextkeyed by request id
02 · state
Incognito, always
Every context is incognito. Cookies, local storage, caches, and profile state live and die with the request that created them. Nothing a page sets during one render is visible to any other render — yours or anyone else’s.
cookieslocalStoragecacheprofilesessions
03 · teardown
Destroyed, not recycled
When the request finishes — success, timeout, or client disconnect — its context is destroyed. A per-session watchdog force-closes anything that outlives its deadline, so state cannot linger even when a render goes sideways.
on completionon timeouton disconnect
Server-side request forgery

SSRF protection at two layers

Checking the input URL once is not enough — a page can redirect or load resources into places its URL never mentioned. Microlink validates the destination before the fetch and keeps validating while the page renders.

01 · before the fetch
Resolved before it’s fetched
The hostname is resolved via DNS and its IP address is checked against reserved ranges. Anything that does not resolve to a public unicast address — loopback, private networks, link-local, cloud metadata endpoints — is refused with EFORBIDDENURL before a single byte is fetched. HTTP redirects are re-checked hop by hop, so a URL cannot 302 its way into an internal address.
127.0.0.110.0.0.0/8172.16.0.0/12192.168.0.0/16169.254.169.254
02 · during rendering
Enforced while it renders
A Chromium request interceptor validates every origin the page touches while it renders. If the page navigates or is redirected into a reserved range mid-render, the request is aborted on the spot — the same guarantee holds for what the page does, not just for the URL you sent.
redirectssubresourcesin-page navigations
Untrusted code, contained

Sandboxed execution with hard ceilings

The function parameter runs your JavaScript against the live page — inside a VM with an execution timeout and a memory ceiling. On the free plan, code size is capped and cross-origin fetch, xhr, and websocket calls are blocked, so anonymous code cannot use the platform as an egress proxy.

execution timeoutmemory ceilingcode size capcross-origin egress blocked

The same discipline applies to every request, code or no code: hard time limits and concurrency caps mean one heavy render can never starve another customer’s traffic, and anonymous traffic is rate-limited per client IP.

Secrets & privacy

Your secrets stay secret

Credentials never reach the logs. x-api-key and authorization values are redacted before anything is written, and every forwarded x-api-header-* secret is masked the same way.

Cached responses cannot cross credential boundaries either: cache keys are SHA-512 hashes that incorporate the headers a request was made with, so a page fetched with your session cookie is never served to a request without it. Cache lifetime is under your control, from 1 minute to 31 days.

On the way out, every request carries sec-gpc: 1 and dnt: 1, forwarding Global Privacy Control and Do-Not-Track signals to the sites being rendered. For the compliance side — GDPR, data processing, subprocessors — see our security practices, DPA, and privacy policy.

Beyond shared infrastructure

Enterprise: isolation down to the hardware

Everything above is the default on the public API. Microlink Enterprise moves the boundary one level down: your own API endpoint running on hardware that serves only you, backed by a dedicated pool of always-ready browsers. No shared capacity, no noisy neighbors — and you choose which of 8 locations the hardware lives in.

dedicated endpointisolated browser pool8 regions99.9% uptime SLAGDPR-compliant DPA

The data terms are just as explicit: your content is never used to train or fine-tune AI models, you own what you process, and we delete it within 60 days of your request — all backed by a GDPR-compliant Data Processing Agreement ready for your legal team.

Isolated by default, dedicated when you need it.

Every plan runs on the same isolation model — one incognito browser per request, SSRF screening on every URL. When your compliance team needs physical separation, Enterprise puts the whole API on your own hardware. Read our security practices for the full picture.

Does every request really get its own browser?

Yes. Each request is assigned its own incognito browser context, created when the request starts and destroyed when it finishes — on success, timeout, or client disconnect.
Contexts are never shared or reused across requests, so cookies, caches, profiles, and session state cannot leak between them.
At two layers. Before the fetch, the hostname is resolved via DNS and refused with EFORBIDDENURL if it points at a reserved range — loopback, private networks, link-local, or cloud metadata endpoints — with redirects re-checked hop by hop.
During rendering, a Chromium request interceptor validates every origin the page touches and aborts the request if it navigates into a reserved range mid-render.

Are cookies, cache, or sessions shared between requests?

No. All browser state lives inside the request’s own incognito context and is destroyed with it.
Cached API responses are keyed by SHA-512 hashes that incorporate the headers a request was made with, so a response fetched with your credentials is never served to a request without them.

What limits apply to user-supplied code?

Code passed through the function parameter runs inside a VM with an execution timeout and a memory ceiling. On the free plan, code size is capped and cross-origin fetch, xhr, and websocket calls are blocked.
Every request, with or without code, is subject to hard time limits and concurrency caps — see browser functions for the full execution model.

What additional security does Enterprise provide?

Microlink Enterprise runs the full API on hardware that serves only you: a dedicated endpoint backed by an isolated pool of always-ready browsers, deployable in 8 locations, with a 99.9% uptime SLA.
Your content is never used to train AI models, and it is deleted within 60 days of your request — backed by a GDPR-compliant Data Processing Agreement.

Where can I read about compliance and data processing?

The security practices page covers infrastructure security, encryption, monitoring, and GDPR compliance. The Data Processing Agreement, subprocessors list, and privacy policy cover the legal side.
For vulnerability reports, email with the subject “Security Inquiry”.