The One Thing Most Notte Proxy Guides Get Wrong
Notte is a browser platform for AI agents — you open a managed cloud session, then run an agent (Notte's own or your framework) on top of it. Most proxy guides stop at its built-in residential proxy (proxies=True) and never show the setup people actually search for: attaching your own proxy so the session egresses through an IP you control.
That is the thing they get wrong. There are two different proxy concepts on a Notte session:
proxies=True— routes through Notte's own managed residential proxy (best-effort US-based). You don't pick the IP.proxies=[ExternalProxy(...)]— routes through a proxy you supply. You pick the IP.
This guide is the second one: bring-your-own proxy, using your German mobile endpoint. The built-in default is best-effort US-based, so if you need a German IP specifically, an ExternalProxy is the way to get one. You get a real German mobile IP on a managed cloud browser, without running the browser yourself — and without the rotating-pool machinery, because a dedicated endpoint rotates on demand at the proxy, not per request in code.
Before You Start
You need four values from your GermanProxy.io account:
- Host and port of your endpoint
- Username and password
You'll also need a Notte API key and the Python SDK:
pip install notte-sdk
The examples use PROXY_HOST, PORT, USER and PASS as placeholders — replace them with your own. A single dedicated endpoint is enough; you do not need a rotating pool for a session. ExternalProxy takes an HTTP(S) server, so use your HTTP endpoint, which is the simplest credentialed path. New to routing an agent through a proxy at all? Start with the broader AI browser-agents guide.
Step 1 — Open a Session With Your External Proxy
Build an ExternalProxy carrying your German mobile endpoint and pass it in the proxies list to client.Session. This is the BYO-proxy path — not proxies=True, which would use Notte's built-in US-based residential proxy instead of your IP:
from notte_sdk import NotteClient
from notte_sdk.types import ExternalProxy, NotteProxy
client = NotteClient()
proxy = ExternalProxy(
server="http://PROXY_HOST:PORT",
username="USER",
password="PASS",
)
proxies: list[NotteProxy | ExternalProxy] = [proxy]
with client.Session(proxies=proxies) as session:
# everything on this session egresses through your German mobile endpoint
...
Notte validates the proxy connection at session-creation time, so if the host, port or credentials are wrong you get an error here rather than a silent fallback to another IP. The ExternalProxy server is an HTTP(S) value with the scheme, and credentials go in username / password.
Step 2 — Verify the IP Before You Scale
Confirm the session is actually on a German mobile IP before you build anything on top of it. Have the session open an IP-echo endpoint and read the result — the exact call depends on how you drive the session (Notte agent step, or a CDP-attached driver), but the check is the same: fetch https://api.ipify.org?format=json through the session and inspect the returned address.
with client.Session(proxies=proxies) as session:
# drive the session to load the IP-echo page, then read the body:
# it should return a German mobile IP, not your own or a datacenter one
...
If it returns a datacenter address or your own, re-check the server, username and password on the ExternalProxy — a session opened with proxies=True (or none) would run on Notte's built-in IP, not yours. For a fuller checklist, see testing your proxy setup.
Step 3 — Check for WebRTC and DNS Leaks
A cloud browser routes HTTP through your proxy, but Chromium has two side channels that can expose the underlying address:
- WebRTC can surface an IP via ICE candidates outside the proxy tunnel — see what a WebRTC leak is.
- DNS can resolve names outside the tunnel, so the target sees a different resolver — see what a DNS leak is.
A real German mobile IP only helps if nothing else leaks past it. Verify both before you turn a single session into a fleet.
Sticky Sessions vs. Rotation
With a dedicated German endpoint you control the IP at the proxy, not in your code:
- Sticky session: one Notte session on your endpoint keeps the same German mobile IP across a multi-step task — that IP stability is what stops the target re-challenging the browser on every action.
- Rotation on demand: when you want a fresh IP, trigger rotation at the proxy and open a new session. There's no per-request IP pool to manage.
This is why a dedicated endpoint keeps the code small: no rotation list, no health-checking, no retry-on-dead-IP loop. See sticky sessions and IP rotation explained and dedicated vs shared mobile proxy.
Note the data budget: a cloud browser loads full pages with images and scripts, and a single session rendering rich pages can move several hundred MB an hour. A GermanProxy.io endpoint comes with a fair-use allowance of 20 GB/day, so size your concurrency to that rather than assuming headroom that isn't promised. We do not advertise "unlimited" traffic, because fair-use limits apply in practice and honesty is the point.
Why a Mobile IP for Notte at All
A Notte session is a Chromium instance making many dependent requests as an agent works through a task, and the egress IP decides how the target treats it. Datacenter ranges — including many cloud-browser IPs — are widely distrusted, so even a well-behaved agent can hit friction. Attaching a real German mobile IP as an external proxy rides on carrier-grade NAT (CGNAT), the same shared-IP space thousands of ordinary phone users sit behind, which is why it tends to carry higher IP reputation on German platforms.
For the trade-offs against other IP types, see mobile vs residential vs datacenter proxy and what is a mobile proxy.
Scrape Responsibly
A mobile proxy improves reliability for authorized automation — it is not a tool to defeat access controls, anti-bot systems, or platform rules, and we don't position it as an "undetectable" agent. Keep your Notte sessions clean and defensible:
- Respect each site's terms and its
robots.txt; collect only public data you're permitted to use. Web scraping for public data is generally lawful in the EU, but context matters — see is web scraping legal in the EU. - Throttle with human-reasonable delays between agent actions so you don't overload a target server.
- Collect only what you need, and handle any personal data in line with the GDPR.
- Be honest about who you are — don't impersonate a service or misuse a target's security mechanisms.
[!IMPORTANT]
GermanProxy.io is an EU-based provider with a full imprint, clear acceptable-use rules, and a real abuse-reporting process. The service is IT routing — a host, port and credentials — not hardware you operate, and not framed as anonymity. Whether mobile proxies are lawful to use: are mobile proxies legal.
FAQ
How do I add a custom proxy to a Notte session?
Build an ExternalProxy(server="http://PROXY_HOST:PORT", username="USER", password="PASS") and pass it in the proxies list to client.Session(proxies=[proxy]). The session then egresses through your German mobile endpoint instead of Notte's built-in proxy.
What's the difference between ExternalProxy and Notte's built-in proxies?
proxies=True activates Notte's own managed residential proxy (best-effort US-based). An ExternalProxy routes the session through a proxy you supply — your German mobile endpoint — so you control the outbound IP and its location.
Which SDK does Notte use for a custom proxy?
Notte's session SDK is Python. Import NotteClient and ExternalProxy from notte_sdk, then open a session with client.Session(proxies=[proxy]) as a context manager. The proxy is validated at session-creation time.
Which proxy schemes does Notte accept for a custom proxy?
ExternalProxy takes an HTTP or HTTPS server value, e.g. "http://PROXY_HOST:PORT", plus username and password. Your GermanProxy.io endpoint gives you an HTTP endpoint (alongside SOCKS5 and OpenVPN), which is the simplest credentialed path here. Background: SOCKS5 vs HTTP proxy.
Should I check for WebRTC and DNS leaks on Notte?
Yes. A cloud browser can still expose the underlying address through WebRTC or resolve DNS outside the tunnel — see what a WebRTC leak is and what a DNS leak is. Have the session open an IP-echo page to confirm a German mobile IP, then run a leak test before you rely on the setup.
Do I need a rotating pool for Notte sessions?
No. A single dedicated German mobile endpoint is usually the better fit. A stateful, multi-step session needs a stable IP (sticky session) so it is not re-challenged on every action; rotate on demand at the proxy between tasks, not mid-task. See sticky sessions and IP rotation explained.
Related guides
- Skyvern Proxy Setup: Route Agents via German Mobile IPs
- Stagehand Proxy Setup: Route via German Mobile IPs
- Browser Use Proxy: Route AI Browser Agents via Mobile IPs
CTA
Run your Notte sessions on real German mobile IPs. Get your German mobile endpoint — HTTP/SOCKS5/OpenVPN, sticky sessions, on-demand rotation, fair-use 20 GB/day, from a transparent EU provider. Browse the plans to get started. New to the topic? Start with the AI-agents use case or what is a mobile proxy.
Get a German mobile proxy: Real 4G/5G IPs from Germany, fair-use 20 GB/day — browse German mobile proxy plans or start small with a shared 5G proxy.